将全局重构为本地.他们应该是静态的吗?

lan*_*dmn 2 c refactoring static rtos global-variables

我正在重构"意大利面条代码"C模块,以便在多任务处理(RTOS)环境中工作.

现在,有很长的函数和许多不必要的全局变量.

当我尝试用本地替换仅存在于一个函数中的全局变量时,我陷入了两难境地.每个全局变量的行为都像本地"静态" - 例如,即使退出并重新进入函数,也要保持其值.

对于多任务处理,"静态"局部变量是全球最差的.它们使功能不重新进入.

有一种方法可以检查函数是否在保留变量值re-entrancing的情况下进行中继而不跟踪所有逻辑流程?

Ste*_*sop 8

简答:不,根据局部变量的声明是否为静态,没有任何方法可以自动判断函数的行为是否不同.您只需要检查在原始代码中使用全局变量的每个函数的逻辑.

但是,如果用静态局部范围变量替换全局变量意味着该函数不是可重入的,那么当它是全局函数时它也不是可重入的.因此,我不认为将全局更改为静态局部范围变量将使您的函数比它们开始时更少重入.

如果全局实际上仅用于该范围(编译器/链接器在删除全局时应确认),则行为应该接近相同.事情初始化时可能存在或者可能没有问题,我不记得标准是什么:如果C中的静态初始化发生在C++中,当执行第一次到达声明时,那么你可能已经改变了并发安全功能进入非并发安全功能.

确定函数是否对重入是安全的还需要查看逻辑.除非标准另有说明(我没有检查过),否则函数不会自动不可重入,因为它声明了一个静态变量.但是如果它以任何重要的方式使用全局或静态,你可以假设它是不可重入的.如果没有同步,那么假设它也是非并发安全的.

祝你好运.听起来这段代码离你想要的地方很远......