Остановка сторожевого таймера из конструктора глобальных объектов - PullRequest
0 голосов
/ 08 июня 2019

Я интегрирую несколько драйверов C в интегрированный C ++ встроенный проект. Переходя к подходу ООП, я организую функции и переменные в классы, каждый из которых представляет системный модуль.

Объявляя глобальные объекты, код запуска библиотеки RTS компилятора включен для их построения с использованием их конструкторов до того, как выполнение программы достигнет main(). Это задерживает отключение watchdog_timer, которое вызывается из main(), поэтому система не загружается.

У меня есть один глобальный объект, содержащий другие объекты в качестве членов, каждый из которых имеет свой нетривиальный конструктор; остановка сторожевого таймера в начале конструктора глобального объекта не решает проблему.

Как это можно исправить?

Ответы [ 2 ]

1 голос
/ 08 июня 2019

Создайте класс WatchDog, который будет запускать, останавливать и пинать его. Если вы должны использовать большой глобал, то создайте экземпляр WatchDog в качестве первого члена. Это конструктор должен выключить сторожевой таймер. В main вы можете запустить его, когда все будет готово к запуску.

Согласитесь с комментарием, что наличие гигантского глобального класса - это неприятный запах кода. Я сделал кучу встраиваемых систем, больших и маленьких, без необходимости использовать глобальные переменные.

0 голосов
/ 08 июня 2019

Кажется, что проблема решена, если та же самая инструкция выполняется в начале первого конструктора объекта-члена, который вызывается перед контейнером первого класса.

Давайте возьмем такой класс:

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();
    // ...
}

Итак, в общем случае сторожевой таймердолжен быть остановлен в начале конструктора первого члена инициализированного глобальным объектом программы.

...