我创建了一个包含以下任务的项目,并按预期测试了每个任务的周期,但当我更改了任务的堆栈大小(如第二部分所示)时,我观察到的任务未按固定的周期执行。
您能否告诉我该行为的确切根源及其解决方案。
#if 0
/* all task executes with configured period*/
xTaskCreate(vEv_20ms1,"Test_20ms1", 1000, NULL, 23, NULL);
xTaskCreate(vEv_50ms1,"Test_50ms1", 100, NULL, 28, NULL);
xTaskCreate(vEv_50ms2,"Test_50ms2", 100, NULL, 25, NULL);
xTaskCreate(vEv_100ms1,"Test_100ms1", 100, NULL, 1, NULL);
xTaskCreate(vEv_100ms2,"Test_100ms2", 100, NULL, 1, NULL);
xTaskCreate(vEv_100ms3,"Test_100ms3", 100, NULL, 1, NULL);
xTaskCreate(vEv_100ms4,"Test_100ms4", 100, NULL, 1, NULL);
xTaskCreate(vEv_100ms5,"Test_100ms5", 100, NULL, 1, NULL);
xTaskCreate(vEv_100ms6,"Test_100ms6", 100, NULL, 1, NULL);
xTaskCreate(vEv_500ms1,"Test_500ms1", 100, NULL, 1, NULL);
xTaskCreate(vEv_500ms2,"Test_500ms2", 100, NULL, 1, NULL);
xTaskCreate(vEv_500ms3,"Test_500ms3", 100, NULL, 1, NULL);
xTaskCreate(vEv_500ms4,"Test_500ms4", 100, NULL, 1, NULL);
xTaskCreate(vEv_1000ms1,"Test_1000ms1", 100, NULL, 1, NULL);
xTaskCreate(vEv_1000ms2,"Test_1000ms2", 100, NULL, 1, NULL);
#else
/* Task lost its periodicity*/
xTaskCreate(vEv_20ms1,"Test_20ms1", 4000, NULL, 23, NULL);
xTaskCreate(vEv_50ms1,"Test_50ms1", 200, NULL, 27, NULL);
xTaskCreate(vEv_50ms2,"Test_50ms2", 500, NULL, 25, NULL);
xTaskCreate(vEv_100ms1,"Test_100ms1", 1000, NULL, 21, NULL);
xTaskCreate(vEv_100ms2,"Test_100ms2", 1000, NULL, 18, NULL);
xTaskCreate(vEv_100ms3,"Test_100ms3", 200, NULL, 17, NULL);
xTaskCreate(vEv_100ms4,"Test_100ms4", 4000, NULL, 16, NULL);
xTaskCreate(vEv_100ms5,"Test_100ms5", 500, NULL, 15, NULL);
xTaskCreate(vEv_100ms6,"Test_100ms6", 1000, NULL, 14, NULL);
xTaskCreate(vEv_500ms1,"Test_500ms1", 500, NULL, 12, NULL);
xTaskCreate(vEv_500ms2,"Test_500ms2", 400, NULL, 10, NULL);
xTaskCreate(vEv_500ms3,"Test_500ms3", 400, NULL, 8, NULL);
xTaskCreate(vEv_500ms4,"Test_500ms4", 1000, NULL, 6, NULL);
xTaskCreate(vEv_1000ms1,"Test_1000ms1", 1000, NULL, 4, NULL);
xTaskCreate(vEv_1000ms2,"Test_1000ms2", 500, NULL, 2, NULL);
#endif
仅供参考
FreeRTOSConfig.h如下所示
#define configUSE_PREEMPTION 1
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1
#define configUSE_FPU 1
#define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 0
#define configUSE_TRACE_FACILITY 1
#define configUSE_16_BIT_TICKS 0
#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 80000000 ) /* Timer clock. */
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES ( 30 )
#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 128 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) 250000 )
#define configMAX_TASK_NAME_LEN ( 16 )
#define configIDLE_SHOULD_YIELD 1
#define configGENERATE_RUN_TIME_STATS 1
#define configUSE_MALLOC_FAILED_HOOK 0
案例1:工作版本的最大任务几乎具有相同的堆栈和优先级
结果:工作正常
案例2:更改了堆栈和优先级
结果:工作周期异常
案例3:仅更改了与工作版本相关的堆栈大小
结果:滞留在b DataEntry
案例4:仅更改了与工作版本相关的优先级
结果:以预期的周期,正常行为执行
如果是由于数据异常,您能否指导我如何修复? 其调试过程。
配置的堆栈大于所有任务配置的总堆栈,并且任何任务中都没有功能,因此堆栈使用率可能约为20 30字节。
谢谢,此致,
Kishor

