完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
存储管理的例程(例12-1)里面,为什么第一次按KEY_UP最多可以按五次,KEY_1释放完以后,之后KEY_UP就最多只能按2次了?否者程序就卡死了。KEY_2申请外部SRAM时的现象也一样,求大神解答为什么?
|
|
相关推荐
4个回答
|
|
内存没释放!导致内存泄露!
|
|
|
|
怎么突然就变成最佳答案了?虽然前面KEY_UP按了5次,但是都按KEY_1释放完了呀,之后KEY_UP才按了3次程序就死掉了,理论上都没有内存泄露
|
|
|
|
用串口接一下发现释放缓存的函数并没有什么卵用,KEY_UP按了两次后,再按两次KEY_1,之后再按KEY_UP,他申请的地址不是重新来过的。这样释放OSMemPut()函数就没什么卵用了..
|
|
|
|
视频上说是内存泄漏,上面的那位回答者也说是内存泄漏,解释太过于笼统!导致内存泄漏的原因有很多,该处具体是怎么导致的没有说。我的观点如下。
首先我们知道,每次申请一个存储块,FreeListPtr便会指向下一个存储块的首地址,同时返回申请到的存储块的首地址。 你看代码: switch(key) { case WKUP_PRES: //按下KEY_UP键 internal_buf=OSMemGet((OS_MEM*)&INTERNAL_MEM, (OS_ERR*)&err); if(err == OS_ERR_NONE) //内存申请成功 { ...... 每次申请一个一个存储块,返回申请到的存储块的首地址都是放在变量internal_buf中。 (注意:在释放存储块的时候,我们必须知道该存储块的首地址。) 于是,如果我们连续申请存储块,当我们申请第一个存储块的时候,其首地址放在internal_buf中;紧接着我们不释放它,而是继续申请下一个存储块,其首地址仍然放到internal_buf中。看到没,第一个存储块的首地址被覆盖掉了!!! 我们不知道第一个存储块的首地址,所以不可能再将第一个存储块释放掉了。(你可以通过串口打印来验证,你连续申请几个存储块,再按键释放,会发现地址不会再返回去了) 所以,当我们用发烧友给的代码连续申请几个存储块后,仅能释放最后申请的存储块。(注意在释放存储块时,并没有改变internal_buf变量,只是调整FreeListPtr指针,让其指向上一个存储块)。 解决方案!!! 定义不同的变量去存放申请到的存储块的首地址即可,而不是向发烧友的例程代码里把所有申请到的存储块的首地址都放在internal_buf变量中。 OSMemPut((OS_MEM* )&INTERNAL_MEM, //释放内存 (void* )【这里放哪个存储块的首地址,就会释放哪个存储块】, (OS_ERR* )&err); 另外注意,比如我们在连续申请了三个存储块后,得到这三个存储块的首地址,我们放在数组internal_buf[2]中,我们在释放存储块的时候,也要按顺序释放,也就是先释放internal_buf[2]指向的存储块,再释放internal_buf[1]指向的存储块,最后释放internal_buf[0]指向的存储块。这样FreeListPtr指针才能最终指向第一个存储块,回到申请存储块之初的状态! |
|
|
|
只有小组成员才能发言,加入小组>>
772 浏览 0 评论
1148 浏览 1 评论
2527 浏览 5 评论
2858 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2709 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1065浏览 3评论
190浏览 2评论
453浏览 2评论
366浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
453浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 00:25 , Processed in 1.298595 second(s), Total 85, Slave 66 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号