@@ -48,20 +48,18 @@ extern "C"
4848 FC_PORT_DIR_READ = FC_PORT_DIR_OUT , // 从缓冲区读数据
4949 } fc_port_dir_t ;
5050
51- typedef size_t (* fc_phy_io_t )(size_t rb_index , void * buf , size_t len ); // 返回值仅做保留
51+ typedef size_t (* fc_phy_io_t )(size_t rb_index , void * buf , size_t len ); // 返回值仅做保留,回调时保证从buf地址开始len长度一定是连续内存
5252
5353 typedef struct _fc_port_t fc_port_t ;
5454 struct _fc_port_t
5555 {
56- fc_fifo_t * rb [PORT_RB_NUM ]; // 环形缓冲
57- const char * rb_name [PORT_RB_NUM ]; // 每个rb缓冲区的名字
58- fc_phy_io_t phy ; // 物理IO接口
59-
6056 // void *user; // 自定义数据
57+ fc_fifo_t * rb [PORT_RB_NUM ]; // 环形缓冲
58+ const char * rb_name [PORT_RB_NUM ]; // 每个rb缓冲区的名字
59+ fc_phy_io_t phy ; // 物理IO接口
60+ uint8_t rb_single_limit [PORT_RB_NUM ]; // 单次读写限制(针对慢速IO而言),限制大小为缓冲区空间的1/(2^n),n=rb_single_limit
6161
62- uint8_t dir ; // 方向,用uint8_t而不是枚举(fc_port_dir_t)是为了明确空间大小
63- uint8_t single_max_shift ; // 单次读写限制(针对慢速IO而言),限制大小为缓冲区空间的1/(2^n)
64- uint8_t trigger_serial ; // 连续触发
62+ uint8_t dir ; // 方向,用uint8_t而不是枚举(fc_port_dir_t)是为了明确空间大小
6563 };
6664
6765 typedef struct _fc_port_rtt_t fc_port_rtt_t ;
@@ -78,36 +76,42 @@ extern "C"
7876
7977 //+********************************* 面向对象 **********************************/
8078 // clang-format off
81-
82- // 给环形缓冲区指针分配静态内存
83- #define fc_port_static_alloc_rb (port , rb_index , log2_size , name ) \
84- fc_fifo_static_new_at((port)->rb[rb_index], log2_size); \
85- (port)->rb_name[rb_index] = name
79+ extern void fc_port_init (fc_port_t * port , fc_port_dir_t dir );
80+ extern void fc_port_catch_fifo (fc_port_t * port , size_t rb_index , fc_fifo_t * fifo , const char * name , uint8_t single_limit );
81+
82+ // 静态内存初始化一个port的环形缓冲区,包括静态内存分配构造,单次读写限制设置等
83+ #define fc_port_static_alloc_rb (port , rb_index , log2_size , name , single_limit ) \
84+ do \
85+ { \
86+ fc_fifo_t *__temp_fifo_ptr = NULL; \
87+ fc_fifo_static_new_at(__temp_fifo_ptr, log2_size); \
88+ fc_port_catch_fifo((port), (rb_index), __temp_fifo_ptr, (name), (single_limit)); \
89+ } while (0)
8690
8791 extern int fc_port_putc (fc_port_t * port , size_t rb_index , int ch );
8892 extern int fc_port_puts (fc_port_t * port , size_t rb_index , const char * str );
8993 extern int fc_port_write (fc_port_t * port , size_t rb_index , const void * buf , size_t len );
9094 extern int fc_port_printf (fc_port_t * port , size_t rb_index , const char * fmt , ...);
9195 extern int fc_port_vprintf (fc_port_t * port , size_t rb_index , const char * fmt , va_list arp ); // fc_port_printf核心实现
9296
93- extern int fc_port_getc (fc_port_t * port , size_t rb_index ); // 阻塞式API,非线程安全
97+ extern int fc_port_getc (fc_port_t * port , size_t rb_index ); // 阻塞式API
9498 extern char * fc_port_gets (fc_port_t * port , size_t rb_index , char * buf , size_t n ); // 不建议使用
9599 extern int fc_port_read (fc_port_t * port , size_t rb_index , void * buf , size_t len ); // 读取数据并删除
96100 extern int fc_port_peek (fc_port_t * port , size_t rb_index , void * buf , size_t len ); // 读取数据但不删除
97101
98- extern int fc_port_available (fc_port_t * port , size_t rb_index ); // 获取指定缓冲区的已用空间大小
99- extern int fc_port_free (fc_port_t * port , size_t rb_index ); // 获取指定缓冲区的剩余空间大小
100- // 以下API的行为取决于fc_port_t的方向(fc_port_dir_t)
101- extern void fc_port_trigger (fc_port_t * port , size_t rb_index ); // 触发慢速IO
102- extern void fc_port_end (fc_port_t * port , size_t rb_index , int size ); // 慢速IO完成回调
102+ extern int fc_port_used (fc_port_t * port , size_t rb_index ); // 获取指定缓冲区的已用空间大小
103+ extern int fc_port_free (fc_port_t * port , size_t rb_index ); // 获取指定缓冲区的剩余空间大小
104+ // 以下API的行为取决于port的方向port->dir
105+ extern void fc_port_trigger (fc_port_t * port , size_t rb_index ); // 触发慢速IO
106+ extern void fc_port_end (fc_port_t * port , size_t rb_index , int size ); // 慢速IO完成回调
103107
104108 // clang-format on
105109
106110 //+********************************* 提供一份格式化输出到fifo的API **********************************/
107111
108112 // 这两个API使用都需要自行保证fifo的写操作线程安全
109113 extern int fc_fifo_printf (fc_fifo_t * fifo , const char * fmt , ...);
110- extern int fc_fifo_vprintf (fc_fifo_t * fifo , const char * fmt , va_list arp ); // fc_fifo_printf核心实现,在fc_port_vprintf .c中实现
114+ extern int fc_fifo_vprintf (fc_fifo_t * fifo , const char * fmt , va_list arp ); // fc_fifo_printf核心实现,在utils/fc_fifo_vprintf .c中实现
111115
112116 //+********************************* 默认实例化对象 **********************************/
113117 // 初始化标准输入输出
@@ -145,10 +149,10 @@ extern "C"
145149 #define fc_printf (fmt , ...) fc_port_printf (FC_STDOUT_OBJ, FC_STDOUT_RB_INDEX, fmt, ##__VA_ARGS__)
146150 #define fc_vprintf (fmt , arp ) fc_port_vprintf(FC_STDOUT_OBJ, FC_STDOUT_RB_INDEX, fmt, arp)
147151
148- #define fc_out_trigger () fc_port_trigger (FC_STDOUT_OBJ, FC_STDOUT_RB_INDEX) // 触发发送
149- #define fc_out_end (size ) fc_port_end (FC_STDOUT_OBJ, FC_STDOUT_RB_INDEX, size) // 发送完成处理
150- #define fc_out_available () fc_port_available (FC_STDOUT_OBJ, FC_STDOUT_RB_INDEX) // 缓冲区可用字节数
151- #define fc_out_free () fc_port_free (FC_STDOUT_OBJ, FC_STDOUT_RB_INDEX) // 缓冲区剩余空间
152+ #define fc_out_trigger () fc_port_trigger (FC_STDOUT_OBJ, FC_STDOUT_RB_INDEX) // 触发发送
153+ #define fc_out_end (size ) fc_port_end (FC_STDOUT_OBJ, FC_STDOUT_RB_INDEX, size) // 发送完成处理
154+ #define fc_out_used () fc_port_used (FC_STDOUT_OBJ, FC_STDOUT_RB_INDEX) // 缓冲区已用空间
155+ #define fc_out_free () fc_port_free (FC_STDOUT_OBJ, FC_STDOUT_RB_INDEX) // 缓冲区剩余空间
152156
153157 /*----------------------------------------------*/
154158 /* Formatted string output */
@@ -176,15 +180,15 @@ extern "C"
176180 */
177181
178182 // stdin
179- #define fc_getchar () fc_port_getc(FC_STDIN_OBJ, FC_STDIN_RB_INDEX) // 阻塞式API,非线程安全
180- #define fc_getc () fc_port_getc(FC_STDIN_OBJ, FC_STDIN_RB_INDEX) // 阻塞式API,非线程安全
183+ #define fc_getchar () fc_port_getc(FC_STDIN_OBJ, FC_STDIN_RB_INDEX) // 阻塞式API
184+ #define fc_getc () fc_port_getc(FC_STDIN_OBJ, FC_STDIN_RB_INDEX) // 阻塞式API
181185 #define fc_gets (buf , n ) fc_port_gets(FC_STDIN_OBJ, FC_STDIN_RB_INDEX, buf, n) // 不建议使用
182- #define fc_read (buf , len ) fc_port_read(FC_STDIN_OBJ, FC_STDIN_RB_INDEX, buf, len) // 阻塞式API,非线程安全
186+ #define fc_read (buf , len ) fc_port_read(FC_STDIN_OBJ, FC_STDIN_RB_INDEX, buf, len) // 阻塞式API
183187
184- #define fc_in_trigger () fc_port_trigger (FC_STDIN_OBJ, FC_STDIN_RB_INDEX) // 触发接收
185- #define fc_in_end (size ) fc_port_end (FC_STDIN_OBJ, FC_STDIN_RB_INDEX, size) // 接收完成处理
186- #define fc_in_available () fc_port_available (FC_STDIN_OBJ, FC_STDIN_RB_INDEX) // 缓冲区可用字节数
187- #define fc_in_free () fc_port_free (FC_STDIN_OBJ, FC_STDIN_RB_INDEX) // 缓冲区剩余空间
188+ #define fc_in_trigger () fc_port_trigger (FC_STDIN_OBJ, FC_STDIN_RB_INDEX) // 触发接收
189+ #define fc_in_end (size ) fc_port_end (FC_STDIN_OBJ, FC_STDIN_RB_INDEX, size) // 接收完成处理
190+ #define fc_in_used () fc_port_used (FC_STDIN_OBJ, FC_STDIN_RB_INDEX) // 缓冲区已用空间
191+ #define fc_in_free () fc_port_free (FC_STDIN_OBJ, FC_STDIN_RB_INDEX) // 缓冲区剩余空间
188192
189193 // clang-format on
190194
0 commit comments