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

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

 

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

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

 

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


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

 

 

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

posted @ 2020-11-02 11:26  上下求索之  阅读(1676)  评论(0编辑  收藏  举报