Skip to content

Commit d547892

Browse files
committed
Merge branch 'develop' into CMSIS-Pack
2 parents 51f5939 + 84aee7c commit d547892

5 files changed

Lines changed: 61 additions & 97 deletions

File tree

core/fc_compiler.h

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,6 @@
3838
* For GCC/Clang:
3939
* GNU extensions are enabled by default
4040
*/
41-
#if defined(__ARMCC_VERSION)
42-
#if !defined(__GNUC__)
43-
#error "fc_embed requires GNU extensions! Please enable GNU dialect in Keil Project Options -> C/C++ settings."
44-
#endif
45-
#endif
4641

4742
#if defined(__ARMCC_VERSION) /* ARM Compiler */
4843
#define fc_section(x) __attribute__((section(x)))
@@ -93,12 +88,4 @@
9388
#error not supported tool chain
9489
#endif /* __ARMCC_VERSION */
9590

96-
#if defined(__GNUC__) && __GNUC__ >= 3
97-
#define FMT_ARG(n) __attribute__((__format_arg__(n)))
98-
#else
99-
#define FMT_ARG(n)
100-
#endif
101-
102-
103-
10491
#endif // __FC_COMPILER_H__

core/fc_helper.h

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,14 @@
139139
#pragma clang diagnostic ignored "-Wmissing-field-initializers"
140140
#pragma clang diagnostic ignored "-Wmissing-declarations"
141141
#pragma clang diagnostic ignored "-Wmissing-braces"
142+
143+
#pragma clang diagnostic ignored "-Wconstant-logical-operand"
144+
#pragma clang diagnostic ignored "-Wshadow"
142145
#elif __IS_COMPILER_ARM_COMPILER_5__
143146
/*! arm compiler 5 */
144147
#pragma push
145148
#pragma diag_suppress 1, 64, 174, 177, 188, 68, 513, 144, 2525
149+
#pragma diag_suppress 236, 780
146150
#elif __IS_COMPILER_IAR__
147151
/*! IAR */
148152
#elif __IS_COMPILER_GCC__
@@ -153,6 +157,9 @@
153157
#pragma GCC diagnostic ignored "-Wformat="
154158
#pragma GCC diagnostic ignored "-Wmissing-braces"
155159
#pragma GCC diagnostic ignored "-Wmissing-declarations"
160+
161+
#pragma GCC diagnostic ignored "-Wconstant-condition"
162+
#pragma GCC diagnostic ignored "-Wshadow"
156163
#endif
157164

158165
// clang-format on
@@ -242,16 +249,16 @@
242249
FC_CONNECT3(__fc_using_, __LINE__, _ptr)++ == NULL; \
243250
(__on_leave_expr))
244251

245-
#define __fc_using3(__declare, __on_enter_expr, __on_leave_expr) \
246-
for (__declare, \
247-
*FC_CONNECT3(__fc_using_, __LINE__, _ptr) = NULL; \
248-
FC_CONNECT3(__fc_using_, __LINE__, _ptr)++ == NULL ? ((__on_enter_expr), 1) : 0; \
252+
#define __fc_using3(__declare, __on_enter_expr, __on_leave_expr) \
253+
for (__declare, \
254+
*FC_CONNECT3(__fc_using_, __LINE__, _ptr) = NULL; \
255+
(FC_CONNECT3(__fc_using_, __LINE__, _ptr)++ == NULL ? ((void)(__on_enter_expr), 1) : 0); \
249256
(__on_leave_expr))
250257

251-
#define __fc_using4(__dcl1, __dcl2, __on_enter_expr, __on_leave_expr) \
252-
for (__dcl1, __dcl2, \
253-
*FC_CONNECT3(__fc_using_, __LINE__, _ptr) = NULL; \
254-
FC_CONNECT3(__fc_using_, __LINE__, _ptr)++ == NULL ? ((__on_enter_expr), 1) : 0; \
258+
#define __fc_using4(__dcl1, __dcl2, __on_enter_expr, __on_leave_expr) \
259+
for (__dcl1, __dcl2, \
260+
*FC_CONNECT3(__fc_using_, __LINE__, _ptr) = NULL; \
261+
(FC_CONNECT3(__fc_using_, __LINE__, _ptr)++ == NULL ? ((void)(__on_enter_expr), 1) : 0); \
255262
(__on_leave_expr))
256263

257264
#define fc_using(...) \

core/fc_log.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ void fc_log_set_level(fc_log_t *log, fc_log_level_t level)
6969
*/
7070
static int __fc_log_fail_record_write(FC_FILE *f, const void *buf, int len)
7171
{
72-
if (len >= FC_IO_SWAP)
72+
if (len > FC_IO_SWAP)
7373
{
7474
fc_log_file_user_t *user = (fc_log_file_user_t *)f->user;
7575
// 调用钩子记录丢失的日志长度
@@ -99,7 +99,8 @@ static int __fc_log_alloc_write(FC_FILE *f, const void *buf, int len)
9999
user->block_write += mem->size;
100100
if (false == log->alloc(FC_LOG_ALLOC_NEW, mem, FC_LOG_LINE_SIZE))
101101
{
102-
#if !FC_LOG_POOL_FAIL_RECORD
102+
// f->p_now = NULL; // 强制后续写入失败,进入的时候已经设置为NULL了
103+
#if FC_LOG_POOL_FAIL_RECORD
103104
f->io.write = __fc_log_fail_record_write; // 改变下一次进来的函数,后续只做丢失记录
104105
return len;
105106
#else
@@ -145,7 +146,7 @@ fc_weak void fc_log_fprintf(fc_log_t *log, fc_log_level_t level, const char *fmt
145146
// 分配内存池
146147
if (false == log->alloc(FC_LOG_ALLOC_NEW, &(user->mem), FC_LOG_LINE_SIZE))
147148
{
148-
#if !FC_LOG_POOL_FAIL_RECORD
149+
#if FC_LOG_POOL_FAIL_RECORD
149150
va_list vargs;
150151
va_start(vargs, fmt);
151152
user->total_write = fc_vsnprintf(NULL, 0, fmt, vargs);
@@ -194,7 +195,7 @@ fc_weak void fc_log_fprintf(fc_log_t *log, fc_log_level_t level, const char *fmt
194195
// 分配内存池
195196
if (false == log->alloc(FC_LOG_ALLOC_NEW, &(user->mem), FC_LOG_LINE_SIZE))
196197
{
197-
#if !FC_LOG_POOL_FAIL_RECORD
198+
#if FC_LOG_POOL_FAIL_RECORD
198199
va_list vargs;
199200
va_start(vargs, fmt);
200201
user->total_write = fc_vsnprintf(NULL, 0, fmt, vargs);

core/fc_log.h

Lines changed: 39 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
#endif
6565

6666
#ifndef FC_LOG_POOL_FAIL_RECORD
67-
#define FC_LOG_POOL_FAIL_RECORD 0 /**< 序列化日志分配失败是否记录丢失日志长度,需要消耗性能用于空序列化一次,个人觉得没必要 */
67+
#define FC_LOG_POOL_FAIL_RECORD 0 /**< 序列化日志内存分配失败是否记录丢失日志长度,需要消耗性能用于空序列化,个人觉得没必要 */
6868
#endif
6969

7070
#ifndef FC_LOG_FMT_START
@@ -285,11 +285,8 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
285285
//+********************************* 以下部分允许重入 **********************************/
286286
#undef fc_log_level
287287

288-
#undef fc_log_merge_2
289-
#undef fc_log_merge_1
290-
#undef fc_log_merge_0
291-
292-
#undef fc_log_merge
288+
#undef FC_LOG_MERGE
289+
#undef fc_log_level_record
293290
#undef fc_log_format
294291

295292
#undef fc_log_error
@@ -317,27 +314,35 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
317314

318315
#if FC_LOG_ENABLE
319316

320-
#define fc_log_merge_2(enter_expr, leave_expr) \
321-
fc_using(fc_log_t SAFE_NAME(log_obj) = FC_LOG_OBJ, *scope_log_ptr = &SAFE_NAME(log_obj), { SAFE_NAME(log_obj).merge = true; enter_expr; }, {leave_expr; fc_log_fflush(&SAFE_NAME(log_obj)); })
322-
323-
#define fc_log_merge_1(enter_expr) \
324-
fc_log_merge_2(enter_expr, { (void)0; })
325-
326-
#define fc_log_merge_0() \
327-
fc_log_merge_1({ (void)0; })
328-
329-
// 根据参数展开为0/1/2个参数的版本,超过2将报错,可以用复合语句{exp1;exp2...expN}算一个参数
330-
#define fc_log_merge(...) \
331-
FC_CONNECT2(fc_log_merge_, __PLOOC_VA_NUM_ARGS(__VA_ARGS__))(__VA_ARGS__)
332-
317+
// 统一实现:C和C++模式都不接受参数,避免兼容性问题
318+
// FC_LOG_MERGE将作用域内的所有log输出合并为一次输出,大写不带括号,避免与函数混淆
319+
#define FC_LOG_MERGE \
320+
fc_using(fc_log_t SAFE_NAME(log_obj) = FC_LOG_OBJ, \
321+
*scope_log_ptr = &SAFE_NAME(log_obj), \
322+
scope_log_ptr->merge = true, \
323+
fc_log_fflush(scope_log_ptr))
324+
325+
#define fc_log_level_record(_level) \
326+
do \
327+
{ \
328+
if (scope_log_ptr) \
329+
{ \
330+
fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
331+
if (SAFE_NAME(log_temp_ptr)->merge) \
332+
SAFE_NAME(log_temp_ptr)->last_level = _level; /* 临时对象实体记录临时等级 */ \
333+
} \
334+
} while (0);
335+
336+
// 把fc_log_level_record在format中展开,减少一次do...while(0)的开销
333337
#define fc_log_format(text, _level, fmt, ...) \
334338
do \
335339
{ \
336340
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__); \
337341
if (scope_log_ptr) \
338342
{ \
339343
fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
340-
SAFE_NAME(log_temp_ptr)->last_level = FC_LOG_LEVEL_ERROR; /* 临时对象实体记录临时等级 */ \
344+
if (SAFE_NAME(log_temp_ptr)->merge) \
345+
SAFE_NAME(log_temp_ptr)->last_level = _level; /* 临时对象实体记录临时等级 */ \
341346
} \
342347
} while (0)
343348

@@ -346,75 +351,40 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
346351
#define fc_log_error(fmt, ...) \
347352
fc_log_format(FC_ERROR_TEXT, FC_LOG_LEVEL_ERROR, fmt, ##__VA_ARGS__)
348353
#else
349-
#define fc_log_error(fmt, ...) \
350-
do \
351-
{ \
352-
if (scope_log_ptr) \
353-
{ \
354-
fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
355-
SAFE_NAME(log_temp_ptr)->last_level = FC_LOG_LEVEL_ERROR; /* 临时对象实体记录临时等级 */ \
356-
} \
357-
} while (0);
354+
#define fc_log_error(fmt, ...) \
355+
fc_log_level_record(FC_LOG_LEVEL_ERROR)
358356
#endif
359357

360358
#if FC_LOG_FILE_LEVEL >= FC_LOG_LEVEL_WARNING
361359
#define fc_log_warning(fmt, ...) \
362360
fc_log_format(FC_WARNING_TEXT, FC_LOG_LEVEL_WARNING, fmt, ##__VA_ARGS__)
363361
#else
364-
#define fc_log_warning(fmt, ...) \
365-
do \
366-
{ \
367-
if (scope_log_ptr) \
368-
{ \
369-
fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
370-
SAFE_NAME(log_temp_ptr)->last_level = FC_LOG_LEVEL_WARNING; /* 临时对象实体记录临时等级 */ \
371-
} \
372-
} while (0);
362+
#define fc_log_warning(fmt, ...) \
363+
fc_log_level_record(FC_LOG_LEVEL_WARNING)
373364
#endif
374365

375366
#if FC_LOG_FILE_LEVEL >= FC_LOG_LEVEL_INFO
376367
#define fc_log_info(fmt, ...) \
377368
fc_log_format(FC_INFO_TEXT, FC_LOG_LEVEL_INFO, fmt, ##__VA_ARGS__)
378369
#else
379-
#define fc_log_info(fmt, ...) \
380-
do \
381-
{ \
382-
if (scope_log_ptr) \
383-
{ \
384-
fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
385-
SAFE_NAME(log_temp_ptr)->last_level = FC_LOG_LEVEL_INFO; /* 临时对象实体记录临时等级 */ \
386-
} \
387-
} while (0);
370+
#define fc_log_info(fmt, ...) \
371+
fc_log_level_record(FC_LOG_LEVEL_INFO)
388372
#endif
389373

390374
#if FC_LOG_FILE_LEVEL >= FC_LOG_LEVEL_DEBUG
391375
#define fc_log_debug(fmt, ...) \
392376
fc_log_format(FC_DEBUG_TEXT, FC_LOG_LEVEL_DEBUG, fmt, ##__VA_ARGS__)
393377
#else
394-
#define fc_log_debug(fmt, ...) \
395-
do \
396-
{ \
397-
if (scope_log_ptr) \
398-
{ \
399-
fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
400-
SAFE_NAME(log_temp_ptr)->last_level = FC_LOG_LEVEL_DEBUG; /* 临时对象实体记录临时等级 */ \
401-
} \
402-
} while (0);
378+
#define fc_log_debug(fmt, ...) \
379+
fc_log_level_record(FC_LOG_LEVEL_DEBUG)
403380
#endif
404381

405382
#if FC_LOG_FILE_LEVEL >= FC_LOG_LEVEL_VERBOSE
406383
#define fc_log_verbose(fmt, ...) \
407384
fc_log_format(FC_VERBOSE_TEXT, FC_LOG_LEVEL_VERBOSE, fmt, ##__VA_ARGS__)
408385
#else
409-
#define fc_log_verbose(fmt, ...) \
410-
do \
411-
{ \
412-
if (scope_log_ptr) \
413-
{ \
414-
fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
415-
SAFE_NAME(log_temp_ptr)->last_level = FC_LOG_LEVEL_VERBOSE; /* 临时对象实体记录临时等级 */ \
416-
} \
417-
} while (0);
386+
#define fc_log_verbose(fmt, ...) \
387+
fc_log_level_record(FC_LOG_LEVEL_VERBOSE)
418388
#endif
419389

420390
#define fc_log_printf(fmt, ...) \
@@ -458,14 +428,11 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
458428
} while (0)
459429

460430
#else
461-
#define fc_log_merge_2(enter_expr, leave_expr)
462-
#define fc_log_merge_1(enter_expr)
463-
#define fc_log_merge_0()
464-
465-
#define fc_log_merge(...) // 空定义即可
431+
#define FC_LOG_MERGE // 空定义即可
466432

467433
// clang-format off
468-
434+
435+
#define fc_log_level_record(_level) ((void)0)
469436
#define fc_log_format(text, level, fmt, ...) ((void)0)
470437
#define fc_log_error(fmt, ...) ((void)0)
471438
#define fc_log_warning(fmt, ...) ((void)0)
@@ -498,7 +465,7 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
498465
#if FC_LOG_NOPREFIX_API
499466
#define log_level fc_log_level
500467

501-
#define log_merge fc_log_merge
468+
#define LOG_MERGE FC_LOG_MERGE
502469

503470
#define log_error fc_log_error
504471
#define log_warning fc_log_warning

core/fc_port.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,8 @@ void fc_default_port_init(void)
574574
fc_port_rtt.port_in = &fc_stdin;
575575
fc_port_rtt.port_out = &fc_stdout;
576576
}
577+
578+
(void)fc_port_rtt; // 未使用也不要警告
577579
}
578580

579581
//+********************************* log组件write函数 **********************************/

0 commit comments

Comments
 (0)