1、测试条件
网友发的一个问题。
[C] 纯文本查看 复制代码 const uint8_t InnerSwVersion[20] = "SF11_V01.01_20230116";
const uint8_t OldSwVersion[11] = {
0x46, 0x31, 0x30, 0x33, 0x44, 0x49, 0x41, 0x47, 0x53, 0x30, 0x32
};
加入了互斥处理的printf
[C] 纯文本查看 复制代码 /*
*********************************************************************************************************
* 函 数 名: App_Printf
* 功能说明: 线程安全的printf方式
* 形 参: 同printf的参数。
* 在C中,当无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表
* 返 回 值: 无
*********************************************************************************************************
*/
static void App_Printf(const char *fmt, ...)
{
char buf_str[200 + 1]; /* 特别注意,如果printf的变量较多,注意此局部变量的大小是否够用 */
va_list v_args;
va_start(v_args, fmt);
(void)vsnprintf((char *)&buf_str[0],
(size_t ) sizeof(buf_str),
(char const *) fmt,
v_args);
va_end(v_args);
/* 互斥操作 */
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf("%s", buf_str);
/tx_mutex_put(&AppPrintfSemp);
}
实际打印函数:
[C] 纯文本查看 复制代码 extern const uint8_t InnerSwVersion[20];
extern const uint8_t OldSwVersion[11];
static void AppTaskUserIF(ULONG thread_input)
{
uint8_t ucKeyCode; /* 按键代码 */
(void)thread_input;
while(1)
{
ucKeyCode = bsp_GetKey();
if (ucKeyCode != KEY_NONE)
{
switch (ucKeyCode)
{
case KEY_DOWN_K1: /* K1键按打印任务执行情况 */
App_Printf("1: %s\r\n", InnerSwVersion);
App_Printf("2: %s\r\n", OldSwVersion);
break;
default: /* 其他的键值不处理 */
break;
}
}
tx_thread_sleep(20);
}
}
2、错误现象
3、问题解决
变量定义的空间小了const uint8_t InnerSwVersion[20] = "SF11_V01.01_20230116"
这个实际上是21个字符,字符常量末尾还有个结束符,简单些,修改为21,或者置空均可
|