OpenEdv-开源电子网

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

任务共享动态内存问题

[复制链接]

117

主题

598

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
1698
金钱
1698
注册时间
2012-5-10
在线时间
438 小时
发表于 2016-4-30 12:18:42 | 显示全部楼层 |阅读模式
50金钱
目前使用freertos做操作系统,想在任务之间传递消息,由于系统没有邮箱之类的,所以只能采用队列传递消息指针的方式,这样可以节省内存,但是担心申请的内存,会在异常情况下不能释放造成泄漏,请问谁知道任务间共享内存比较安全的方式,或者指点下ucos消息这块的消息申请和释放模式
还有问下原子你的动态申请内存可靠么,会不会时间长了产生碎片

如有技术问题,微信扫头像交流,STM32,JAVA,服务器
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
12212
金钱
12212
注册时间
2015-11-5
在线时间
2117 小时
发表于 2016-4-30 15:42:04 | 显示全部楼层
freertos的heap_4的内存管理方案有碎片回收功能,不需要担心碎片产生的问题。还有你所说的任务间传递消息,为何非得用邮箱?你完全可以使用一个全局数组来模拟UCOS里面的邮箱,然后使用二值信号量来通知其他任务获取消息,如果你还担心多个任务同时向全局数组写数据等问题,你可以对这个数组加一个互斥锁
回复

使用道具 举报

117

主题

598

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
1698
金钱
1698
注册时间
2012-5-10
在线时间
438 小时
 楼主| 发表于 2016-4-30 16:21:54 | 显示全部楼层
FreeRTOS 发表于 2016-4-30 15:42
freertos的heap_4的内存管理方案有碎片回收功能,不需要担心碎片产生的问题。还有你所说的任务间传递消息, ...

不使用全局变量,不利于模块化
而且我发送的消息不是一条啊,根据程序运行状况发送数目和内容都不同,现在是把消息内容用const写在flash上,使用队列发送对应消息的序号,这样不用占什么内存,也不共享内存这么危险
我现在用的是原子的动态内存,不太会用freertos内部的内存管理,可以指点下
如有技术问题,微信扫头像交流,STM32,JAVA,服务器
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
12212
金钱
12212
注册时间
2015-11-5
在线时间
2117 小时
发表于 2016-4-30 16:40:16 | 显示全部楼层
xsx127 发表于 2016-4-30 16:21
不使用全局变量,不利于模块化
而且我发送的消息不是一条啊,根据程序运行状况发送数目和内容都不同,现 ...

既然任务间只是传递一个指针,那么用一个长度为4的队列不就好了,至于队列深度是多少也不是大问题了,毕竟队列长度只有4,就算深度是100,那么也就耗费400字节的队列单元。

freertos的内存管理方案我只研究过heap_2和heap_4,指点就不敢了,至于内存管理的使用都大同小异,需要用到时申请内存,使用完后释放内存。heap_2采用的是最适合空闲块的机制,但不具备碎片回收功能,实际项目测试过稳定性一般,尤其是多个任务申请的内存大小不一样时尤其容易出现碎片,这是heap_2的一个致命性缺陷,《freertos中文使用教程》里面有对heap_2的安全使用作详细说明,有兴趣可以看看。至于heap_4,具有内存碎片回收功能,但不具备heap_2的最适合内存块分配功能,目前公司的项目都采用这套方案,稳定性十分强,建议使用这套方案。至于heap_5听说跟heap_4是一样的,只不过是内外部定义内存空间的区别罢了
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

117

主题

598

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
1698
金钱
1698
注册时间
2012-5-10
在线时间
438 小时
 楼主| 发表于 2016-4-30 16:44:26 | 显示全部楼层
本帖最后由 xsx127 于 2016-4-30 16:48 编辑
FreeRTOS 发表于 2016-4-30 16:40
既然任务间只是传递一个指针,那么用一个长度为4的队列不就好了,至于队列深度是多少也不是大问题了,毕 ...

400字节的内存啊,这还不多啊,
heap_4是你推荐的?有空我也转到4

未完成的工程,这一个地方用400字节真是伤不起的
QQ截图20160430164637.png
如有技术问题,微信扫头像交流,STM32,JAVA,服务器
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
12212
金钱
12212
注册时间
2015-11-5
在线时间
2117 小时
发表于 2016-4-30 16:51:33 | 显示全部楼层
xsx127 发表于 2016-4-30 16:44
400字节的内存啊,这还不多啊,
heap_4是你推荐的?有空我也转到4

如果连400字节的内存都拿不出来,最好还是别跑freertos了,freertos单纯一个任务结构体都花费掉80字节左右的内存,还有信号量、队列、互斥锁等比较常用的本身也会花费掉几十字节的内存。。。

如果单片机SRAM不足4KB的,强烈建议别跑系统,还不如跑裸机来的顺手,尤其是后续功能添加时,跑系统非常吃力
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 02:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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