1前言最近在公司维护的一个项目中,遇到了一个修了很久的bug。发现bug的时候,发现自己犯了一个很低级的错误——在中断处理函数中调用了printf函数,因为中断处理程序调用了一个不可重入函数,导致中断丢失,系统定位报错,直接导致嵌入式linux系统应用进程中所有线程停止,进而导致watchdog进程无法喂食,设备重启。那么什么是不可重入函数呢?为什么中断处理函数不能直接调用不可重入函数呢?在多任务环境下使用,可重入函数简单来说就是一个可以被中断的函数,即在这个函数执行的过程中可以随时被中断,转移到OS调度去执行另一段代码,返回时就会有控制时无差错;不可重入函数使用了一些系统资源,如全局变量区、中断向量表等,因此如果被中断,可能会出现问题,这样的函数无法在多任务环境中运行。大多数满足以下条件的函数都是不可重入的:函数体中使用静态数据结构;malloc()或free()函数在函数体中被调用;在函数体中调用标准I/O函数;A.可重入函数voidstrcpy(char*lpszDest,char*lpszSrc){while(*lpszDest++=*lpszSrc++);///
