Skip to content

Commit 63ebc78

Browse files
committed
Merge branch 'develop' into CMSIS-Pack
2 parents ec4cda2 + 62424c5 commit 63ebc78

8 files changed

Lines changed: 145 additions & 151 deletions

File tree

core/fc_config_template.h

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -73,35 +73,25 @@
7373
// <i> Default: 8
7474
#define PORT_RB_NUM 8
7575

76-
// <o> FIFO_TX_LOG2_SIZE - TX FIFO Size (log2) <8-16>
76+
// <o> STDOUT_RB0_LOG2_SIZE - TX FIFO Size (log2) <8-16>
7777
// <i> Output ring buffer size as power of 2 (e.g., 12 = 4096 bytes)
7878
// <i> Default: 12 (4KB)
79-
#define FIFO_TX_LOG2_SIZE 12
79+
#define STDOUT_RB0_LOG2_SIZE 12
8080

81-
// <o> STDOUT_TX_SINGLE_MAX_SHIFT - TX Single Max Shift <1-4>
81+
// <o> STDOUT_RB0_TX_SINGLE_MAX_SHIFT - TX Single Max Shift <1-4>
8282
// <i> Single TX max bytes = buffer_size / (2^n), smaller value allows more data per transfer
8383
// <i> Default: 2
84-
#define STDOUT_TX_SINGLE_MAX_SHIFT 2
84+
#define STDOUT_RB0_TX_SINGLE_MAX_SHIFT 2
8585

86-
// <q> PHY_SERIAL_TX_ENABLE - Enable Serial TX
87-
// <i> Enable continuous serial transmission
88-
// <i> Default: 0 (Disabled)
89-
#define PHY_SERIAL_TX_ENABLE 0
90-
91-
// <o> FIFO_RX_LOG2_SIZE - RX FIFO Size (log2) <6-12>
86+
// <o> STDIN_RB0_LOG2_SIZE - RX FIFO Size (log2) <6-12>
9287
// <i> Input ring buffer size as power of 2 (e.g., 8 = 256 bytes)
9388
// <i> Default: 8 (256B)
94-
#define FIFO_RX_LOG2_SIZE 8
89+
#define STDIN_RB0_LOG2_SIZE 8
9590

96-
// <o> STDIN_RX_SINGLE_MAX_SHIFT - RX Single Max Shift <1-4>
91+
// <o> STDIN_RB0_RX_SINGLE_MAX_SHIFT - RX Single Max Shift <1-4>
9792
// <i> Single RX max bytes = buffer_size / (2^n), smaller value allows more data per transfer
9893
// <i> Default: 1
99-
#define STDIN_RX_SINGLE_MAX_SHIFT 1
100-
101-
// <q> PHY_SERIAL_RX_ENABLE - Enable Serial RX
102-
// <i> Enable continuous serial reception
103-
// <i> Default: 0 (Disabled)
104-
#define PHY_SERIAL_RX_ENABLE 0
94+
#define STDIN_RB0_RX_SINGLE_MAX_SHIFT 1
10595

10696
// </h>
10797

core/fc_pool.c

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -275,14 +275,15 @@ void fc_pool_free(fc_pool_t *pool, void *ptr)
275275

276276
#if FC_FOOL_ENABLE_DYNAMIC_POOL_ALLOC
277277

278-
while (dynamic_head && pool->alloc) // 如果是动态分配的内存,调用用户自定义的内存释放回调函数释放内存
278+
while (dynamic_head) // 如果是动态分配的内存,调用用户自定义的内存释放回调函数释放内存
279279
{
280+
node = dynamic_head->next; // 先记录下一个节点
280281
// 根据地址找到起始位置
281-
fc_pool_dynamic_mem_t mem = (fc_pool_dynamic_mem_t)((uint8_t *)dynamic_head - sizeof(fc_pool_header_t));
282+
fc_pool_dynamic_mem_t mem = (fc_pool_dynamic_mem_t)dynamic_head;
282283

283284
pool->alloc(FC_POOL_DYNAMIC_FREE, &mem, pool->block_size + sizeof(fc_pool_header_t)); // 释放动态内存块
284285

285-
dynamic_head = dynamic_head->next;
286+
dynamic_head = node;
286287
}
287288

288289
#endif
@@ -694,30 +695,33 @@ void *fc_pool_fifo_pop(fc_pool_t *pool)
694695

695696
FC_ATOMIC_SCOPE
696697
{
697-
node = pool->fifo_used.next;
698-
tail = node;
699-
do
698+
if (!fc_pool_fifo_empty(pool)) // 再次判定,避免从上次判定到这里之间其他线程调用过(基本不可能,但是为了绝对安全考虑)
700699
{
701-
if (tail->pool.tag.end == FC_POOL_TAG_END) // 找到这一次链式内存块的最后一块
700+
node = pool->fifo_used.next;
701+
tail = node;
702+
do
702703
{
703-
break;
704-
}
704+
if (tail->pool.tag.end == FC_POOL_TAG_END) // 找到这一次链式内存块的最后一块
705+
{
706+
break;
707+
}
708+
709+
if (tail->next == NULL) // 理论上不可能出现这种情况,前一个判断就会退出
710+
{
711+
break;
712+
}
713+
714+
tail = tail->next;
715+
} while (tail);
705716

706-
if (tail->next == NULL) // 理论上不可能出现这种情况,前一个判断就会退出
717+
pool->fifo_used.next = tail->next; // 更新头部
718+
if (pool->fifo_used.next == NULL) // 如果头部为空,则尾部也需要置空
707719
{
708-
break;
720+
pool->fifo_used.pool.tail = NULL;
709721
}
710722

711-
tail = tail->next;
712-
} while (tail);
713-
714-
pool->fifo_used.next = tail->next; // 更新头部
715-
if (pool->fifo_used.next == NULL) // 如果头部为空,则尾部也需要置空
716-
{
717-
pool->fifo_used.pool.tail = NULL;
723+
tail->next = NULL; // 断开链式内存块
718724
}
719-
720-
tail->next = NULL; // 断开链式内存块
721725
}
722726

723727
return (void *)(node ? (uint8_t *)node + sizeof(fc_pool_header_t) : NULL);
@@ -758,7 +762,7 @@ void fc_pool_walk(void *ptr, fc_pool_walker_t walker, void *user)
758762
}
759763

760764
/**
761-
* @brief 遍历整个fifo used队列链表,遍历后释放内存,自行确保函数的线程安全
765+
* @brief 遍历整个fifo used队列链表,遍历后释放内存
762766
*
763767
* @param pool
764768
* @param walker

core/fc_port.c

Lines changed: 72 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -36,36 +36,26 @@
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

Comments
 (0)