系统设置2个任务,系统运行时出现一些异常现象,请问有没有遇到过?是什么原因引起的? 方式1:系统运行正常 void Task1_Task(void * pvParameters) { while(1) { vTaskDelay(500); //延时函数(任务调度) printf("Task1\r\n"); //串口打印 } } void Task2_Task(void * pvParameters) { while(1) { Delay_Ms(500); //延时函数(无任务调度) LED_TOGGLE; //LED闪烁(取反) } } 方式2:任务1正常,任务2没反应,LED不闪烁 void Task1_Task(void * pvParameters) { while(1) { Delay_Ms(500); //延时函数(无任务调度) printf("Task1\r\n"); //串口打印 } } void Task2_Task(void * pvParameters) { while(1) { vTaskDelay(500); //延时函数(任务调度) LED_TOGGLE; //LED闪烁(取反) } } 方式3:任务1正常,任务2没反应,LED不闪烁 void Task1_Task(void * pvParameters) { while(1) { Delay_Ms(500); //延时函数(无任务调度) printf("Task1\r\n"); //串口打印 } } void Task2_Task(void * pvParameters) { while(1) { Delay_Ms(500); //延时函数(无任务调度) LED_TOGGLE; //LED闪烁(取反) } } |
想用STMF103ZET6产生两路频率、占空比、相位均可变的方波的话,相位和占空比可调是不是没有办法同时实现啊,只能实现其中一个吗
STM32F103ZET6 产生频率、占空比可变的pwm波
STM32F103RCT6使用bootloader跳转到app后无法操作SD卡。
STM32CubeIDE printf浮点数,浮点数丢失数值
如何添加一个中断服务函数?
STM32F107使用ETH的远程唤醒功能,怎么配置唤醒帧过滤寄存器
STM32F1HAL,TIM2定时printf打印出现丢数值
STM32F1HAL,printf固定浮点数,出现丢数值
STM32F103中文档问题——TIM输出源“ENABLE”问题
STM32F103 的主频72M不变,如何自定义SPI波特率为12M?
我系统里面有个创建任务的函数(创建任务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);
}
while(1)
{
Delay_Ms(500); //延时函数(无任务调度)
printf("Task1\r\n"); //串口打印
}
这个不会引起任务调度,会一直执行这个while循环。vTaskDelay会引起任务的调度,任务会交替执行。所以你如果想交替执行,你在上面的任务里加一个vTaskDelay()也可以。
Delay_Ms()是软件延时,死循环等待。
原来的优先级:
#define TASK1_TASK_PRIO 2
#define TASK2_TASK_PRIO 3
改为如下:问题依旧
#define TASK1_TASK_PRIO 3
#define TASK2_TASK_PRIO 2
改为如下:问题依旧
#define TASK1_TASK_PRIO 2
#define TASK2_TASK_PRIO 2
评分
查看全部评分
改为延时50和延时100均不行,异常问题依旧,任务1能正常,任何2不执行
Delay_Ms()是软件延时,死等吗?
在操作系统中最好不要用死等,除非任务之间有些条件,不得不这么做。
vTaskDelay()是任务阻塞时间,也就是释放当前任务时间,可以在这段时间内可以去执行别的任务。
任务优先级高的,可以打断优先级低的;但是不能打断同级别或高级别的。
一旦高优先级任务,来一个死等,那么其它同级或低级别的只能干瞪眼,执行不上任务。
你把两个任务的优先级掉换一下试试,数值大的优先级高,小的优先级低
评分
查看全部评分
评分
查看全部评分
为什么方式2和方式3的结果是正常呢?能否解析一下。我把LED反转的函数换成printf,任务1正常,任务2依然没执行,没有串口数据输出
嗯嗯,我是刚接触RTOS。
按照您的意思,是不是所有的任务里面都需要有vTaskDelay才会以前任务调度,系统才能正常的跑起来?
vTaskDelay可以引起调度,这个是入门最容易弄的,后面还有信号量,队列,邮箱等等都可以引起调度
明白了,谢谢
你看你的中断触发时间,同时也要保证一点单个任务运行的时间不能大于你的时标间隔。所以如果你的时标是us级的,你可以尝试将Delay_Ms(500);改为Us级。或者直接使用vTaskDelay()。