Добился-таки "прозрачности", но на lpc1768.
Проверял так:
BYTE *bat;
bat = (BYTE *)0x30000000; // несуществующая память bat[0]=0x5A;
С позиций ядра bat[0]=num есть
STR rc, [ro]
rc - хранит число num, ro - хранит адрес назначения bat+0
Запись по несуществующему адресу вызывает исключение. В обработчике исключения подменяю ro на нужную ячейку памяти и выхожу (регистры R0-R3, R12 "проблемного участка" доступны через стек, остальные - напрямую). Команда STR выполняется еще раз, но уже с новым адресом.
У данного подхода есть ряд минусов: - нужен контроллер с MPU. на STM32 не смог получить исключение в месте, где произвожу запись. - поскольку rc и ro заранее не известны (впрочем команда тоже может быть не STR), то нужно анализировать инструкцию, которая привела к сбою. - после выполнения инструкции параметры портятся, поэтому инструкцию лучше эмулировать.
|