完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
请教1个问题,在“例11-1 UCOSIII消息传递”中,有个函数:
//定时器1的回调函数 void tmr1_callback(void *p_tmr,void *p_arg) { u8 *pbuf; static u8 msg_num; OS_ERR err; pbuf = mymalloc(SRAMIN,10);//申请10个字节 if(pbuf)//申请内存成功 { msg_num++; sprintf((char*)pbuf,"ALIENTEK %d",msg_num); //发送消息 OSQPost((OS_Q*)&DATA_Msg, (void*)pbuf, (OS_MSG_SIZE)10, (OS_OPT)OS_OPT_POST_FIFO, (OS_ERR*)&err); if(err != OS_ERR_NONE)//消息队列已满! { myfree(SRAMIN,pbuf);//释放内存 OSTmrStop(&tmr1,OS_OPT_TMR_NONE,0,&err); //停止定时器1 tmr1sta = !tmr1sta; LCD_ShowString(10,150,100,16,16,"TMR1 STOP! "); } } } 为何需要 释放内存呀?去掉后,程序也运行正常! myfree(SRAMIN,pbuf);//释放内存 |
|
相关推荐
16个回答
|
|
|
|
|
|
额,大哥啊,谁告诉你内存申请和释放必须在一个任务中成对出现的!我就不能在任务1中malloc(),在任务2中free()吗?
你看到的定时器回调函数tmr1_callback中一直在申请内存(只有当发送失败的时候才释放内存),函数msgdis_task()却只有释放内存,把这两个函数结合起来看不就对上了!tmr1_callback()函数里面调用OSQPost()发送消息之前肯定要malloc一段内存,msgdis_task()处理掉消息 队列中的消息以后就可以释放掉内存了。 |
|
|
|
说错了,是另一个函数:
|
|
|
|
//显示消息队列中的消息
void msgdis_task(void *p_arg) { u8 *p; OS_MSG_SIZE size; OS_ERR err; while(1) { //请求消息 p=OSQPend((OS_Q*)&DATA_Msg, (OS_TICK)0, (OS_OPT)OS_OPT_PEND_BLOCKING, (OS_MSG_SIZE*)&size, (CPU_TS*)0, (OS_ERR*)&err); LCD_ShowString(5,270,100,16,16,p); myfree(SRAMIN,p);//释放内存 OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err); //延时1s } } |
|
|
|
|
|
|
|
那你应改好好百度内存管理的原理
|
|
|
|
而不是在那异想天开
|
|
|
|
因为这个函数没有申请内存!只看到释放内存,感觉有点特别!
|
|
|
|
//定时器1的回调函数
void tmr1_callback(void *p_tmr,void *p_arg) { u8 *pbuf; static u8 msg_num; OS_ERR err; pbuf = mymalloc(SRAMIN,16);//申请16个字节 if(pbuf)//申请内存成功 { msg_num++; sprintf((char*)pbuf,"ALIENTEK %d",msg_num); //发送消息 OSQPost((OS_Q*)&DATA_Msg, (void*)pbuf, (OS_MSG_SIZE)16, (OS_OPT)OS_OPT_POST_FIFO, (OS_ERR*)&err); if(err != OS_ERR_NONE)//消息队列已满! { myfree(SRAMIN,pbuf);//释放内存 OSTmrStop(&tmr1,OS_OPT_TMR_NONE,0,&err); //停止定时器1 tmr1sta = !tmr1sta; LCD_ShowString(10,150,100,16,16,"TMR1 STOP! "); } } } |
|
|
|
定时器1的回调函数 ,好像也有问题,500mS定时到,就申请1次内存,4个500mS定时到,就申请4次内存。但是,第5次,因为消息队列满了,所以发送消息失败,就关闭定时器。总的来说,申请了5次内存,却只释放1次内存,是否有问题呀?
|
|
|
|
我是初学者,请大家指教!
|
|
|
|
我明白了,定时器1的回调函数 多申请的内存,在“显示消息队列中的消息”任务中释放了。
|
|
|
|
//显示消息队列中的消息
void msgdis_task(void *p_arg) { u8 *p; OS_MSG_SIZE size; OS_ERR err; while(1) { //请求消息 p=OSQPend((OS_Q* )&DATA_Msg, (OS_TICK )0, (OS_OPT )OS_OPT_PEND_BLOCKING, (OS_MSG_SIZE*)&size, (CPU_TS* )0, (OS_ERR* )&err); LCD_ShowString(5,270,100,16,16,p); myfree(SRAMIN,p);//释放内存 OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err); //延时1s } } |
|
|
|
|
|
|
|
在定时器里每发送一条消息,分配一次内存,然后将其加到消息队列里, 正常读消息队列的时候会释放这一块内存,如此循环,不断地生产和消费有何问题?
如果发送失败,那就不应该由读消息队列来释放内存了,而是在本地错误处理处释放掉内存。 逻辑要搞清楚啊。 |
|
|
|
再说,频繁地分配和释放内存,造成大量的内存碎片,这个习惯可不太好
|
|
|
|
只有小组成员才能发言,加入小组>>
676 浏览 0 评论
1098 浏览 1 评论
2463 浏览 5 评论
2795 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2633 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
644浏览 9评论
640浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
771浏览 6评论
617浏览 5评论
659浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-15 23:23 , Processed in 1.290702 second(s), Total 108, Slave 88 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号