Перейти к содержанию
    

ошибка с применением переменных типа bit

Всем привет!

Народ подскажите как исправить ситуацию:

Для компиляции использую Code Vision, для отладки AVR Studio 4.19.

В коде программы использовал 4 битовые переменные, через disassembler посмотрел, что переменные записываются по адресу R2.0;R2.1;R2.2;R2.3, то есть в один регистр, но разные биты. В студии, адрес хранения в каждой из переменных отображается просто R2. При отладке в студии при изменении любой из переменных - изменяются все разом, сбрасываются так же, как будто нет разделения на биты и все четыре переменные находятся по одному адресу. Думал что создаётся только видимость ошибки, но программа работает соответственно не правильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Ну, а чтобы посмотреть, как компилятор с этими битами работает, смотрите ассемблерный код, все увидите.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, а чтобы посмотреть, как компилятор с этими битами работает, смотрите ассемблерный код, все увидите.

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

 

Отладчик AVR Studio скорее всего не умеет корректно работать с таким битовым регистром

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

 

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

При изменении любой из переменных вручную, все переменные изменяются синхронно.

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

Возможно ли исправить? а то неудобно так.

И объясните пожалуйста почему некоторые переменные заносятся в адрес R-2, а некоторые в адрес к примеру 0181. В чем разница и логика?

image.jpg

 

image.jpg

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Когда я говорил, "Проверьте по документации, что Code Vision это умеет", это не просто так.

Чтобы хранить в R2 переменные, у компилятора должны быть предварительно скомпилированные библиотеки со стандартными функциями, которые не применяют R2. И чтобы компилятор при генерации кода не применял бы регистр R2. Иначе это работать не будет.

Вот ИАР для АВР начиная с какой-то версии умел резервировать регистры R15 и R14 (если не ошибаюсь).

 

А все это нужно исключительно для атомарного доступа к флагам.

Если вам не нужен атомарный доступ, то располагайте флаги в ОЗУ.

 

При изменении любой из переменных вручную, все переменные изменяются синхронно.

В результате экспериментов получил следующие результаты: когда программа устанавливает к примеру второй бит регистра (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;

И объясните пожалуйста почему некоторые переменные заносятся в адрес R-2, а некоторые в адрес к примеру 0181. В чем разница и логика?

В вашем листинге этого нет.

Если вы говорите о других переменных, то это именно правило, что они линкером помещены в ОЗУ,

а помещение битов в регистр R2 это исключение, причем нестандартное. Это спец. фича компилятора для ядра АВР (костыль для попытки исправить недостаток системы команд в области атомарного доступа к флагам).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...