ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
20 июля
682208 Топик полностью
fk0, легенда (21.06.2016 10:25, просмотров: 68) ответил Ксения на С ОЗУ проблем нет - есть много способов переключать банки, например, в помощью "банкующего" регистра. Проблема имеет место, когда это ПЗУ и надо перескакивать (JMP или CALL) из одного банка в другой.
Данная проблема в PIC24 и MSP430, да во многих процессорах вообще, где адресное пространство кода шире, чем аргумент команды CALL или JMP, включая вообще вариант с банками памяти (для любого CPU) решается следующим способом: 1) есть команда JMP работающая с относительными адресами (для переходов внутри функции), для переходов внутри одной банки памяти может использоваться JMP с абсолютным адресом; 2) есть "близкий" сегмент памяти доступный по абсолютному адресу из любого места (нижние адреса памяти или общая банка памяти); 3) для всех функций расположенных в "далёком" сегменте кода создаются "трамплины" в нижных адресах памяти, или в общей банке, и значение адреса функции равно адресу начала трамплина, в коде которого прогружаются все регистры расширенного адреса и делается переход в настоящую функцию; 4) для ускорения пункта 2 может быть вариант CALL работающий с относительными адресами (для неглобальных функций), или же при работе внутри одной банки может использоваться обычный CALL с абсолютным адресом; 5) может иметься инструкция LJMP (long jump) воспринимающая непосредственный полный адрес -- используется в трамплине, в пункте 3, но при этом адрес функции всё равно остаётся, например, 16-битным (это адрес трамплина, повторяю).
[ZX]