Переменная Stati c не инициализируется для данного значения - PullRequest
1 голос
/ 11 марта 2020

У меня есть переменная stati c "init" для запуска функции один раз при запуске, (RTOS) , но, похоже, она инициализируется случайным значением. Если я удаляю тег stati c, все отлично работает. (За исключением очевидной проблемы, связанной с запуском функции init при каждом проходе.) Может ли кто-нибудь дать более полное представление о том, почему это не работает или, возможно, лучший способ добиться этого?

Пример кода:

void ManageStructures()
{
    // Variable declarations/definitions
    static uint8_t StructInitialized;
    // Have also tried "static uint8_t StructInitialized = 0", neither worked

    // Function prototypes
    void InitStruct();

    if (!StructInitialized)
    {
        StructInitialized= 1;
        InitStruct();
    }
    Test = StructInitialized;

edit : Прошу прощения за недостаток информации. Это для компании, и я стараюсь не выходить за рамки нашей общедоступной информационной политики. MCU - это серия STM32F7, использующая набор инструментов «Ac6 STM32 MCU G CC». Я не очень разбираюсь в операциях с компилятором, поэтому мне может потребоваться больше времени, чтобы найти ответы на вопросы, связанные с компилятором или make-файлом.

edit : стало ясно, что это проблема с скрипты компилятора или компоновщика, а не мой код. При этом стало совершенно очевидно, что мне нужно больше узнать о наборах инструментов, сценариях компоновщика и компиляторах в целом, прежде чем перейти к root этой проблемы. Я вернусь к этому вопросу, как только стану достаточно знакомым, чтобы дать ценный отзыв или ответить на него сам. Спасибо всем за отзывы и направление!

1 Ответ

7 голосов
/ 11 марта 2020

Обычно встроенные системы работают с кодом «минимального запуска», то есть они никогда не инициализируют .bss или .data во время запуска. Это означает, что если вы напишите что-то вроде static int foo = 42;, код скомпилируется, но переменная никогда не будет установлена.

Это не стандарт * C, поэтому обычно при создании проекта вы получаете опцию из В IDE есть «минимальный» или «стандартный» запуск.

Скорее всего, это так называемый "CRT" (C время выполнения), поставляемый с вашей цепочкой инструментов, а не в ОСРВ. Если вы пошагово выполняете свою программу от того места, где она фактически начинается (вектор сброса), а не от того, откуда запускается main (), вы сможете точно увидеть, что делает и не делает CRT.

К сожалению, отладчики часто используют «неактивный режим», поскольку программисты встроенных систем по умолчанию считаются совершенно некомпетентными в настоящее время. Это означает, что они молча вставляют точку останова в main () и работают до этой точки. Возможно, вам придется «отключить» ваш отладчик, чтобы отладить CRT.

...