mozg12342 0 8 марта, 2018 Опубликовано 8 марта, 2018 · Жалоба Всем привет! Народ подскажите как исправить ситуацию: Для компиляции использую Code Vision, для отладки AVR Studio 4.19. В коде программы использовал 4 битовые переменные, через disassembler посмотрел, что переменные записываются по адресу R2.0;R2.1;R2.2;R2.3, то есть в один регистр, но разные биты. В студии, адрес хранения в каждой из переменных отображается просто R2. При отладке в студии при изменении любой из переменных - изменяются все разом, сбрасываются так же, как будто нет разделения на биты и все четыре переменные находятся по одному адресу. Думал что создаётся только видимость ошибки, но программа работает соответственно не правильно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Baser 5 8 марта, 2018 Опубликовано 8 марта, 2018 · Жалоба Не работал с Code Vision, но если компилятор упаковывает и хранит глобальные битовые переменные в регистре регистрового файла ядра процессора, то он должен резервировать этот регистр (R2 в вашем случае) для эксклюзивного хранения этих бит. Проверьте по документации, что Code Vision это умеет. Отладчик AVR Studio скорее всего не умеет корректно работать с таким битовым регистром, поэтому при отладке изменяйте биты в регистре R2 в ручную. Ну, а чтобы посмотреть, как компилятор с этими битами работает, смотрите ассемблерный код, все увидите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mozg12342 0 8 марта, 2018 Опубликовано 8 марта, 2018 · Жалоба Ну, а чтобы посмотреть, как компилятор с этими битами работает, смотрите ассемблерный код, все увидите. смотрел, вроде работает с битами правильно, прилагаю картинку. Отладчик AVR Studio скорее всего не умеет корректно работать с таким битовым регистром возможно, а может просто настроить надо как то. при отладке изменяйте биты в регистре R2 в ручную. При изменении любой из переменных вручную, все переменные изменяются синхронно. В результате экспериментов получил следующие результаты: когда программа устанавливает к примеру второй бит регистра (0b00000100) - все цифры в симуляторе отображают цифру 4, если установить также нулевой бит (0b00000101) - отображают 5. Логично предположить, что симулятор отображает мне переменные не побитно, а все вместе да ещё в десятиричном виде. Через контекстное меню могу установить только в шеснадцатиричном виде. Возможно ли исправить? а то неудобно так. И объясните пожалуйста почему некоторые переменные заносятся в адрес R-2, а некоторые в адрес к примеру 0181. В чем разница и логика? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Baser 5 8 марта, 2018 Опубликовано 8 марта, 2018 · Жалоба Когда я говорил, "Проверьте по документации, что 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 это исключение, причем нестандартное. Это спец. фича компилятора для ядра АВР (костыль для попытки исправить недостаток системы команд в области атомарного доступа к флагам). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mozg12342 0 9 марта, 2018 Опубликовано 9 марта, 2018 · Жалоба Спасибо за помощь! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 9 марта, 2018 Опубликовано 9 марта, 2018 · Жалоба Да все там, на самом деле, просто: нет в стандарте языка С типа bit. Это отсебятина (расширение) CodeVision. Поэтому сторонний к CV симулятор AVR Studio понятия не имеет, что это за тип. А скорее всего этот тип невозможно описать в файле с отладочной информацией, поэтому сам CV тупо кладет в отладочный файл ссылку на регистр вместо ссылки на конкретный бит. Опишите свои флаги как структру из битовых полей, тогда, возможно, студия их покажет адекватно (и если CV сумеет запихнуть структуру из битовых полей в регистр). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SyncLair 0 9 марта, 2018 Опубликовано 9 марта, 2018 · Жалоба недавно ковырялся в АВР Студии 4.18 и avr-gcc, выяснил что отладочная информация передается через расширенный COFF формат. То есть то, что вам АВР студия показывает - результат интерпретации данного формата. А уж как компилятор правильно упаковывает туда данные, а симулятор их читает и есть ли вообще поддержка битовых структур в данном формате -- это вообще три отдельных песни каждая из которых хоть и пересекается но нет никаких гарантий того, что это всё правильно сделано. В том же avr-gcc выдача сделана через avr-objcopy -I elf -Oext-coff но к сожалению после какой то версии gcc я не вижу поддержки данного формата, может колеги подскажут есть ли новые сборки тулчайна с поддержкой сей старомодной вещи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться