我正在将许多C驱动程序集成到C ++集成的嵌入式项目中。 转向OOP方法后,我将函数和变量组织为类,每个类都代表一个系统模块。
声明全局对象,包括编译器RTS库启动代码,以在程序执行到达main()
之前使用其构造函数来构建它们。
这会延迟watchdog_timer的禁用功能,该功能是从main()
调用的,因此系统无法启动。
我有一个全局对象,其中包含其他对象作为成员,每个对象都有其非平凡的构造函数;在全局对象构造函数的开头停止监视程序计时器并不能解决问题。
如何解决?
答案 0 :(得分:1)
创建一个WatchDog
类来处理启动,停止和踢出它。如果必须使用较大的全局变量,请实例化WatchDog
作为第一个成员。它的构造函数应该关闭看门狗。当一切准备就绪时,您可以在main
中启动它。
同意这样的评论:拥有庞大的全局类是一种不好的代码味道。我已经完成了一堆大小不一的嵌入式系统,而无需使用全局变量。
答案 1 :(得分:0)
如果在第一个成员对象构造函数的开头执行相同的指令,该问题似乎可以解决,该指令在容器类one之前被调用。
让我们上一堂课:
class A
{
object B;
object C;
object D;
// ...
public:
A(void);
// ...
};
A::A()
{
Stop_WatchDog();
// ...
}
类似下面的代码将重现该问题:
A myContainerObject;
int main()
{
Stop_WatchDog();
}
除非B
更改为:
class B
{
// ...
public:
B(void);
// ...
}
B::B()
{
Stop_WatchDog();
// ...
}
因此,通常,看门狗定时器应在程序首次初始化的全局对象的第一个成员构造函数的开始处停止。