romas2010 1 4 апреля, 2018 Опубликовано 4 апреля, 2018 · Жалоба Коллеги, приветствую!! Вопрос такой - как в кейле сделать чтобы константный массив представлялся не данными, а кодом то есть например const user_code[]={0x01,0xb5} дизассемблировалось в кейле на как DCW 0xb501 , а как push{r0,lr} Дело в том, что у меня имеется бинарный файл с неким набором процедур, которые вызываются из моего проекта. Я знаю как адреса размещения этих функций, так и их семантику..При отладке в кейле вызовы этих процедур естественно приводят к HardFault, так как встречается директива DCW, а не ассемблерная инструкция. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 4 апреля, 2018 Опубликовано 4 апреля, 2018 · Жалоба Уверены, что проблема в объявлении? Может неверный вызов функций из бинарника (например адрес выравнен, а должен быть на 1 смещен для ARM)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
UniSoft 15 4 апреля, 2018 Опубликовано 4 апреля, 2018 · Жалоба как в кейле сделать чтобы константный массив представлялся не данными, а кодом думаю никак... то есть например const user_code[]={0x01,0xb5} дизассемблировалось в кейле на как DCW 0xb501 , а как push{r0,lr} ну так и должно быть... данные они и есть данные... Дело в том, что у меня имеется бинарный файл с неким набором процедур, которые вызываются из моего проекта. Я знаю как адреса размещения этих функций, так и их семантику..При отладке в кейле вызовы этих процедур естественно приводят к HardFault, так как встречается директива DCW, а не ассемблерная инструкция. DCW/DCD/DCB это всего-лишь директива ассемблера... т.е. DCW 0xb501 и push{r0,lr} на выходе выдадут один и от же бинарный код. А проблема вероятно в неправильном вызове. вот пример __attribute__((section(".text"))) // разместим данные в секции кода const uint8_t user_code[]={ 0x10,0xb5, // push{r4,lr} 0x55,0x20, // movs r0, 0x55 0x10,0xbd // pop{r4,pc} }; int main(void) { int tmp; int (*fn)(void) = (int (*)(void)) (1 | (uint32_t)user_code); // ставим младший бит в 1, что значит THUMB код tmp = fn(); // вернет 0x55 } в отладчике кейл по-прежнему будет отображать DCW(B,D) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
romas2010 1 6 апреля, 2018 Опубликовано 6 апреля, 2018 · Жалоба ...А проблема вероятно в неправильном вызове. Спасибо.Согласен...действительно, единицу к адресу вызова надо прибавлять... Тему считаю закрытой Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться