OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1768|回复: 8

内存申请,tasklist不能正常打印

[复制链接]

29

主题

134

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1241
金钱
1241
注册时间
2013-1-11
在线时间
430 小时
发表于 2023-8-13 18:40:55 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 aozhouduwang 于 2023-8-13 18:46 编辑

复制代码
  1. void TaskList()
  2. {
  3.         char *mytaskstatebuffer;        
  4. //        char mytaskstatebuffer[200];
  5.         printf("--->Free heap: %d bytes\n", xPortGetFreeHeapSize());        /*打印剩余堆栈大小*/

  6.         mytaskstatebuffer = pvPortMalloc(200);                        //申请内存,200个字节
  7.         printf("================================================\r\n");
  8.         printf("任务名\t任务状态\t优先级\t剩余栈\t任务序号\r\n");
  9.         vTaskList(mytaskstatebuffer);
  10.         printf("%s\r\n",mytaskstatebuffer);
  11.         printf("'B'-阻塞, 'R'-就绪, 'D'-删除, 'S'-挂起或阻塞\r\n");
  12.         if(mytaskstatebuffer!=NULL)vPortFree(mytaskstatebuffer);        //释放内存
  13. }
复制代码


直接定义char mytaskstatebuffer[200]可以正常打印vTaskList,================================================
任务名        任务状态        优先级        剩余栈        任务序号
DataDeal_task          R        4        44        5
xxxx               R        3        100        7
xxxx          R        1        104        6
IDLE                   R        0        86        2
Tmr Svc                B        7        118        3
xx    S        5        98        4
如果用内存申请mytaskstatebuffer = pvPortMalloc(200);        ,则无法打印vTaskList

================================================
任务名        任务状态        优先级        剩余栈        任务序号

'B'-阻塞, 'R'-就绪, 'D'-删除, 'S'-挂起或阻塞

请问为什么会这样?pvPortMalloc钩子函数提示内存申请失败。那为什么直接定义数组就可以呢?不是应该在任务栈里面申请的吗

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3316
金钱
3316
注册时间
2016-3-19
在线时间
815 小时
发表于 2023-8-14 08:44:45 | 显示全部楼层
首先   如果提示内存申请失败的话  就要查看一下这个宏定义  configTOTAL_HEAP_SIZE
/* Allocate the memory for the heap. */
#if( configAPPLICATION_ALLOCATED_HEAP == 1 )
        /* The application writer has already defined the array used for the RTOS
        heap - probably so it can be placed in a special segment or address. */
        extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
#else
        static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
#endif /* configAPPLICATION_ALLOCATED_HEAP */
Nothing is impossible
回复

使用道具 举报

0

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3316
金钱
3316
注册时间
2016-3-19
在线时间
815 小时
发表于 2023-8-14 08:48:47 | 显示全部楼层
mytaskstatebuffer = pvPortMalloc(200);                        //申请内存,200个字节

这个函数一般情况下 我是这样的写  mytaskstatebuffer = (char *)pvPortMalloc(200);

再有  申请的字节个数   以stm32为例   是200 * 4 个字节

函数原型是

void *pvPortMalloc( size_t xWantedSize )

这里的 size_t   以stm32为例

typedef unsigned int size_t;
Nothing is impossible
回复

使用道具 举报

29

主题

134

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1241
金钱
1241
注册时间
2013-1-11
在线时间
430 小时
 楼主| 发表于 2023-8-14 11:25:08 | 显示全部楼层
unnormal 发表于 2023-8-14 08:48
mytaskstatebuffer = pvPortMalloc(200);                        //申请内存,200个字节

这个函数一般 ...

你这么一说点醒我了,malloc(200)是800个字节,直接定义char buff[200]是200个字节,所以用malloc会溢出,忘了这茬。多谢,回头试试。
在请教一个问题,所有任务STK_SIZE加起来 *4,在加上xPortGetFreeHeapSize剩余堆栈大小,为什么还是小于configTOTAL_HEAP_SIZE,而且小的还很多,还有什么是从configTOTAL_HEAP_SIZE分的吗,全局变量不是从这里面分吧?单片机RAM小,精打细算,以前都是大容量,可劲浪费没在意过这些。
回复

使用道具 举报

0

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3316
金钱
3316
注册时间
2016-3-19
在线时间
815 小时
发表于 2023-8-14 11:48:36 | 显示全部楼层
aozhouduwang 发表于 2023-8-14 11:25
你这么一说点醒我了,malloc(200)是800个字节,直接定义char buff[200]是200个字节,所以用malloc会溢出 ...

其实这个问题说复杂一点就是要理解RTOS中RAM的分配原则

说简单一点  我觉得您可以这样理解  heap_x.c 这个函数中分配的内存都是 configTOTAL_HEAP_SIZE 里的   或者说它就是一个大的全局数组  通过这个函数申请与释放的
Nothing is impossible
回复

使用道具 举报

0

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3316
金钱
3316
注册时间
2016-3-19
在线时间
815 小时
发表于 2023-8-14 11:54:03 | 显示全部楼层
aozhouduwang 发表于 2023-8-14 11:25
你这么一说点醒我了,malloc(200)是800个字节,直接定义char buff[200]是200个字节,所以用malloc会溢出 ...

RAM小的单片机跑RTOS确实是需要考虑的比较多一些

我用过的跑RTOS最小的RAM为8K  好在功能相对来说没那么复杂   但RAM基本上也都用了  分配RAM确实是花了不少时间
Nothing is impossible
回复

使用道具 举报

29

主题

134

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1241
金钱
1241
注册时间
2013-1-11
在线时间
430 小时
 楼主| 发表于 2023-8-14 13:03:07 | 显示全部楼层
unnormal 发表于 2023-8-14 11:48
其实这个问题说复杂一点就是要理解RTOS中RAM的分配原则

说简单一点  我觉得您可以这样理解  heap_x.c  ...

是的。任务也是从configTOTAL_HEAP_SIZE这来的,所有任务加起来*4 ,在加FreeHeapSize,为什么还是远小于configTOTAL_HEAP_SIZE这个呢?
回复

使用道具 举报

0

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3316
金钱
3316
注册时间
2016-3-19
在线时间
815 小时
发表于 2023-8-15 09:23:54 | 显示全部楼层
aozhouduwang 发表于 2023-8-14 13:03
是的。任务也是从configTOTAL_HEAP_SIZE这来的,所有任务加起来*4 ,在加FreeHeapSize,为什么还是远小于 ...

所有任务加起来*4

加起来的过程是不是忽略了一些字节?
Nothing is impossible
回复

使用道具 举报

0

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3316
金钱
3316
注册时间
2016-3-19
在线时间
815 小时
发表于 2023-8-15 10:38:46 | 显示全部楼层
aozhouduwang 发表于 2023-8-14 13:03
是的。任务也是从configTOTAL_HEAP_SIZE这来的,所有任务加起来*4 ,在加FreeHeapSize,为什么还是远小于 ...

提示一下

以 xTaskCreate 创建任务为例

任务栈大小 usStackDepth
任务控制块大小 TCB_t
总栈字节对齐大小 ucHeap
每块内存的索引大小 BlockLink_t
。。。。。。
有可能还不全  我想到哪些先写哪些吧

当然这个还要和您使用的内存分配函数有关  我以heap_4.c为例

再有就是如果系统中频繁使用任务删除函数  队列删除函数等等的删除函数  也会产生影响  就是所谓的内存碎片
Nothing is impossible
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表