renzheshengui 发表于 2025-7-11 15:23

FreeRTOS创建任务时的堆栈大小问题

FreeRTOS创建任务函数

BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
                            const char * const pcName,
                            const configSTACK_DEPTH_TYPE usStackDepth,
                            void * const pvParameters,
                            UBaseType_t uxPriority,
                            TaskHandle_t * const pxCreatedTask )

参数描述:
pvTaskCode
      函数指针,可以简单地认为任务就是一个C函数。
      它稍微特殊一点:***不退出,或者退出时要调用"vTaskDelete(NULL)"
pcName
      任务的名字,FreeRTOS内部不使用它,仅仅起调试作用。
      长度为:configMAX_TASK_NAME_LEN
usStackDepth
      每个任务都有自己的栈,这里指定栈大小。
      单位是word,比如传入100,表示栈大小为100 word,也就是400字节。
      最大值为uint16_t的最大值。
      怎么确定栈的大小,并不容易,很多时候是估计。
pvParameters

      调用pvTaskCode函数指针时用到:pvTaskCode(pvParameters)
uxPriority
      优先级范围:0~(configMAX_PRIORITIES – 1)
      数值越小优先级越低,:更高优先级的、或者后面创建的任务先运行。
      如果传入过大的值,xTaskCreate会把它调整为(configMAX_PRIORITIES – 1)
pxCreatedTask
      用来保存xTaskCreate的输出结果:task handle。
      以后如果想操作这个任务,比如修改它的优先级,就需要这个handle。
      如果不想使用该handle,可以传入NULL。
返回值
      成功:pdPASS;
      失败:errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY(失败原因只有内存不足)
      注意:返回值是pdFAIL不对。
      pdFAIL是0,errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY是-1。

其中堆栈大小,是受到配置文件FreeRTOSConfig.h中的宏定义configTOTAL_HEAP_SIZE限制的,堆栈大小不能超过宏定义的大小。



————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_45324318/article/details/148792204

旧时光放映机 发表于 2025-7-12 08:23

确实,确定任务的堆栈大小是一个需要仔细考虑的问题。一般来说,堆栈大小取决于任务的复杂度和它需要处理的数据量。如果任务很简单,可能只需要几十个word的栈空间;但如果任务复杂,可能需要几百甚至上千个word。建议在实际应用中,先给一个估计值,然后通过调试工具检查是否有堆栈溢出的情况,再根据实际情况调整。
页: [1]
查看完整版本: FreeRTOS创建任务时的堆栈大小问题