Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос про вложенность структур и объеденений.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Igor_U
Не работает программа вероятно из-за сложной конструкции. Хочу узнать - я облажался при описании конструкции, или для AVR GCC так писать нельзя?
В данном случае произвольно портится флаг ResultStruct.Status.Valve.Power. Из программы были убраны все обращения к этой структуре, кроме обращения к флагам. Программа заработала только после того, как union для флагов был вытащен из структуры. Но мне необходимо, чтобы флаги находились в структуре. Поэтому видимо придется работать с байтом через маски?

Код
struct
    {
    uint16_t VoltageOff;
    uint16_t CurrentOff;
    uint16_t VoltageOn;
    union
        {
        uint16_t Word;
        union
            {
            uint8_t Byte;
            struct
                {
                uint8_t Power:1;
                uint8_t On:1;
                uint8_t Full:1;
                };
            }Valve;
        union
            {
            uint8_t Byte;
            struct
                {
                uint8_t On:1;
                uint8_t Full:1;
                };
            }Ready;
        }Status;
    }ResultStruct;
IgorKossak
Если стандарт допускает подобную вложенность конструкций, то я не думаю, что AVR GCC не в состоянии это обеспечить. Тем более, что компиляция проходит без ошибок.
1. Было бы легче разобраться, если бы Вы приаттачили весь код.
2. Если в фоновой задаче происходит обращение к одному флагу, а в прерывании - к другому, то вполне возможна порча флагов.
Igor_U
Цитата
1. Было бы легче разобраться, если бы Вы приаттачили весь код.


Код занимает 5 кило, представляете, как это выглядит в исходниках smile.gif .

Цитата
2. Если в фоновой задаче происходит обращение к одному флагу, а в прерывании - к другому, то вполне возможна порча флагов.


Это исключенно, так как программа заработала после того, как я флаги вынес из структуры, т.е. я больше ничего не менял. Есть конечно еще одно объяснение - где-то некорректно работаю со структурой, т.е. порчу данные некорректным обращением. Но я убрал все обращения к структуре, кроме работы с этими флагами. Попробую проверить адресацию в ассемблерном коде... может это поможет понять причину.

Спасибо за ответ.
_Sam_
Может вы немного запутались в union, у вас
Valve.Power = Ready.On
Valve.On = Ready.Full
Или так задумано - одни и те же биты с разными именами?
Igor_U
Цитата
Может вы немного запутались в union,


Ай да _Sam_, ай да молодец! Конечно запутался. Вот спасибо. Выручил.
BVU
Как инициируется (объявляется) структура - глобально или нет? Попробуйте отследить область действия переменных.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.