标题
FreeRTOS :在configUSE_PREEMPTION, configUSE_TIME_SLICING ,configIDLE_SHOULD_YIELD 设置为100时,为什么会task1/2都不执行只有空闲任务执行
基本配置:可抢占+非时间片轮转+空闲任务不让步
Task1
void Task1Function(void * param)
{
volatile int i = 0;
while (1)
{
Task1flagnum=1;
Task2flagnum=0;
Task4flagnum=0;
for (i = 0; i < 100000; i++)
{
sum++;
}
flagCalcEnd = 1;
//printf("1");
vTaskDelete(NULL);
}
}
task2
void Task2Function(void * param)
{
while (1)
{
if (flagCalcEnd)
printf("sum = %d\r\n", sum);
Task1flagnum=0;
Task2flagnum=1;
//Task3flagnum=0;
Task4flagnum=0;
}
}
空闲任务钩子函数
void vApplicationIdleHook(){
Task1flagnum=0;
Task2flagnum=0;
Task3flagnum=0;
Task4flagnum=1;
//printf("0");
}
**主函数
**
int main( void )
{
#ifdef DEBUG
debug();
#endif
prvSetupHardware();
printf("Hello, world!\r\n");
//下面NULL这个参数的值就是传给Task1Function的param
xTaskCreate(Task1Function,"xTask1",100,NULL,0,&xHandleTask1);
//xTaskCreate(Task2Function,"xTask2",100,NULL,2,NULL);
xTaskCreate(Task2Function,"xTask2",100,NULL,0,NULL);
//xIdleTask3Handle = xTaskCreateStatic(Task3Function,"xTask3",100,NULL,1,puxTask3StackBuffer,&pxTask3Buffer);
//我自己定义栈的深度是100 //用函数进行实际分配栈大小也就照这个进行分配
//xTaskCreate(TaskGenericFunction,"GenericTask1",100,(void *)4,1,NULL);
//xTaskCreate(TaskGenericFunction,"GenericTask2",100,(void *)5,1,NULL);
/* Start the scheduler. */
vTaskStartScheduler();
/* Will only get here if there was not enough heap space to create the
idle task. */
return 0;
}
预期结果
按照我的配置, 按照我的想法在主函数里注册task1的时候,因为他们都是同优先级 task1应该被放到readylist的第一项所以应该第一个执行,直到删除自己的时候才会调用空闲任务,然后空闲任务一直执行。
实际结果
但是实际情况如上图,空闲任务跳过任务1,一直执行。
请各位帮帮忙呗
应该是我理解方面的问题