简单来说
-
可重入函数就是可以被中断的函数,该函数可以在被执行时中断而不会出现错误
-
不可重入函数由于调用了一些系统资源,如全局变量区,中断向量表等,被中断的话可能出现问题,所以不能在多任务环境下运行
一般满足下列条件的函数多数是不可重入的:
(1)函数体内使用了静态的数据结构;
(2)函数体内调用了malloc()或者free()函数;
(3)函数体内调用了标准I/O函数。
下面是一个ISR:
__interrupt double compute_area (double radius)
{
double area = PI * radius * radius;
printf("\nArea = %f", area);
return area;
}
上述函数的错误之处:
- 中断服务函数ISR不能返回值,不能传参
- 浮点一般是不可重入的,有些处理器/编译器不允许在ISR中做浮点运算
- printf函数一般存在不可重入问题
编写可重入函数尽量不使用全局变量,静态变量。若使用全局变量,要通过信号量,关中断等手段进行保护