esp32 怎么分配freertos 堆栈大小_使用freertos如何确定分配堆栈空间大小

在资源有限的MCU上运行FreeRTOS时,合理分配堆和任务堆栈空间至关重要。文章探讨了如何确定FreeRTOS的heap大小,建议通过预估任务、队列和其他内存需求来初始设定,并利用xPortGetFreeHeapSize()和xPortGetMinimumEverFreeHeapSize()API进行动态调整。至于任务堆栈,由于其复杂性,通常需要预分配适当空间,并通过uxTaskGetStackHighWaterMark()API监控高水位标记以优化。
摘要由CSDN通过智能技术生成

运行freertos系统的大部分都是资源有限的MCU,所以对于ram我们都要考虑尽量的节省,避免资源浪费,从而也可以针对项目选择性价比更好的mcu。

首先要配置freertos的堆(heap)空间,创建任务我们还需要为每个任务分配栈(stack)空间,那么针对freertos的堆栈空间到底该如何确定?

freertos从V9版本以后同时支持静态内存和动态内存分配方式。静态内存分配在编译时候就会对freertos的内核对象分配ram空间。动态分配都是在程序运行起来以后从堆空间上分配的。这里我们也只讨论动态内存分配,动态内存分配的好处是可以在删除对象的时候释放掉内存的空间。从而保证ram的可持续利用!

先看下图弄清楚freertos的heap空间和任务栈空间的不同与联系。

56cf85b06eab670d64f77ad906f31b66.png

假设在freertos的配置选项中已经配置使用动态内存分配方式。如上图所示,其他比如任务或者队列或者用户使用 pvPortMalloc() 分配的空间都从heap堆上面划分。所以我相信你不会做把任务栈分配的比heap堆还大的傻事!

好了,这个关系搞清楚,那么又该如何定heap的空间大小呢,可以先进行一个粗略的计算,假设任务1分配2kbytes栈,任务2分配3kbytes栈,队列大概占1k,用户malloc大概2k,这么算一共就是8k。那么在资源有限的情况下可以先把heap空间分个15k。

因为程序运行起来实际占用heap的空间不好计算那么准&#x

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 MicroPython-ESP32 中,使用 `task_create()` 函数可以创建一个新的任务。该函数的原型如下: ```c TaskHandle_t task_create(void (*task)(void *arg), const char *name, uint16_t stack_size, void *params, uint8_t priority, TaskHandle_t *handle); ``` 参数说明: - `task`:指向任务函数的指针,该任务函数的参数是一个指向 void 的指针,返回值是 void。 - `name`:任务的名称,可以是一个字符串。 - `stack_size`:任务的堆栈大小,以字节为单位。 - `params`:传递给任务函数的参数,可以是一个指向 void 的指针。 - `priority`:任务的优先级,取值范围是 0 到 configMAX_PRIORITIES-1,其中 configMAX_PRIORITIES 是 FreeRTOS 配置中指定的最大优先级数。 - `handle`:指向任务句柄的指针,用于接收任务句柄。 任务创建成功后,会返回一个任务句柄,可以使用该句柄来操作该任务。 下面是一个示例代码,演示了如何创建一个简单的任务: ```python import _thread def task_func(arg): print(arg) _thread.start_new_thread(task_func, ("Hello, world!",)) ``` 在这个示例中,我们使用 `_thread.start_new_thread()` 函数来创建一个新的任务。该函数接受两个参数:任务函数和参数。任务函数需要是一个可调用的对象,参数可以是任意类型的对象。在这个例子中,我们创建了一个名为 `task_func` 的函数,并向它传递了一个字符串参数 "Hello, world!"。函数内部简单地打印了该参数。 由于 Python 的 GIL 限制,MicroPython-ESP32 中的线程是伪线程(pseudo-thread),实际上是通过 FreeRTOS 实现的任务。因此,使用 `_thread.start_new_thread()` 函数来创建任务,实际上就是调用了 FreeRTOS 的 `task_create()` 函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值