完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
使用最新版本的FreeRTOS时,在中断中申请内存,发现使用pvPortMalloc函数申请内存时会调用vTaskSuspendAll这个函数,但这个函数是任务级别的,程序运行时会报错,错误定位在port.c文件441行,不知道有没有更好的方法在实现在中断中申请内存??
|
|
相关推荐
12个回答
|
|
malloc() 和 free() 都(常常)是不可确定的,意味着他们潜在的可能需要一段长的(难以
量化的)执行时间,这直接和实时约束相冲突。尽管一些 RTOS 提供带有条件的,甚至是可 决定性的性能的堆管理算法,他们不能有效的处理多个小的分配。 -------------- 以上选自PsiCC2 这本书 所以说,在中断里mallo,和作死没啥区别 |
|
|
|
|
|
你的中断优先级有没有在FreeRTOS的管理范围中
|
|
|
|
我程序中的中断都在它管理范围内的,定位是临界区出问题。是不是每次任务切换都会进入一次临界区??
|
|
|
|
不要在中断处理函数里malloc
|
|
|
|
当你在一个多线程环境内使用堆时,会出现一类新的问题。堆变成
一个共享的资源,因此引发了全部和资源共享有关的麻烦,新问题是: malloc() 和 free() (常常)是不可重入的,也就是说,它们不能从多个执行线程被安全的 调用。 可以通过使用一个互斥体保护 malloc() , free() , realloc() 这类函数来弥补重入的问题, 互斥体 mutex 仅允许每次一个线程存取共享的堆。然而,这个方案可能造成过度的线程阻 塞(特别是如果内存管理是不可确定的)并且可以显著的降低并行性。互斥体也可以造成优 先级倒置。一般的,被一个互斥体保护的堆管理函数不适用于 ISR 因为 ISR 不能阻塞。 -------------- 以上选自PsiCC2 这本书 |
|
|
|
我看了你说的出处中相关描述,但好像只是说明了这两个函数的缺陷,但现在问题是为什么不在中断中调用这两个函数,你直接得出结论感觉还是有点牵强
|
|
|
|
而且heap4.c中的内存管理函数没有调用这两个函数,耗时的话感觉也不会像这两个函数,不过你的答案确实也让我学到不少,谢谢了。
|
|
|
|
在中断里面申请内存的直接可以拉出去了。
|
|
|
|
初学者,不知能否解释一下?
|
|
|
|
关键的两点。一个是只要是内存动态申请,必然涉及到了堆,所以必然是要做共享资源保护的,FreeRTOS里,用了临界区,没毛病。第二,只要是内存的动态管理,必然涉及到了复杂的算法,他的运行时间是带有很强的不确定性的。在中断里跑算法,跑耗时的操作,只会是坑你自己而已。
|
|
|
|
懂了谢谢
|
|
|
|
只有小组成员才能发言,加入小组>>
780 浏览 1 评论
2197 浏览 5 评论
2497 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2278 浏览 6 评论
2223 浏览 7 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
361浏览 9评论
375浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
487浏览 6评论
358浏览 5评论
389浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-6-26 19:11 , Processed in 1.195843 second(s), Total 100, Slave 81 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191