Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Keil 5.23
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
romas2010
Коллеги, приветствую!!
Вопрос такой - как в кейле сделать чтобы константный массив представлялся не данными, а кодом
то есть например
Код
const user_code[]={0x01,0xb5}

дизассемблировалось в кейле на как DCW 0xb501 , а как push{r0,lr}

Дело в том, что у меня имеется бинарный файл с неким набором процедур, которые вызываются из моего проекта. Я знаю как адреса размещения этих функций, так и их семантику..При отладке в кейле вызовы этих процедур естественно приводят к HardFault, так как встречается директива DCW, а не ассемблерная инструкция.
редактор
Уверены, что проблема в объявлении? Может неверный вызов функций из бинарника (например адрес выравнен, а должен быть на 1 смещен для ARM)?
UniSoft
Цитата(romas2010 @ Apr 4 2018, 14:51) *
как в кейле сделать чтобы константный массив представлялся не данными, а кодом

думаю никак...

Цитата(romas2010 @ Apr 4 2018, 14:51) *
то есть например
Код
const user_code[]={0x01,0xb5}

дизассемблировалось в кейле на как DCW 0xb501 , а как push{r0,lr}

ну так и должно быть... данные они и есть данные...

Цитата(romas2010 @ Apr 4 2018, 14:51) *
Дело в том, что у меня имеется бинарный файл с неким набором процедур, которые вызываются из моего проекта. Я знаю как адреса размещения этих функций, так и их семантику..При отладке в кейле вызовы этих процедур естественно приводят к 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
Цитата(UniSoft @ Apr 4 2018, 19:25) *
...А проблема вероятно в неправильном вызове.


Спасибо.Согласен...действительно, единицу к адресу вызова надо прибавлять...

Тему считаю закрытой
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.