Разница в длине между байтами и единицей измерения - PullRequest
0 голосов
/ 26 ноября 2018

В настоящее время я работаю с системой Microchip и столкнулся с проблемой длины программы.Я вижу две разные длины при компиляции:

  • длина (единица ПК)
  • длина (байты)

И эти два могут действительно отличаться (0x1EC8и 0x2700, например).

Кто-нибудь из вас знает разницу между ними?Способ их расчета?

[РЕДАКТИРОВАТЬ]: см. .text раздел

enter image description here

Ответы [ 4 ]

0 голосов
/ 05 декабря 2018

Этот ответ сфокусирован только на устройствах PIC Microchip в семействах PIC24, dsPIC30 и dsPIC33.

Контроллеры этого типа имеют отдельные адресные шины для команд и памяти данных.

память данных организована в виде 16-битных слов и адресуется в виде байтов.

память команд организована в виде 24-битных слов.

Когда код операции выбирается из памяти команд, все 24-биты читаются сразу.Но существуют дополнительные режимы адресации, которые позволяют считывать часть памяти команд с использованием режимов адресации, доступных в памяти данных.

Существуют и другие способы доступа к памяти команд, но они предназначены для стирания и записи памяти командпоэтому не имеют отношения к этому ответу.

Когда контроллер выбирает инструкции, используя только программный счетчик, возможен только четный адрес, однако возможно получить инструкцию, используя косвенную адресацию.Разработчики должны быть осторожны, используя этот метод для передачи управления, такой как CALL и GOTO, поскольку прерывания из-за ошибок адреса могут возникать, когда целевой адрес нечетен.

По причинам, которые я не полностью понимаю, части памяти команд, видимые с использованием доступных режимовс памятью данных можно получить доступ только к младшим 16-битам командного слова, к старшему 8-битному нельзя получить доступ таким образом.

Итак, я описал форму шин памяти в 24-битных PIC, ноЯ не ответил на ваш вопрос.

Документация по микрочипам не помогает описать это.Он много размахивает руками и затеняет полезные детали.

По сути, для каждого слова адресуемой памяти есть 2 адресных блока.В памяти данных это представляет 2 байта оперативной памяти, для памяти инструкций - 3 байта FLASH, но один из этих 3 байтов является видимым.

Эта обработка памяти инструкций "должна" сделать доступ к этомупространство памяти для чтения постоянных данных быстрее и проще для создания генератора кода компилятора Си.Трудно сказать, что это правда.

Таким образом, для суммирования есть 3 байта FLASH для каждого командного слова.Каждое командное слово представлено 2 адресными единицами.

Чтобы преобразовать единицы адреса в байты FLASH:

  1. Подсчитать диапазон единиц адреса FLASH (должен быть четным).
  2. Разделить диапазон на 2, чтобы получитьколичество командных слов.
  3. Умножьте количество командных слов на 3 для количества байтов флэш-памяти.

Для большинства практических целей количество байтов, использованных во флэш-памятибесполезен, хотя номер назначенного или свободного командного слова более полезен.

0 голосов
/ 26 ноября 2018

Я только что просмотрел некоторые книги и получил эти объяснения, это может быть полезно для вас.

Байт:

Существует минимальный блок кода, который всегда генерируетсяКомпилятор MPLAB C

Взято из книги: здесь

и

Единицы ПК:

Это могут быть единицы счетчика программ.Указывается, что 16-разрядный ПК устройства увеличивается на 2 для каждого слова инструкции (Не во всех случаях, пожалуйста, обратитесь к некоторым книгам для увеличения ПК в PIC)

Взято из книги: здесь

Номер страницы: 52

Таким образом, они могут быть разного размера.В основном размер в байтах будет больше, чем в блоках ПК.

Надеюсь, это полезно:)

0 голосов
/ 26 ноября 2018

Может быть, посмотрите на PIC24FJ128GA:
Каждая команда имеет размер 24 бита или три байта.Пользовательская флэш-память программ начинается с 0x200 и имеет длину 0x155FC в единицах счетчика программ.Каждый четный компьютер имеет два байта, а каждый нечетный - всего один байт.Таким образом, общая память пользовательских программ составляет 0x155FC * 1,5 = 131322 = 128,2 Кбайт.

enter image description here

0 голосов
/ 26 ноября 2018

ПК означает счетчик программ, поэтому в этом случае размер указывается в единицах счетчика программ (зависит от длины инструкций и определяет количество возможных адресов, на которые может указывать ПК).В другом случае это просто означает размер в байтах.

В инструкции с постоянной шириной, как у микрочипа PIC24 (что может соответствовать вашему примеру), ширина инструкции составляет 3 байта, то есть ПК (никогданечетно) увеличивается на 2 для каждой инструкции (16-битные данные).Таким образом, соотношение между длиной в байтах и ​​длиной в единицах ПК составляет 3/2, в вашем примере секция .text из 0x1b0 байтов будет эквивалентна 0x1b0 * (2 / 3) = 288 PC-Units

Термин единица измерения ПКполезный способ говорить об адресах в устройствах, ширина инструкций которых превышает 8 байт, особенно для отладки (файлы карт, адреса, смещения, размеры и т. д.), но я настоятельно рекомендую вам всегда работать в единицах ПК или всегдав байтах, чтобы избежать глупых ошибок.

Имейте в виду, что несколько операторов Microchip работают с блоками ПК, а не байтами, такими как .sizeof.., поэтому операторы такого типа не будут сообщать вамразмер в байтах, поэтому вам нужно знать архитектуру вашего uC, если вы хотите преобразовать в байты.

...