当若干个任务均需要使用某些基本处理功能时,为简化设计,通常将这些基本处理功能单独编写为一个公共函数,供不同任务调用。那么问题就出现了:如果一个任务正在调用某个公共函数时被另一个高优先级的任务抢占,当这个高优先级的任务也调用这个公共函数时,则极有可能破环原任务的数据。为防止此情况的发生,通常采用两种措施:互斥调用和可重入设计。
1) 互斥调用:如果公共函数比较简单,运行时间比较短,可以先关中断在调用公共函数,调用结束后再开中断,从而避免其他任务打扰。如果公共函数比较复杂,运行时间比较长,就不能采取上述方法,此时最好为公共函数配置一个互斥信号量,任何任务在调用公共函数之前都必须首先取得对应的互斥信号量,否则就会被挂起。
2) 可重入设计:可重入函数允许多个任务嵌套调用,各个任务的数据相互独立,互不干扰。将公共函数设计为可重入函数的关键是不使用公共资源,可重入函数的所有变量均为局部变量。由于局部变量只有在调用的时候才被分配存储空间,不同的任务在不同的时刻调用该函数,他们的同一个局部变量分配的存储空间并不相同,故互不干扰。