可重入函数
-
可重入函数
若对所使用的全局变量不加以保护,则此函数就不具有可重入性,即当多个进程调用此函数时,很有可能使有关全局变量变为不可知状态。
-
可重入函数示例
假设GlobalVar是int型全局变量,函数Squre_GlobalVar返回GlobalVar的平方值。那么如下函数不具有可重入性。
unsigned int Example( int para ) { unsigned int temp; GlobalVar = para;
temp = GlobalVar*GlobalVar; return temp; }
此函数若被多个进程调用的话,其结果可能是未知的,因为当赋值语句GlobalVar = para;刚执行完后,另外一个使用本函数的进程可能正好被激活,那么当新激活的进程执行到此函数时,将使GlobalVar赋予另一个不同的para值,所以当控制重新回到“temp = GlobalVar*GlobalVar后,计算出的temp很可能不是预想中的结果。此函数应如下改进。
unsigned int example( int para ) { unsigned int temp; [申请信号量操作] //(1) GlobalVar = para; temp = GlobalVar*GlobalVar; [释放信号量操作] //(2) return temp; }
(1)若申请不到“信号量”,说明另外的进程正处于给GlobalVar赋值并计算其平方过程中(即正在使用此信号),本进程必须等待其释放信号后,才可继续执行。若申请到信号,则可继续执行,但其它进程必须等待本进程释放信号量后,才能再使用本信号。
VxWorks中采取的可重入的技术有:
* 任务变量
-
不可重入函数
在实时系统的设计中,经常会出现多个任务调用同一个函数的情况。如果这个函数不幸被设计成为不可重入的函数的话,那么不同任务调用这个函数时可能修改其他任务调用这个函数的数据,从而导致不可预料的后果。不可重入函数在实时系统设计中被视为不安全函数。
满足下列条件的函数多数是不可重入的:
2) 函数体内调用了malloc()或者free()函数;
3) 函数体内调用了标准I/O函数。
问题解答
如何编写可重入的函数?
如何将一个不可重入的函数改写成可重入的函数?
答:把一个不可重入函数变成可重入的唯一方法是用可重入规则来重写它。其实很简单,只要遵守了几条很容易理解的规则,那么写出来的函数就是可重入的。
2) 在和硬件发生交互的时候,切记执行类似disinterrupt()之类的操作,就是关闭硬件中断。完成交互记得打开中断,在有些系列上,这叫做“进入/退出核心”。
3) 不能调用其它任何不可重入的函数。
4) 谨慎使用堆栈。最好先在使用前先OS_ENTER_KERNAL。

浙公网安备 33010602011771号