|

楼主 |
发表于 2017-5-31 17:06:18
|
显示全部楼层
回 eric2013 的帖子
eric2013:
确切的说是每个调用这个函数的任务,进入到这个函数里面,都会从各自的任务栈空间申请新的
CPU_CHAR buf_str[80 + 1];
va_list v_args; 空间
....... 
硬汉哥,今天测试发现这个线程安全的App_Printf 似乎并不安全啊[s:152]
下面是我的测试情况:
系统有4个任务,uCOS-II 2.92
任务1:优先级1,任务中使用App_Printf 输出类似:M1,000.4,m,105的数据
任务2:优先级2,任务中使用App_Printf输出类似:M2,000.4,m,105的数据
任务3:优先级3,任务中使用App_Printf输出类似:M3,000.4,m,105的数据
任务4:优先级4,任务中使用App_Printf输出当前时间:T2017-05-31_16-28-30
测试结果为:当输出时间的任务4正在输出时间时,任务1或2或3打断任务4输出了其他任务的信息,后才输出任务4的信息,即App_Printf并不是安全的,是可以被打断的。
测试截图如下:
试探解决:我把App_Printf函数中的信号量改为了互斥信号量或者把OSSemPend放到va_start前面,问题依然没有解决,还是有被插入现象。
分析:信号量或互斥信号量放到函数中,该函数在被低优先级的任务调用并使用时高优先级的任务依然可以打断该任务且抢占使用该函数,这样的话才可以解析我的试验现象。这么理解对吗?
解决方法?:把互斥信号量从App_Printf函数中拿出,任务中调用时写成如下的形式应该就可以了。
OSMutexPend((OS_EVENT *)AppPrintfSemp,
(INT32U )0,
(INT8U *)&os_err);
App_Printf (........);
os_err = OSMutexPost((OS_EVENT *)AppPrintfSemp);
硬汉哥我理解的对不? |
|