本期话题
在嵌入式程序开发过程中,经常会遇到一个函数被多次重复调用,或者被多个任务并发调用。那么如何保证被调用的函数执行结果不受影响呢?
这就引出了可重入函数。今天简单来聊一聊可重入函数。
聊一聊
首先来解释一下什么是可重入函数:函数在执行过程中可以被随时打断,但是其运行结果不受影响,那么这样的函数为可重入函数。否则,就是不是可重入函数。
如何判断可重入函数呢?判断依据有以下几点,若函数满足其中任何一个,那么这个函数就是不可重入的:
(1)函数内部使用了全局变量或静态局部变量。多次调用,全局变量和静态局部变量改变会影响运行结果。
(2) 函数返回值是一个全局变量或静态变量。多次调用,返回的值受到上一次运行结果的影响。
(3) 函数内部调用了malloc()/free()函数。因为 malloc()/free() 是不可重入函数。
(4) 函数内部使用了标准I/O函数。标准I/O函数是不可重入的,例如printf()。
(5) 函数内部调用了其他不可重入函数。
裸机编程开发过程中,如果中断处理函数和主循环调用相同的函数,则需要考虑可重入问题。
在多任务(多线程)编程下,如果该函数可能被多次调用,或者在执行过程中可能会被中断或被任务调度器打断,就要考虑该函数的可重入问题了。
如何让一个函数变得可重入呢?方法其实也很简单,避免以上5点内容。
另外,说如果在函数中使用全局变量,一定要注意同步与互斥,要对全局变量加以保护(如关闭中断、用互斥锁等)。
在实际编程经常会用到这些函数:C标准库函数、第三方库函数、框架接口函数、操作系统的API函数,以及自定义函数等。
很多时候我们调用的函数只能通过头文件看到其函数原型声明,并无法真正看到其内部实现,所以在调用这些函数的过程中要特别注意,要看这些函数是否是可重入的 。
--- END ---
关注【白话嵌入式】,轻松学习嵌入式。
觉得文章不错,请点“分享”、“赞”、“在看” 吧!