ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
23 ноября
1021110 Топик полностью
fk0, легенда (26.07.2020 15:38, просмотров: 525) ответил йцyкeн на К сожалению, я не пользуюсь Кейлом, поэтому про Кейл ничего не скажу, но эксперименты с ИАРом показали следующее: во-первых, в ИАРе воспроизвести эту ошибку не удалось. ИАР заменяет memcpy на __aeabi_memcpy4, если адреса выронены, и на __aeabi_memcpy, если не выровнены. Если для невыровненных адресов написать __aeabi_memcpy4 ручками, хардфолт происходит, и здесь нет никакой мистики: __aeabi_memcpy4 использует инструкции LDM и STM, для которых CM3 как раз не умеет делать
При пошаговом исполнении инструкции могут эмулироваться отладчиком. Я по-моему про это писал, что недостаток архитектуры ARM, существенный, отсутствие возможности пошагового исполнения, что затрудняет реализацию отладчика. На x86 есть аппаратное пошаговое исполнение, например. Ты можешь сказать, мол "поставь breakpoint после инструкции", но здесь начинаются нюансы: 

1) не всегда возможно менять программную память в месте исполнения, так как, например, могут быть параллельные потоки, память технически (если ROM) невозможно изменить, или дорого/сложно (если FLASH -- так у ней ресурс кончится) -- а "софтварный" брейкпоинт не поставить без изменения кода;


2) можно перенести инструкцию в другое место ОЗУ или FLASH (в котором не стирать страницу после каждого шага, а лишь дописывать понемногу, и стирать только после заполнения страницы) и там исполнить, но инструкция может адресовать память относительно своего адреса -- следовательно так можно исполнить только ограниченный набор инструкций;


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


Практически часть инструкций придётся неизбежно эмулировать (инструкции перехода и ещё некоторые, вроде LDM, STM), часть можно исполнять с размещением по другому адресу, и при этом использовать технику "переименовывания регистров" чтоб обойти PC-относительную адресацию (когда в КОП инструкции регистр PC подменяется на другой). СЛОЖНО. Но примерно так работают отладчики. Некоторые может эмулируют всё, что тоже крайне сожно из-за очень развесистого дерева инструкций у ARM (там давно уже не простая табличка, а скорей CISC с массой исключений и исключений из исключений -- чтоб просто написать дизассемблер нужен парсер PDF файла с описанием инструкций, в голову оно не влазит никак).


Очень удобно у MIPS, где есть delay slot, в который можно записать брейкпоинт... правда там свои нюансы, вроде того, что если в delay slot записать команду перехода.

[ZX]