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

 
 
 
Reply to this topicStart new topic
> ошибка с применением переменных типа 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
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
mozg12342
сообщение Mar 9 2018, 17:04
Сообщение #5





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



Спасибо за помощь!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 9 2018, 17:24
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Да все там, на самом деле, просто: нет в стандарте языка С типа bit. Это отсебятина (расширение) CodeVision. Поэтому сторонний к CV симулятор AVR Studio понятия не имеет, что это за тип. А скорее всего этот тип невозможно описать в файле с отладочной информацией, поэтому сам CV тупо кладет в отладочный файл ссылку на регистр вместо ссылки на конкретный бит. Опишите свои флаги как структру из битовых полей, тогда, возможно, студия их покажет адекватно (и если CV сумеет запихнуть структуру из битовых полей в регистр).


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
SyncLair
сообщение Mar 9 2018, 18:53
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197



недавно ковырялся в АВР Студии 4.18 и avr-gcc, выяснил что отладочная информация передается через расширенный COFF формат. То есть то, что вам АВР студия показывает - результат интерпретации данного формата. А уж как компилятор правильно упаковывает туда данные, а симулятор их читает и есть ли вообще поддержка битовых структур в данном формате -- это вообще три отдельных песни каждая из которых хоть и пересекается но нет никаких гарантий того, что это всё правильно сделано.

В том же avr-gcc выдача сделана через avr-objcopy -I elf -Oext-coff но к сожалению после какой то версии gcc я не вижу поддержки данного формата, может колеги подскажут есть ли новые сборки тулчайна с поддержкой сей старомодной вещи.


--------------------
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th April 2024 - 09:24
Рейтинг@Mail.ru


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