реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Keil 5.23, Данные как код
romas2010
сообщение Apr 4 2018, 06:51
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 25-11-11
Пользователь №: 68 515



Коллеги, приветствую!!
Вопрос такой - как в кейле сделать чтобы константный массив представлялся не данными, а кодом
то есть например
Код
const user_code[]={0x01,0xb5}

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

Дело в том, что у меня имеется бинарный файл с неким набором процедур, которые вызываются из моего проекта. Я знаю как адреса размещения этих функций, так и их семантику..При отладке в кейле вызовы этих процедур естественно приводят к HardFault, так как встречается директива DCW, а не ассемблерная инструкция.
Go to the top of the page
 
+Quote Post
редактор
сообщение Apr 4 2018, 08:33
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



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


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
UniSoft
сообщение Apr 4 2018, 16:25
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 7-05-05
Из: China, Shenzhen
Пользователь №: 4 812



Цитата(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)



Go to the top of the page
 
+Quote Post
romas2010
сообщение Apr 6 2018, 09:05
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 25-11-11
Пользователь №: 68 515



Цитата(UniSoft @ Apr 4 2018, 19:25) *
...А проблема вероятно в неправильном вызове.


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

Тему считаю закрытой
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 13:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.0137 секунд с 7
ELECTRONIX ©2004-2016