初级会员

- 积分
- 189
- 金钱
- 189
- 注册时间
- 2014-10-21
- 在线时间
- 31 小时
|
1金钱
1.软定时器回调函数,优先级较高
//周期定时器的回调函数
void AutoReloadCallback(TimerHandle_t xTimer)
{
static unsigned char Cnt;
Cnt++;
printf("执行次数为:%d\n",Cnt);
}
2.按键扫描任务,优先级最低
void TASK1_Key_scan(void *pvParameters)
{
KEY_Str KEY0_Str,KEY1_Str;
unsigned char LED_Cnt;
unsigned portBASE_TYPE uxHighWaterMark;
KEY0_Str.Key_deal=KEY0_Deal;
KEY1_Str.Key_deal=KEY1_Deal;
while(1)
{
KEY_Dect(KEY0,&KEY0_Str);
KEY_Dect(KEY1,&KEY1_Str);
vTaskDelay(10);
LED_Cnt++;
if(LED_Cnt>=50)
{
LED_Cnt=0;
LED0=!LED0;
LED1=!LED1;
xSemaphoreTake(MutexSemaphore,portMAX_DELAY); //获取互斥信号量
printf("TASK1_Key_scan剩余栈空间是多少:%ld\r\n",uxHighWaterMark);
xSemaphoreGive(MutexSemaphore); //释放互斥信号量
}
uxHighWaterMark=uxTaskGetStackHighWaterMark(TASK1_Key_scan_Handler);
}
}
然后测试发现,互斥信号量没起到作用,发送一半,会被抢占。
执行次数为:49
执行次数为:50
执行次数为:51
执行次数为:52
TASK1_Key_scan剩余栈空间是多少:执行次数为:53
64
执行次数为:54
执行次数为:55
执行次数为:56
请问是不是软定时器回调函数,无法用互斥信号量锁住呢?
|
最佳答案
查看完整内容[请看2#楼]
不可以的,
内存小,你要么每个printf前后加锁,要么自己写个my_printf这个函数带锁,中断内用printf,其他用my_printf,就不用都前后加了,不过偶尔也会错乱,还可以用任务打印全局变量形式,不建议这么来
内存够大,就弄个打印队列,做个任务负责打印 ,要么用最新版的freertos 的StreamBuffer做打印队列
|