OpenEdv-开源电子网

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

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

[复制链接]

29

主题

137

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1379
金钱
1379
注册时间
2013-1-11
在线时间
477 小时
跳转到指定楼层
楼主
发表于 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钩子函数提示内存申请失败。那为什么直接定义数组就可以呢?不是应该在任务栈里面申请的吗

回复

使用道具 举报

29

主题

137

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1379
金钱
1379
注册时间
2013-1-11
在线时间
477 小时
2#
 楼主| 发表于 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小,精打细算,以前都是大容量,可劲浪费没在意过这些。
回复

使用道具 举报

29

主题

137

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1379
金钱
1379
注册时间
2013-1-11
在线时间
477 小时
3#
 楼主| 发表于 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这个呢?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

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

GMT+8, 2026-6-23 08:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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