3636 #define fc_assert (x ) ((void)(0))
3737#endif
3838
39- #ifndef FIFO_TX_LOG2_SIZE
39+ #ifndef STDOUT_RB0_LOG2_SIZE
4040 /* 输出环形队列大小,2^n */
4141 // 4K Byte
42- #define FIFO_TX_LOG2_SIZE 12
42+ #define STDOUT_RB0_LOG2_SIZE 12
4343#endif
4444
45- #ifndef STDOUT_TX_SINGLE_MAX_SHIFT
45+ #ifndef STDOUT_RB0_TX_SINGLE_MAX_SHIFT
4646 // 单次发送最大字节数为缓冲区的1/(2^n),多段发送可以尽快空出部分缓冲区
47- #define STDOUT_TX_SINGLE_MAX_SHIFT 2
47+ #define STDOUT_RB0_TX_SINGLE_MAX_SHIFT 2
4848#endif
4949
50- // 连续发送
51- #ifndef PHY_SERIAL_TX_ENABLE
52- #define PHY_SERIAL_TX_ENABLE 0
53- #endif
54-
55- #ifndef FIFO_RX_LOG2_SIZE
50+ #ifndef STDIN_RB0_LOG2_SIZE
5651 /* 输入环形队列大小,2^n */
5752 // 256 Byte
58- #define FIFO_RX_LOG2_SIZE 8
53+ #define STDIN_RB0_LOG2_SIZE 8
5954#endif
6055
61- #ifndef STDIN_RX_SINGLE_MAX_SHIFT
56+ #ifndef STDIN_RB0_RX_SINGLE_MAX_SHIFT
6257 // 单次接收最大字节数为缓冲区的1/(2^n),多段接收可以防止连续接收满了之后来不及处理
63- #define STDIN_RX_SINGLE_MAX_SHIFT 1
64- #endif
65-
66- // 连续接收
67- #ifndef PHY_SERIAL_RX_ENABLE
68- #define PHY_SERIAL_RX_ENABLE 0
58+ #define STDIN_RB0_RX_SINGLE_MAX_SHIFT 1
6959#endif
7060
7161//+********************************* 提供的默认数据丢失处理钩子函数 **********************************/
@@ -111,6 +101,39 @@ fc_weak size_t fc_port_lose_hook(fc_port_t *port, size_t rb_index, const void *b
111101}
112102
113103//+********************************* 面向对象 **********************************/
104+ /**
105+ * @brief 初始化port,其实就是设置方向
106+ *
107+ * @param port
108+ * @param dir
109+ */
110+ void fc_port_init (fc_port_t * port , fc_port_dir_t dir )
111+ {
112+ fc_assert (port != NULL );
113+ memset (port , 0 , sizeof (fc_port_t ));
114+ port -> dir = (uint8_t )dir ;
115+ }
116+
117+ /**
118+ * @brief port绑定环形缓冲区
119+ *
120+ * @param port
121+ * @param rb_index 环形缓冲区索引
122+ * @param fifo 环形缓冲区指针
123+ * @param name 缓冲区名字
124+ * @param single_limit 单次读写限制(针对慢速IO而言),限制大小为缓冲区空间的1/(2^n),n=single_limit
125+ */
126+ void fc_port_catch_fifo (fc_port_t * port , size_t rb_index , fc_fifo_t * fifo , const char * name , uint8_t single_limit )
127+ {
128+ fc_assert (port != NULL );
129+ fc_assert (rb_index < PORT_RB_NUM );
130+ fc_assert (fifo != NULL );
131+
132+ port -> rb [rb_index ] = fifo ;
133+ port -> rb_name [rb_index ] = name ;
134+ port -> rb_single_limit [rb_index ] = single_limit ;
135+ }
136+
114137/**
115138 * @brief
116139 *
@@ -229,13 +252,26 @@ int fc_port_printf(fc_port_t *port, size_t rb_index, const char *fmt, ...)
229252
230253 FC_PORT_LOCK (port , rb_index , FC_PORT_DIR_WRITE );
231254 ret = fc_fifo_vprintf (fifo , fmt , arp );
232- FC_PORT_LOCK (port , rb_index , FC_PORT_DIR_WRITE );
255+ FC_PORT_UNLOCK (port , rb_index , FC_PORT_DIR_WRITE );
233256
234257 va_end (arp );
235258
236259 return ret ;
237260}
238261
262+ /**
263+ * @brief fc_port_vprintf的核心实现,将格式化字符串写入到fc_port_t的环形缓冲区中
264+ *
265+ * @param port
266+ * @param fmt
267+ * @param arp
268+ * @return int
269+ */
270+ int fc_port_vprintf (fc_port_t * port , size_t rb_index , const char * fmt , va_list arp )
271+ {
272+ return fc_fifo_vprintf (port -> rb [rb_index ], fmt , arp );
273+ }
274+
239275/**
240276 * @brief
241277 *
@@ -255,11 +291,7 @@ int fc_port_getc(fc_port_t *port, size_t rb_index)
255291
256292 while (1 != fc_fifo_read (fifo , (void * )& ch , 1 ))
257293 {
258- FC_PORT_UNLOCK (port , rb_index , FC_PORT_DIR_READ ); // 释放锁
259-
260294 FC_WAIT_MOMENT ();
261-
262- FC_PORT_LOCK (port , rb_index , FC_PORT_DIR_READ ); // 重新获取锁
263295 }
264296
265297 FC_PORT_UNLOCK (port , rb_index , FC_PORT_DIR_READ );
@@ -375,10 +407,10 @@ void fc_port_trigger(fc_port_t *port, size_t rb_index)
375407
376408 if (!busy )
377409 {
378- if (port -> single_max_shift )
410+ if (port -> rb_single_limit [ rb_index ] )
379411 {
380- fc_assert (fc_fifo_get_size (fifo ) > (1 << port -> single_max_shift ));
381- buf = fc_fifo_linear_read_setup_limit (fifo , & size , port -> single_max_shift );
412+ fc_assert (fc_fifo_get_size (fifo ) > (1 << port -> rb_single_limit [ rb_index ] ));
413+ buf = fc_fifo_linear_read_setup_limit (fifo , & size , port -> rb_single_limit [ rb_index ] );
382414 }
383415 else
384416 {
@@ -392,10 +424,10 @@ void fc_port_trigger(fc_port_t *port, size_t rb_index)
392424
393425 if (!busy )
394426 {
395- if (port -> single_max_shift )
427+ if (port -> rb_single_limit [ rb_index ] )
396428 {
397- fc_assert (fc_fifo_get_size (fifo ) > (1 << port -> single_max_shift ));
398- buf = fc_fifo_linear_write_setup_limit (fifo , & size , port -> single_max_shift );
429+ fc_assert (fc_fifo_get_size (fifo ) > (1 << port -> rb_single_limit [ rb_index ] ));
430+ buf = fc_fifo_linear_write_setup_limit (fifo , & size , port -> rb_single_limit [ rb_index ] );
399431 }
400432 else
401433 {
@@ -449,11 +481,6 @@ void fc_port_end(fc_port_t *port, size_t rb_index, int size)
449481 fc_fifo_linear_write_done (fifo , size );
450482 }
451483 }
452-
453- if (port -> trigger_serial )
454- {
455- return fc_port_trigger (port , rb_index );
456- }
457484}
458485
459486/**
@@ -463,7 +490,7 @@ void fc_port_end(fc_port_t *port, size_t rb_index, int size)
463490 * @param rb_index
464491 * @return int
465492 */
466- int fc_port_available (fc_port_t * port , size_t rb_index )
493+ int fc_port_used (fc_port_t * port , size_t rb_index )
467494{
468495 fc_assert (port != NULL );
469496 fc_assert (port -> rb != NULL );
@@ -533,34 +560,28 @@ void fc_default_port_init(void)
533560 }
534561 init = true;
535562
536- #if !(STDOUT_TX_SINGLE_MAX_SHIFT < FIFO_TX_LOG2_SIZE && STDOUT_TX_SINGLE_MAX_SHIFT >= 0 && FIFO_TX_LOG2_SIZE >= 0 )
537- #error "STDOUT_TX_SINGLE_MAX_SHIFT must less than FIFO_TX_LOG2_SIZE ,please check it"
538- #error "单次发送位移必须小于缓冲区的log2大小,且两者必须同时大于等于0 "
563+ #if !(STDOUT_RB0_TX_SINGLE_MAX_SHIFT < STDOUT_RB0_LOG2_SIZE && STDOUT_RB0_TX_SINGLE_MAX_SHIFT >= 0 && STDOUT_RB0_LOG2_SIZE > 0 )
564+ #error "STDOUT_RB0_TX_SINGLE_MAX_SHIFT must less than STDOUT_RB0_LOG2_SIZE ,please check it"
565+ #error "单次发送位移必须小于等于缓冲区的log2大小,请检查配置 "
539566#endif
540567
541- #if !(STDIN_RX_SINGLE_MAX_SHIFT < FIFO_RX_LOG2_SIZE && STDIN_RX_SINGLE_MAX_SHIFT >= 0 && FIFO_RX_LOG2_SIZE >= 0 )
542- #error "STDIN_RX_SINGLE_MAX_SHIFT must less than FIFO_RX_LOG2_SIZE ,please check it"
543- #error "单次接收位移必须小于缓冲区的log2大小,且两者必须同时大于等于0 "
568+ #if !(STDIN_RB0_RX_SINGLE_MAX_SHIFT < STDIN_RB0_LOG2_SIZE && STDIN_RB0_RX_SINGLE_MAX_SHIFT >= 0 && STDIN_RB0_LOG2_SIZE > 0 )
569+ #error "STDIN_RB0_RX_SINGLE_MAX_SHIFT must less than STDIN_RB0_LOG2_SIZE ,please check it"
570+ #error "单次接收位移必须小于等于缓冲区的log2大小,请检查配置 "
544571#endif
545572
546573 {
547- fc_stdout .single_max_shift = STDOUT_TX_SINGLE_MAX_SHIFT ;
548- fc_stdout .dir = (uint8_t )FC_PORT_DIR_OUT ;
549- fc_stdout .trigger_serial = PHY_SERIAL_TX_ENABLE ? 1 : 0 ;
574+ fc_port_init (& fc_stdout , FC_PORT_DIR_OUT );
550575
551576 // 初始化环形队列,静态内存构造,默认端口只给一个环形缓冲区分配内存
552- // fc_fifo_static_new_at(fc_stdout.rb[0], FIFO_TX_LOG2_SIZE);
553- fc_port_static_alloc_rb (& fc_stdout , 0 , FIFO_TX_LOG2_SIZE , "fc_stdout_rb0" );
577+ fc_port_static_alloc_rb (& fc_stdout , 0 , STDOUT_RB0_LOG2_SIZE , "fc_stdout_rb0" , STDOUT_RB0_TX_SINGLE_MAX_SHIFT );
554578 }
555579
556580 {
557- fc_stdin .single_max_shift = STDIN_RX_SINGLE_MAX_SHIFT ;
558- fc_stdin .dir = (uint8_t )FC_PORT_DIR_IN ;
559- fc_stdin .trigger_serial = PHY_SERIAL_RX_ENABLE ? 1 : 0 ;
581+ fc_port_init (& fc_stdin , FC_PORT_DIR_IN );
560582
561583 // 初始化环形队列,静态内存构造,默认端口只给一个环形缓冲区分配内存
562- // fc_fifo_static_new_at(fc_stdin.rb[0], FIFO_RX_LOG2_SIZE);
563- fc_port_static_alloc_rb (& fc_stdin , 0 , FIFO_RX_LOG2_SIZE , "fc_stdin_rb0" );
584+ fc_port_static_alloc_rb (& fc_stdin , 0 , STDIN_RB0_LOG2_SIZE , "fc_stdin_rb0" , STDIN_RB0_RX_SINGLE_MAX_SHIFT );
564585 }
565586
566587 {
0 commit comments