ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

中断函数里不能用动态内存申请和释放

2020-11-02 11:34:41  阅读:407  来源: 互联网

标签:malloc 函数 中断 互斥 线程 内存 动态内存


一个是只要是内存动态申请,必然涉及到了堆,所以必然是要做共享资源保护的,FreeRTOS里,用了临界区,没毛病。第二,只要是内存的动态管理,必然涉及到了复杂的算法,他的运行时间是带有很强的不确定性的。在中断里跑算法,跑耗时的操作,只会是坑你自己而已。

 

当你在一个多线程环境内使用堆时,会出现一类新的问题。堆变成一个共享的资源,因此引发了全部和资源共享有关的麻烦,新问题是:
 malloc() 和 free() (常常)是不可重入的,也就是说,它们不能从多个执行线程被安全的调用。
 可以通过使用一个互斥体保护 malloc() , free() , realloc() 这类函数来弥补重入的问题,互斥体 mutex 仅允许每次一个线程存取共享的堆。然而,这个方案可能造成过度的线程阻塞(特别是如果内存管理是不可确定的)并且可以显著的降低并行性。互斥体也可以造成优

先级倒置。一般的,被一个互斥体保护的堆管理函数不适用于 ISR 因为 ISR 不能阻塞。

 

所以说,在中断里malloc,和作死没啥区别


当然,也有些说是临界保护还有优先级有关,这个也是,但总的来说是为了防止不安全的操作发生,系统给了一些限制,在中断里面,只有指定的函数可用

 

 

注:中断中绝不可使用无“FromISR”结尾的API函数

标签:malloc,函数,中断,互斥,线程,内存,动态内存
来源: https://www.cnblogs.com/mynight2012/p/13913541.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有