реклама на сайте
подробности

 
 
> Вопрос про вложенность структур и объеденений., union & struct в AVR GCC.
Igor_U
сообщение Dec 7 2005, 13:33
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 34
Регистрация: 2-10-05
Пользователь №: 9 141



Не работает программа вероятно из-за сложной конструкции. Хочу узнать - я облажался при описании конструкции, или для 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;
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
IgorKossak
сообщение Dec 7 2005, 13:52
Сообщение #2


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Если стандарт допускает подобную вложенность конструкций, то я не думаю, что AVR GCC не в состоянии это обеспечить. Тем более, что компиляция проходит без ошибок.
1. Было бы легче разобраться, если бы Вы приаттачили весь код.
2. Если в фоновой задаче происходит обращение к одному флагу, а в прерывании - к другому, то вполне возможна порча флагов.
Go to the top of the page
 
+Quote Post
Igor_U
сообщение Dec 7 2005, 14:01
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 34
Регистрация: 2-10-05
Пользователь №: 9 141



Цитата
1. Было бы легче разобраться, если бы Вы приаттачили весь код.


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

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


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

Спасибо за ответ.
Go to the top of the page
 
+Quote Post
_Sam_
сообщение Dec 7 2005, 14:20
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031



Может вы немного запутались в union, у вас
Valve.Power = Ready.On
Valve.On = Ready.Full
Или так задумано - одни и те же биты с разными именами?
Go to the top of the page
 
+Quote Post
Igor_U
сообщение Dec 7 2005, 19:18
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 34
Регистрация: 2-10-05
Пользователь №: 9 141



Цитата
Может вы немного запутались в union,


Ай да _Sam_, ай да молодец! Конечно запутался. Вот спасибо. Выручил.
Go to the top of the page
 
+Quote Post
BVU
сообщение Dec 8 2005, 07:19
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264



Как инициируется (объявляется) структура - глобально или нет? Попробуйте отследить область действия переменных.


--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 23:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.02362 секунд с 7
ELECTRONIX ©2004-2016