标签:重入 调用 函数 中断 不可 stm32 注意事项 处理函数
一 前记
最近在公司的一个项目中碰到一个解决了定位很久的 bug , bug 找到的时候发现犯了很低级的错误——在中断处理函数中调用了 printf 函数,因为中断处理函数的调用了不可重入函数,导致接收到莫名其妙的数据。后面通过定位才发现这个是因为里面调用了不可重入函数导致的。那么,
-
那什么是不可重入函数呢?
-
为什么中断处理函数不能直接调用不可重入函数?
-
怎样写可重入函数?
二 概念
可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入 OS 调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。
满足下列条件的函数多数是不可重入的:
-
函数体内使用了静态(static)的数据结构;
-
函数体内调用了 malloc() 或者 free() 函数;
-
函数体内调用了标准 I/O 函数;
在多任务系统下,中断可能在任务执行的任何时间发生;如果一个函数的执行期间被中断后,到重新恢复到断点进行执行的过程中,函数所依赖的环境没有发生改变,那么这个函数就是可重入的,否则就不可重入。
三 总结
1 总而言之,中断处理函数做的事情越简单越好。
2 戒律:中断服务程序里,尽量不要调用不可重入函数,比如printf,malloc 函数等。
标签:重入,
调用,
函数,
中断,
不可,
stm32,
注意事项,
处理函数
From: https://www.cnblogs.com/dylancao/p/18026765