OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2912|回复: 5

Freertos中互斥信号量和软定时器的回调问题

[复制链接]

5

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2014-10-21
在线时间
31 小时
发表于 2018-7-18 20:51:45 | 显示全部楼层 |阅读模式
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做打印队列
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-7-18 20:51:46 | 显示全部楼层
你干嘛 发表于 2018-7-19 08:24
好吧,我又看了一下,另外的任务也是需要调用这个锁的,不过软定时器里不能调用吧?

不可以的,
内存小,你要么每个printf前后加锁,要么自己写个my_printf这个函数带锁,中断内用printf,其他用my_printf,就不用都前后加了,不过偶尔也会错乱,还可以用任务打印全局变量形式,不建议这么来
内存够大,就弄个打印队列,做个任务负责打印  ,要么用最新版的freertos 的StreamBuffer做打印队列
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-7-18 21:15:13 | 显示全部楼层
定时器回调函数里面的printf你又没锁
回复

使用道具 举报

5

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2014-10-21
在线时间
31 小时
 楼主| 发表于 2018-7-19 08:16:50 | 显示全部楼层
275891381 发表于 2018-7-18 21:15
定时器回调函数里面的printf你又没锁

不是锁一处就可以了吗?
而且软定时器里不是不能锁的嘛,看到开发手册这样写
menu.saveimg.savepath20180719081514.jpg 那互斥信号量就不能在定时器回调函数里用吧。
感谢回复
回复

使用道具 举报

5

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2014-10-21
在线时间
31 小时
 楼主| 发表于 2018-7-19 08:24:30 | 显示全部楼层
275891381 发表于 2018-7-18 21:15
定时器回调函数里面的printf你又没锁

好吧,我又看了一下,另外的任务也是需要调用这个锁的,不过软定时器里不能调用吧?
回复

使用道具 举报

5

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2014-10-21
在线时间
31 小时
 楼主| 发表于 2018-7-19 10:18:35 | 显示全部楼层
275891381 发表于 2018-7-19 09:57
不可以的,
内存小,你要么每个printf前后加锁,要么自己写个my_printf这个函数带锁,中断内用printf,其 ...

好的,谢谢
我软定时器是要周期性的发送串口数据的,不知道和做个任务:
senddata();
vtaskdelay(xms);
这种有啥区别?

然后再请教一个问题,我还有个外部中断,优先级设置最高,进入中断后滤波1ms,然后设置事件标志组,并切换到高优先级任务处理?这样处理有问题吗?
menu.saveimg.savepath20180719101637.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-15 07:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表