su-409464 发表于 2016-7-11 18:48:05

关于 FreeRTOS xTaskCreate 函数usStackDepth 的疑问

#define configMINIMAL_STACK_SIZE         ( ( uint16_t ) 128 )
#define configTOTAL_HEAP_SIZE         ( ( size_t ) ( 2 * 1024 ) )
configuration file 里面 这两个选项是按照 nucleo 提供的 例子,填的。

main 函数中只做了 一个LEDtoggle 的 task

int main(void){
HAL_Init();

/* Configure the system clock to 2 MHz */SystemClock_Config();

//BSP driver initBSP_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这个值应该填多少合适呢?有没有 依据 可以参考?

makc 发表于 2016-7-11 19:03:48

http://www.freertos.org/FAQMem.html#StackSize

whtt 发表于 2016-7-11 23:28:36

#define configTOTAL_HEAP_SIZE         ( ( size_t ) ( 2 * 1024 ) )
你定义的任务堆栈大小是2048byte
如果
xTaskCreate( vTaskLEDBlink, "vTaskLED", 512, NULL, 2, &xHandleTaskLED );
请注意奥,这里的512是按4字节算的哦,512是512word,也就是2048byte
再弄个idle空任务的话,函数堆栈都出界了,所以执行错误。
由于是软件错误,跟编译和硬件没关系,所以不报错

因此,freertos的堆栈空间分配和中断嵌套是需要深入学习和一定要注意的地方

犹豫的大三 发表于 2016-7-12 10:26:59

那堆得大小要如何限定呢?可以检测出已使用的空间大小吗

发表于 2016-7-13 09:38:41

一般1024或者512就足够了。.MAP文件。可以看一下对应任务占用的代码空间。

su-409464 发表于 2016-7-14 08:55:32

whtt 发表于 2016-7-11 23:28
#define configTOTAL_HEAP_SIZE         ( ( size_t ) ( 2 * 1024 ) )
你定义的任务堆栈大小是2048byte
如 ...

精辟,就是这个原因。

所以我觉得一开始 还是要先把 configuration 这个文件 里面的每个项 大概看一下,具体什么意思。

但是网上很大教 移植的都遗漏了 这一点。

所以即便你一步步按照别人 的方法进行移植, 后面程序跑起来 很多东西 也你迷迷糊糊的。。。

页: [1]
查看完整版本: 关于 FreeRTOS xTaskCreate 函数usStackDepth 的疑问