Перейти к содержанию
    

Keil 5.23

Коллеги, приветствую!!

Вопрос такой - как в кейле сделать чтобы константный массив представлялся не данными, а кодом

то есть например

 const user_code[]={0x01,0xb5}

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

 

Дело в том, что у меня имеется бинарный файл с неким набором процедур, которые вызываются из моего проекта. Я знаю как адреса размещения этих функций, так и их семантику..При отладке в кейле вызовы этих процедур естественно приводят к HardFault, так как встречается директива DCW, а не ассемблерная инструкция.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уверены, что проблема в объявлении? Может неверный вызов функций из бинарника (например адрес выравнен, а должен быть на 1 смещен для ARM)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

как в кейле сделать чтобы константный массив представлялся не данными, а кодом

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

 

то есть например

 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)

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...А проблема вероятно в неправильном вызове.

 

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

 

Тему считаю закрытой

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...