|
正常情况下,调试信息输出不多时,并没有问题。
我在CAN接收中断里,收到一个数据包,向外打印一些信息。如果CAN短时间接收大量数据包时,便会打印非常多的调试信息。这时候单片机进入硬件中断。
代码如下:
- /*
- *********************************************************************************************************
- * Function Name : ECHO_SAFE
- * Description : 线程安全的打印信息
- * Input : None
- * Output : None
- * Return : None
- *********************************************************************************************************
- */
- void ECHO_SAFE(char *format, ...)
- {
- CPU_CHAR buf_str[256];
- va_list v_args;
- OS_ERR err;
-
- va_start(v_args, format);
-
- (void)vsnprintf((char *)&buf_str[0],
- (size_t ) sizeof(buf_str),
- (char const *) format,
- v_args);
-
- va_end(v_args);
- OSSemPend((OS_SEM *)&EchoSem,
- (OS_TICK )0,
- (OS_OPT )OS_OPT_PEND_BLOCKING,
- (CPU_TS *)0,
- (OS_ERR *)&err);
- printf("%s\r\n", buf_str);
-
- OSSemPost((OS_SEM *)&EchoSem,
- (OS_OPT )OS_OPT_POST_1,
- (OS_ERR *)&err);
- }
- 我感觉是因为这个函数使用了数组,如果该函数执行时间过长,没有来得及退出,又调用该函数,将导致上次的堆栈没有释放。
- 当堆栈使用量达到设置值时,单片机进入硬件中断。
- 请教各位是这样吗?
复制代码 |
|