{ while(*lpszDest++=*lpszSrc++); *dest=0; } B.不可重入函数1 charcTemp;//全局变量 void SwapChar1(char *lpcX, char *lpcY)
{ cTemp=*lpcX; *lpcX=*lpcY; lpcY=cTemp;//访问了全局变量 } C.不可重入函数2 void SwapChar2(char *lpcX,char *lpcY)
{ static char cTemp;//静态局部变量 cTemp=*lpcX; *lpcX=*lpcY; lpcY=cTemp;//使用了静态局部变量 } 问题1,如何编写可重入的函数? 答:在函数体内不访问那些全局变量,不使用静态局部变量,坚持只使用局部变量,写出的函数就将是可重入的。如果必须访问全局变量,记住利用互斥信号量来保护全局变量。 问题2,如何将一个不可重入的函数改写成可重入的函数? 答:把一个不可重入函数变成可重入的唯一方法是用可重入规则来重写它。其实很简单,只要遵守了几条很容易理解的规则,那么写出来的函数就是可重入的。 1) 不要使用全局变量。因为别的代码很可能覆盖这些变量值。 2) 在和硬件发生交互的时候,切记执行类似disinterrupt()之类的操作,就是关闭硬件中断。完成交互记得打开中断,在有些系列上,这叫做“进入/退出核心”。 3) 不能调用其它任何不可重入的函数。 4) 谨慎使用堆栈。最好先在使用前先OS_ENTER_KERNAL。 堆栈操作涉及内存分配,稍不留神就会造成益出导致覆盖其他任务的数据,所以,请谨慎使用堆栈!最好别用!很多黑客程序就利用了这一点以便系统执行非法代码从而轻松获得系统控制权。还有一些规则,总之,时刻记住一句话:保证中断是安全的! 实例问题:曾经设计过如下一个函数,在代码检视的时候被提醒有bug,因为这个函数是不可重入的,为什么? unsigned int sum_int( unsigned int base )
单片机multiple中断调用子函 相关文章:
Copyright © 2017-2020 微波EDA网 版权所有
网站地图