hu9977
发表于 2018-10-8 14:35:39
pretty868 发表于 2018-10-8 14:31
嗯嗯,我是刚接触RTOS。
按照您的意思,是不是所有的任务里面都需要有vTaskDelay才会以前任务调度,系统 ...
vTaskDelay可以引起调度,这个是入门最容易弄的,后面还有信号量,队列,邮箱等等都可以引起调度
pretty868
发表于 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);
}
pretty868
发表于 2018-10-8 15:12:25
hu9977 发表于 2018-10-8 14:35
vTaskDelay可以引起调度,这个是入门最容易弄的,后面还有信号量,队列,邮箱等等都可以引起调度 ...
明白了,谢谢
程序员
发表于 2018-10-8 15:30:09
pretty868 发表于 2018-10-8 12:02
改为延时50和延时100均不行,异常问题依旧,任务1能正常,任何2不执行
你看你的中断触发时间,同时也要保证一点单个任务运行的时间不能大于你的时标间隔。所以如果你的时标是us级的,你可以尝试将Delay_Ms(500);改为Us级。或者直接使用vTaskDelay()。
xiaojie0513
发表于 2018-10-9 13:09:42
用 vTaskDelay() 啊,,,你这是死等,建议看看我的文章
select326
发表于 2018-10-10 09:42:34
基础还是要学的,先学习下操作系统原理吧,否则,大神说听不懂也是个问题。
﹌ 烟、熏黄了手指
发表于 2018-10-10 16:25:42
我认为这是个优先级的问题,任务1的优先级高于任务2,。方式1,:在调用vTaskDelay(500) 函数后,任务1/2进入阻塞状态,启动调度器,CPU运行的是空闲任务,直到定时时间到,任务1/2是几乎并行执行,都能正常;
﹌ 烟、熏黄了手指
发表于 2018-10-10 16:30:42
方式2:任务1用的是无任务调度的Delay_Ms(500)函数, 这样的话任务1就一直可以运行的状态,CPU不存在阻塞空闲,根据优先级任务1高于任务2,只有优先级高的任务1得到运行
﹌ 烟、熏黄了手指
发表于 2018-10-10 16:33:54
方式3:任务1、2用的都是无任务调度的Delay_Ms(500)函数,同方式2,只有任务1得到运行。如果把任务1、2的优先级改成相同,则方式3也是可以正常运行的
hejun96
发表于 2020-2-10 22:21:32
如果没有反应,应该是延时函数Delay_Ms没有加FreeRTOS的内核函数进行调度