搜索
楼主: pretty868

[求助] 求助STM32F103 FreeRTOS任务调度异常问题

[复制链接]

该用户从未签到

1

主题

198

帖子

7

蝴蝶豆

金牌会员

最后登录
2021-11-3
发表于 2018-10-8 14:35:39 | 显示全部楼层
pretty868 发表于 2018-10-8 14:31
嗯嗯,我是刚接触RTOS。
按照您的意思,是不是所有的任务里面都需要有vTaskDelay才会以前任务调度,系统 ...

vTaskDelay可以引起调度,这个是入门最容易弄的,后面还有信号量,队列,邮箱等等都可以引起调度
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

8

帖子

0

蝴蝶豆

初级会员

最后登录
2019-6-26
 楼主| 发表于 2018-10-8 15:07:56 | 显示全部楼层
toofree 发表于 2018-10-8 12:21
Delay_Ms()是软件延时,死等吗?
在操作系统中最好不要用死等,除非任务之间有些条件,不得不这么做。
vTa ...

我系统里面有个创建任务的函数(创建任务1和任务2),必须把它的优秀级调高(大于任务1和任务2),系统才能正常,才能跟你的描述相一致!谢谢您的指教

创建任务的函数如下:
void Create_Task(void * pvParameters)
{
                  xTaskCreate((TaskFunction_t) Task1_Task,
                                                                        (char*         ) "Task1_Task",               
                                                                        (uint16_t      ) TASK1_STK_SIZE,
                                                                        (void*                                 ) NULL,
                                                                        (UBaseType_t         ) TASK1_TASK_PRIO,
                                                                        (TaskHandle_t* ) &Task1_Handle);
                                                                  
                  xTaskCreate((TaskFunction_t) Task2_Task,
                                                                        (char*         ) "Task2_Task",               
                                                                        (uint16_t      ) TASK2_STK_SIZE,
                                                                        (void*                                 ) NULL,
                                                                        (UBaseType_t         ) TASK2_TASK_PRIO,
                                                                        (TaskHandle_t* ) &Task2_Handle);
                                                                  
                        vTaskDelete(TaskCreate_Handle);               
}
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

8

帖子

0

蝴蝶豆

初级会员

最后登录
2019-6-26
 楼主| 发表于 2018-10-8 15:12:25 | 显示全部楼层
hu9977 发表于 2018-10-8 14:35
vTaskDelay可以引起调度,这个是入门最容易弄的,后面还有信号量,队列,邮箱等等都可以引起调度 ...

明白了,谢谢
回复 支持 反对

使用道具 举报

该用户从未签到

8

主题

131

帖子

9

蝴蝶豆

金牌会员

最后登录
2020-9-9
发表于 2018-10-8 15:30:09 | 显示全部楼层
pretty868 发表于 2018-10-8 12:02
改为延时50和延时100均不行,异常问题依旧,任务1能正常,任何2不执行

你看你的中断触发时间,同时也要保证一点单个任务运行的时间不能大于你的时标间隔。所以如果你的时标是us级的,你可以尝试将Delay_Ms(500);改为Us级。或者直接使用vTaskDelay()。
回复 支持 反对

使用道具 举报

该用户从未签到

19

主题

182

帖子

32

蝴蝶豆

版主

最后登录
2020-2-21
发表于 2018-10-9 13:09:42 | 显示全部楼层
用   vTaskDelay()   啊,,,你这是死等,建议看看我的文章
回复 支持 反对

使用道具 举报

该用户从未签到

26

主题

1024

帖子

169

蝴蝶豆

论坛元老

最后登录
2021-4-6
发表于 2018-10-10 09:42:34 | 显示全部楼层
基础还是要学的,先学习下操作系统原理吧,否则,大神说听不懂也是个问题。
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

10

帖子

0

蝴蝶豆

初级会员

最后登录
2018-10-12
发表于 2018-10-10 16:25:42 | 显示全部楼层
我认为这是个优先级的问题,任务1的优先级高于任务2,。方式1,:在调用vTaskDelay(500) 函数后,任务1/2进入阻塞状态,启动调度器,CPU运行的是空闲任务,直到定时时间到,任务1/2是几乎并行执行,都能正常;
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

10

帖子

0

蝴蝶豆

初级会员

最后登录
2018-10-12
发表于 2018-10-10 16:30:42 | 显示全部楼层
方式2:任务1用的是无任务调度的Delay_Ms(500)函数, 这样的话任务1就一直可以运行的状态,CPU不存在阻塞空闲,根据优先级任务1高于任务2,只有优先级高的任务1得到运行
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

10

帖子

0

蝴蝶豆

初级会员

最后登录
2018-10-12
发表于 2018-10-10 16:33:54 | 显示全部楼层
方式3:任务1、2用的都是无任务调度的Delay_Ms(500)函数,同方式2,只有任务1得到运行。如果把任务1、2的优先级改成相同,则方式3也是可以正常运行的
回复 支持 反对

使用道具 举报

该用户从未签到

14

主题

76

帖子

9

蝴蝶豆

金牌会员

最后登录
2023-12-5
发表于 2020-2-10 22:21:32 | 显示全部楼层
如果没有反应,应该是延时函数Delay_Ms没有加FreeRTOS的内核函数进行调度
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-29 23:39 , Processed in 0.213906 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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