#define configMINIMAL_STACK_SIZE ( ( uint16_t ) 128 ) #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 2 * 1024 ) ) configuration file 里面 这两个选项是按照 nucleo 提供的 例子,填的。 main 函数中只做了 一个LED toggle 的 task int main(void) { HAL_Init(); /* Configure the system clock to 2 MHz */ SystemClock_Config(); //BSP driver init BSP_Init(); xTaskCreate( vTaskLEDBlink, "vTaskLED", 512, NULL, 2, &xHandleTaskLED ); /* Add your application code here */ vTaskStartScheduler(); /* Infinite loop */ while (1) { } } 当 xTaskCreate( vTaskLEDBlink, "vTaskLED", 512, NULL, 2, &xHandleTaskLED ); 填入512时,程序下载后,LED 没有实现toggle 当 xTaskCreate( vTaskLEDBlink, "vTaskLED", 128, NULL, 2, &xHandleTaskLED ); 填入128时, 程序下载后,LED 可以实现Toggle 。 我不明白的时候 如果填入512 内存不足,为什么没有任何提示? 如果以后 有其他task 这个值应该填多少合适呢? 有没有 依据 可以参考? |
你定义的任务堆栈大小是2048byte
如果
xTaskCreate( vTaskLEDBlink, "vTaskLED", 512, NULL, 2, &xHandleTaskLED );
请注意奥,这里的512是按4字节算的哦,512是512word,也就是2048byte
再弄个idle空任务的话,函数堆栈都出界了,所以执行错误。
由于是软件错误,跟编译和硬件没关系,所以不报错
因此,freertos的堆栈空间分配和中断嵌套是需要深入学习和一定要注意的地方
评分
查看全部评分
精辟,就是这个原因。
所以我觉得一开始 还是要先把 configuration 这个文件 里面的每个项 大概看一下,具体什么意思。
但是网上很大教 移植的 都遗漏了 这一点。
所以即便你一步步按照别人 的方法进行移植, 后面程序跑起来 很多东西 也你迷迷糊糊的。。。
评分
查看全部评分