Skip to content

Commit 1c5a4d3

Browse files
committed
Merge branch 'develop' into CMSIS-Pack
2 parents 472e937 + c114e6f commit 1c5a4d3

File tree

5 files changed

+117
-42
lines changed

5 files changed

+117
-42
lines changed

core/fc_config_template.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,13 @@
110110
// <h> Logger Configuration
111111
// <i> Logger component configuration
112112

113-
// <q> FC_LOG_ENABLE - Enable Logger
114-
// <i> Enable logging functionality
115-
// <i> Default: 1 (Enabled)
116-
#define FC_LOG_ENABLE 1
113+
#ifndef FC_LOG_ENABLE
114+
#define FC_LOG_ENABLE 1
115+
#endif
116+
117+
#ifndef FC_LOG_FILE_LEVEL
118+
#define FC_LOG_FILE_LEVEL FC_LOG_LEVEL_ALL /**< 所在文件允许输出log等级 */
119+
#endif
117120

118121
// <o> FC_LOG_LINE_SIZE - Log Line Buffer Size <32-512:8>
119122
// <i> Log line buffer size in bytes

core/fc_log.h

Lines changed: 99 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/**
22
* @file fc_log.h
33
* @author fool-cat (2696652257@qq.com)
4-
* @brief 参考letter_shell的log组件,log组件核心为行缓冲,[ulog](https://github.com/rdpoor/ulog)
4+
* @brief 参考letter_shell的log组件和[ulog](https://github.com/rdpoor/ulog)
55
* 使用的宏API设计为可重入模式,可以重新include此文件进行重定义
66
* @version 1.0
77
* @date 2025-01-31
@@ -299,11 +299,11 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
299299

300300
//+********************************* 宏API **********************************/
301301

302-
// 切换log等级,使用宏API,无需显示指定对象名称,注意使用的时候作用域对象
303-
#define fc_log_level(_level) \
304-
do \
305-
{ \
306-
fc_log_set_level((fc_log_t *)(scope_log_ptr ? scope_log_ptr : &FC_LOG_OBJ), _level); \
302+
// 切换log等级,使用宏API,无需显示指定对象名称,设置外部对象,临时对象继承等级不做控制避免歧义
303+
#define fc_log_level(_level) \
304+
do \
305+
{ \
306+
fc_log_set_level((fc_log_t *)(&FC_LOG_OBJ), _level); \
307307
} while (0)
308308

309309
#if FC_LOG_ENABLE
@@ -321,39 +321,107 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
321321
#define fc_log_merge(...) \
322322
FC_CONNECT2(fc_log_merge_, __PLOOC_VA_NUM_ARGS(__VA_ARGS__))(__VA_ARGS__)
323323

324-
#define fc_log_format(text, _level, fmt, ...) \
325-
do \
326-
{ \
327-
if (_level <= FC_LOG_FILE_LEVEL) \
328-
fc_log_fprintf((fc_log_t *)(scope_log_ptr ? scope_log_ptr : &FC_LOG_OBJ), _level, text "" fmt "" FC_LOG_END, FC_LOG_PREFIX_CONTENT, ##__VA_ARGS__); \
329-
if (scope_log_ptr) \
330-
{ \
331-
fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
332-
SAFE_NAME(log_temp_ptr)->last_level = _level; /* 临时对象实体记录临时等级 */ \
333-
} \
324+
#define fc_log_format(text, _level, fmt, ...) \
325+
do \
326+
{ \
327+
fc_log_fprintf((fc_log_t *)(scope_log_ptr ? scope_log_ptr : &FC_LOG_OBJ), _level, text "" fmt "" FC_LOG_END, FC_LOG_PREFIX_CONTENT, ##__VA_ARGS__); \
328+
if (scope_log_ptr) \
329+
{ \
330+
fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
331+
SAFE_NAME(log_temp_ptr)->last_level = FC_LOG_LEVEL_ERROR; /* 临时对象实体记录临时等级 */ \
332+
} \
334333
} while (0)
335334

336-
//+********************************* 期望使用 **********************************/
337-
#define fc_log_error(fmt, ...) \
338-
fc_log_format(FC_ERROR_TEXT, FC_LOG_LEVEL_ERROR, fmt, ##__VA_ARGS__)
335+
//+********************************* 期望使用 **********************************/
336+
#if FC_LOG_FILE_LEVEL >= FC_LOG_LEVEL_ERROR
337+
#define fc_log_error(fmt, ...) \
338+
fc_log_format(FC_ERROR_TEXT, FC_LOG_LEVEL_ERROR, fmt, ##__VA_ARGS__)
339+
#else
340+
#define fc_log_error(fmt, ...) \
341+
do \
342+
{ \
343+
if (scope_log_ptr) \
344+
{ \
345+
fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
346+
SAFE_NAME(log_temp_ptr)->last_level = FC_LOG_LEVEL_ERROR; /* 临时对象实体记录临时等级 */ \
347+
} \
348+
} while (0);
349+
#endif
339350

340-
#define fc_log_warning(fmt, ...) \
341-
fc_log_format(FC_WARNING_TEXT, FC_LOG_LEVEL_WARNING, fmt, ##__VA_ARGS__)
351+
#if FC_LOG_FILE_LEVEL >= FC_LOG_LEVEL_WARNING
352+
#define fc_log_warning(fmt, ...) \
353+
fc_log_format(FC_WARNING_TEXT, FC_LOG_LEVEL_WARNING, fmt, ##__VA_ARGS__)
354+
#else
355+
#define fc_log_warning(fmt, ...) \
356+
do \
357+
{ \
358+
if (scope_log_ptr) \
359+
{ \
360+
fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
361+
SAFE_NAME(log_temp_ptr)->last_level = FC_LOG_LEVEL_WARNING; /* 临时对象实体记录临时等级 */ \
362+
} \
363+
} while (0);
364+
#endif
342365

343-
#define fc_log_info(fmt, ...) \
344-
fc_log_format(FC_INFO_TEXT, FC_LOG_LEVEL_INFO, fmt, ##__VA_ARGS__)
366+
#if FC_LOG_FILE_LEVEL >= FC_LOG_LEVEL_INFO
367+
#define fc_log_info(fmt, ...) \
368+
fc_log_format(FC_INFO_TEXT, FC_LOG_LEVEL_INFO, fmt, ##__VA_ARGS__)
369+
#else
370+
#define fc_log_info(fmt, ...) \
371+
do \
372+
{ \
373+
if (scope_log_ptr) \
374+
{ \
375+
fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
376+
SAFE_NAME(log_temp_ptr)->last_level = FC_LOG_LEVEL_INFO; /* 临时对象实体记录临时等级 */ \
377+
} \
378+
} while (0);
379+
#endif
345380

346-
#define fc_log_debug(fmt, ...) \
347-
fc_log_format(FC_DEBUG_TEXT, FC_LOG_LEVEL_DEBUG, fmt, ##__VA_ARGS__)
381+
#if FC_LOG_FILE_LEVEL >= FC_LOG_LEVEL_DEBUG
382+
#define fc_log_debug(fmt, ...) \
383+
fc_log_format(FC_DEBUG_TEXT, FC_LOG_LEVEL_DEBUG, fmt, ##__VA_ARGS__)
384+
#else
385+
#define fc_log_debug(fmt, ...) \
386+
do \
387+
{ \
388+
if (scope_log_ptr) \
389+
{ \
390+
fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
391+
SAFE_NAME(log_temp_ptr)->last_level = FC_LOG_LEVEL_DEBUG; /* 临时对象实体记录临时等级 */ \
392+
} \
393+
} while (0);
394+
#endif
348395

349-
#define fc_log_verbose(fmt, ...) \
350-
fc_log_format(FC_VERBOSE_TEXT, FC_LOG_LEVEL_VERBOSE, fmt, ##__VA_ARGS__)
396+
#if FC_LOG_FILE_LEVEL >= FC_LOG_LEVEL_VERBOSE
397+
#define fc_log_verbose(fmt, ...) \
398+
fc_log_format(FC_VERBOSE_TEXT, FC_LOG_LEVEL_VERBOSE, fmt, ##__VA_ARGS__)
399+
#else
400+
#define fc_log_verbose(fmt, ...) \
401+
do \
402+
{ \
403+
if (scope_log_ptr) \
404+
{ \
405+
fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
406+
SAFE_NAME(log_temp_ptr)->last_level = FC_LOG_LEVEL_VERBOSE; /* 临时对象实体记录临时等级 */ \
407+
} \
408+
} while (0);
409+
#endif
351410

352-
#define fc_log_printf(fmt, ...) \
353-
fc_log_format("", (scope_log_ptr ? scope_log_ptr->last_level : FC_LOG_LEVEL_NONE), fmt, ##__VA_ARGS__);
411+
#define fc_log_printf(fmt, ...) \
412+
do \
413+
{ \
414+
fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)(scope_log_ptr ? scope_log_ptr : &FC_LOG_OBJ); \
415+
if (SAFE_NAME(log_temp_ptr)->last_level <= FC_LOG_FILE_LEVEL) \
416+
fc_log_format("", SAFE_NAME(log_temp_ptr)->last_level, fmt, ##__VA_ARGS__); \
417+
} while (0)
354418

355-
#define fc_log_printf_lv(_level, fmt, ...) \
356-
fc_log_format("", _level, fmt, ##__VA_ARGS__);
419+
#define fc_log_printf_lv(_level, fmt, ...) \
420+
do \
421+
{ \
422+
if (_level <= FC_LOG_FILE_LEVEL) \
423+
fc_log_format("", _level, fmt, ##__VA_ARGS__); \
424+
} while (0)
357425

358426
#define fc_log_assert(expr, ...) \
359427
if (!(expr)) \

core/fc_pool.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,8 @@ void *fc_pool_alloc(fc_pool_t *pool, size_t *size)
169169
}
170170
else
171171
{
172+
FC_POOL_ALLOC_FAIL_HOOK(pool);
173+
172174
// 分配失败将size置0,防止误用
173175
*size = 0; // 也可以不用管
174176
}
@@ -261,9 +263,9 @@ void fc_pool_free(fc_pool_t *pool, void *ptr)
261263
}
262264
#endif
263265

264-
FC_ATOMIC_SCOPE
266+
if (static_head) // 静态内存释放仅仅是加入空闲链表,非常快
265267
{
266-
if (static_head) // 静态内存释放仅仅是加入空闲链表,非常快
268+
FC_ATOMIC_SCOPE
267269
{
268270
static_tail->next = pool->list_free.next; // 尾部指向空闲链表头部
269271
pool->list_free.next = static_head; // 空闲链表头部指向新释放的内存块头部

core/fc_stdio.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ extern "C"
3535
*
3636
*/
3737
typedef struct _FC_FILE FC_FILE;
38+
typedef int (*fc_file_write_t)(FC_FILE *f, const void *buf, int len);
39+
typedef int (*fc_file_read_t)(FC_FILE *f, void *buf, int len);
40+
3841
struct _FC_FILE
3942
{
4043
char *p_start;
@@ -47,14 +50,11 @@ extern "C"
4750
union
4851
{
4952
// write和read函数传入为FC_IO_EOF或FC_IO_SWAP或大于0的长度
50-
int (*write)(FC_FILE *f, const void *buf, int len); // 返回实际写入的长度,实际每次只会写入1字节,返回值通常等于len,否则表示结束写入
51-
int (*read)(FC_FILE *f, void *buf, int len); // 返回实际读取的长度,实际每次只会读取1字节,暂时废弃不实现scanf相关API
53+
fc_file_write_t write; // 返回实际写入的长度,实际每次只会写入1字节,返回值通常等于len,否则表示结束写入
54+
fc_file_read_t read; // 返回实际读取的长度,实际每次只会读取1字节,暂时废弃不实现scanf相关API
5255
} io;
5356
};
5457

55-
typedef int (*fc_file_write_t)(FC_FILE *f, const void *buf, int len);
56-
typedef int (*fc_file_read_t)(FC_FILE *f, void *buf, int len);
57-
5858
//+********************************* 格式化API **********************************/
5959

6060
extern int fc_sprintf(char *buf, const char *fmt, ...);

fool_cat.fc_embed.pdsc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@
124124
<files>
125125
<file category="header" attr="config" version="1.0.0" name="core/fc_config_template.h"
126126
select="Config Template" />
127+
<file category="header" attr="config" select="Architecture Header" name="core/fc_arch.h" />
127128
<file category="source" name="core/fc_pool.c" />
128129
<file category="header" attr="template" select="Memory Pool Header" name="core/fc_pool.h" />
129130
<file category="include" name="core/" />
@@ -188,6 +189,7 @@
188189
<files>
189190
<file category="header" attr="config" version="1.0.0" name="core/fc_config_template.h"
190191
select="Config Template" />
192+
<file category="header" attr="config" select="Architecture Header" name="core/fc_arch.h" />
191193
<file category="source" name="core/fc_log.c" />
192194
<file category="header" attr="template" select="Logger Header" name="core/fc_log.h" />
193195
<file category="include" name="core/" />

0 commit comments

Comments
 (0)