Нужна помощь в понимании карты памяти PIC

Какой-то фон. Я использую MPLABx с PicKit2 для программирования различных типов изображений. На данный момент это 16F887. Я стараюсь придерживаться цепочки инструментов Hi-Tech PICC Lite, но я все больше недоволен тем, как собраны некоторые вещи. Операции, которые должны быть относительно быстрыми (учитывая цикл команд 500 нс на частоте 8 МГц), выполняются за 20 мкс. Поэтому я начал вставлять свой собственный код ASM, чтобы справиться с этим.

Однако у меня возникли трудности с пониманием карты памяти, представленной в таблице данных на странице 20.

Память программ начинается с 0005h. Однако на странице 23 показаны адреса файлов регистров специального назначения, таких как, например, порт A. Адрес порта А отображается как «05h».

Я не понимаю, как отличить ячейку памяти 0005h от регистра специального назначения, расположенного по адресу 05h. Как ссылаться на регистры специального назначения?

Я занимался довольно обширным программированием на ассемблере для старых чипов HC11, но это мой первый опыт программирования PIC asm. Любая помощь здесь будет оценена по достоинству.

Ответы (2)

PIC использует так называемую «гарвардскую архитектуру», что означает наличие отдельных адресных пространств для инструкций и данных.

Относится ли адрес к регистру или к инструкции, зависит от контекста, в котором он используется.

Диаграммы в разделе 2.1 «Организация памяти программ» относятся к памяти программ или адресному пространству команд. Диаграммы в разделе 2.2 «Организация памяти данных» относятся к регистрам и регистрам специальных функций или адресному пространству памяти данных.

Итак, если бы я сказал «MOVWF 0x0005», PIC узнал бы, что я ссылаюсь на адрес 0x0005 в памяти данных, а не на пространство программы?
@Майкл: Да. Относится ли адрес в инструкции к памяти программ или данных, зависит от инструкции. Это описано для каждого кода операции. По сути, если он имеет дело с данными, например MOVWF, он будет обращаться к памяти данных. Если он имеет дело с программными адресами, такими как GOTO, то он будет обращаться к памяти программ.
Спасибо. Я предполагаю, что HC11, в котором я использовал ассемблер, был архитектурой фон Неймана. У меня часто возникали проблемы с написанием кода инструкции, когда я только учился. Еще раз спасибо.

То, что сказал Дейв, но я также хочу указать, что память программ начинается с 0, а не с 5. При сбросе процессор устанавливает ПК в 0 и начинает работать. При прерывании процессор фактически вызывает обращение к ячейке 4 и отключает глобальный бит разрешения прерывания. Ячейка памяти программы 5 не является специальной, за исключением того, что это будет вторая инструкция процедуры прерывания, если у вас есть процедура прерывания.

Да это понятно. Я имел в виду, что 5 — это первый универсальный адрес инструкции.
@Michael: Нет, это тоже не так. Как я уже сказал, в ячейке памяти программы 5 нет ничего особенного. Метка первого универсального адреса инструкции для нее не имеет смысла. Адрес первой инструкции равен 0, а 4 тоже немного особенный из-за прерываний. Остальные на самом деле не являются особенными, и «общий» в этом контексте не имеет смысла.
Хорошо, а как насчет первого адреса вектора без сброса и прерывания? Я хочу сказать, что понимаю, что ты пытаешься сказать.