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

 
 
> ошибка с применением переменных типа bit
mozg12342
сообщение Mar 8 2018, 11:32
Сообщение #1





Группа: Участник
Сообщений: 14
Регистрация: 22-02-18
Пользователь №: 101 921



Всем привет!
Народ подскажите как исправить ситуацию:
Для компиляции использую Code Vision, для отладки AVR Studio 4.19.
В коде программы использовал 4 битовые переменные, через disassembler посмотрел, что переменные записываются по адресу R2.0;R2.1;R2.2;R2.3, то есть в один регистр, но разные биты. В студии, адрес хранения в каждой из переменных отображается просто R2. При отладке в студии при изменении любой из переменных - изменяются все разом, сбрасываются так же, как будто нет разделения на биты и все четыре переменные находятся по одному адресу. Думал что создаётся только видимость ошибки, но программа работает соответственно не правильно.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Baser
сообщение Mar 8 2018, 13:15
Сообщение #2


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Не работал с Code Vision, но если компилятор упаковывает и хранит глобальные битовые переменные в регистре регистрового файла ядра процессора, то он должен резервировать этот регистр (R2 в вашем случае) для эксклюзивного хранения этих бит. Проверьте по документации, что Code Vision это умеет.

Отладчик AVR Studio скорее всего не умеет корректно работать с таким битовым регистром, поэтому при отладке изменяйте биты в регистре R2 в ручную.

Ну, а чтобы посмотреть, как компилятор с этими битами работает, смотрите ассемблерный код, все увидите.
Go to the top of the page
 
+Quote Post
mozg12342
сообщение Mar 8 2018, 18:17
Сообщение #3





Группа: Участник
Сообщений: 14
Регистрация: 22-02-18
Пользователь №: 101 921



Цитата(Baser @ Mar 8 2018, 14:15) *
Ну, а чтобы посмотреть, как компилятор с этими битами работает, смотрите ассемблерный код, все увидите.

смотрел, вроде работает с битами правильно, прилагаю картинку.

Цитата(Baser @ Mar 8 2018, 14:15) *
Отладчик AVR Studio скорее всего не умеет корректно работать с таким битовым регистром

возможно, а может просто настроить надо как то.

Цитата(Baser @ Mar 8 2018, 14:15) *
при отладке изменяйте биты в регистре R2 в ручную.

При изменении любой из переменных вручную, все переменные изменяются синхронно.
В результате экспериментов получил следующие результаты: когда программа устанавливает к примеру второй бит регистра (0b00000100) - все цифры в симуляторе отображают цифру 4, если установить также нулевой бит (0b00000101) - отображают 5. Логично предположить, что симулятор отображает мне переменные не побитно, а все вместе да ещё в десятиричном виде. Через контекстное меню могу установить только в шеснадцатиричном виде.
Возможно ли исправить? а то неудобно так.
И объясните пожалуйста почему некоторые переменные заносятся в адрес R-2, а некоторые в адрес к примеру 0181. В чем разница и логика?



Go to the top of the page
 
+Quote Post
Baser
сообщение Mar 8 2018, 21:21
Сообщение #4


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Когда я говорил, "Проверьте по документации, что Code Vision это умеет", это не просто так.
Чтобы хранить в R2 переменные, у компилятора должны быть предварительно скомпилированные библиотеки со стандартными функциями, которые не применяют R2. И чтобы компилятор при генерации кода не применял бы регистр R2. Иначе это работать не будет.
Вот ИАР для АВР начиная с какой-то версии умел резервировать регистры R15 и R14 (если не ошибаюсь).

А все это нужно исключительно для атомарного доступа к флагам.
Если вам не нужен атомарный доступ, то располагайте флаги в ОЗУ.

Цитата(mozg12342 @ Mar 8 2018, 20:17) *
При изменении любой из переменных вручную, все переменные изменяются синхронно.
В результате экспериментов получил следующие результаты: когда программа устанавливает к примеру второй бит регистра (0b00000100) - все цифры в симуляторе отображают цифру 4, если установить также нулевой бит (0b00000101) - отображают 5. Логично предположить, что симулятор отображает мне переменные не побитно, а все вместе да ещё в десятиричном виде. Через контекстное меню могу установить только в шеснадцатиричном виде.
Возможно ли исправить? а то неудобно так.

Сомневаюсь, что это можно исправить. Тип данных bit - нестандартный, такое я встречал только в компиляторе HT-PICC для ПИКов.
А Code Vision и AVR Studio это программы разных разработчиков, они не обязаны понимать нестандартные вещи.
Используйте битовые поля в структурах (в примере квалификаторы из ИАРа, в Code Vision должно быть что-то подобное):
Код
__regvar __no_init volatile union {
    unsigned char Flags;
    struct {
        unsigned char a :1;
        unsigned char b :1;
        unsigned char c :1;
        };
    } @ R2;

Цитата(mozg12342 @ Mar 8 2018, 20:17) *
И объясните пожалуйста почему некоторые переменные заносятся в адрес R-2, а некоторые в адрес к примеру 0181. В чем разница и логика?

В вашем листинге этого нет.
Если вы говорите о других переменных, то это именно правило, что они линкером помещены в ОЗУ,
а помещение битов в регистр R2 это исключение, причем нестандартное. Это спец. фича компилятора для ядра АВР (костыль для попытки исправить недостаток системы команд в области атомарного доступа к флагам).
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 27th August 2025 - 18:08
Рейтинг@Mail.ru


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