Easyelectronics.ru

Электроника для всех
Текущее время: 22 фев 2019, 23:45

Часовой пояс: UTC + 5 часов




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: выполнение из произвольного участка памяти flash (решено)
СообщениеДобавлено: 11 сен 2015, 13:01 
Только пришел

Зарегистрирован: 20 мар 2015, 13:50
Сообщения: 6
Возникла следующая проблема с контроллером на ядре cortex m4.
Я копирую код существующей функции из внутренней flash в произвольный адрес во внутренней flash, а потом пытаюсь выполнить "новую" (скопированную) функцию и падаю в HardFault (уже ненавижу его). Но если я код функции копирую на место существующей (любой другой) функции, естественно ломая при этом программу, то эта самая "новая" копия функции запускается и отрабатывает без ошибок.
Вот что я делаю:

Код:

typedef void (*pfunc)(void);

void original_func(void)
{
  int i;
  while(1)
    i++;
}

int main(void)
{
  flash_erase_sector(0xFE000);
  flash_program_page(0xFE000, ((unsigned char*)original_func) - 1, 100); //понятия не имею зачем -1, но в функцию передается адрес +1 от оригинала
  ((pfunc)0xFE000)();
}



Последний раз редактировалось zrabadaber 14 сен 2015, 15:07, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: выполнение из произвольного участка памяти flash
СообщениеДобавлено: 11 сен 2015, 18:59 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1338
Единица в младшем бите адреса - это указание процессору выполнять подпрограмму в thumb-режиме, а ноль - в arm-режиме. Поскольку у ядра cortex-m4 вообще нет arm-режима, то все адреса подпрограмм обязательно должны быть с этой единицей, иначе - HardFault


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: выполнение из произвольного участка памяти flash
СообщениеДобавлено: 11 сен 2015, 19:07 
Старожил

Зарегистрирован: 01 июл 2010, 15:30
Сообщения: 472
Откуда: Энгельс
Обычно в коде для ARM используется много абсолютных адресов: переходы, загрузка констант и т.д.
И если функцию просто так переместить из одного места в другое - всё пойдет лесом.
Нужно либо коррестировать все эти адреса при перемещении, что сложно.
Но лучше сразу компилировать функцию как PIC (Position Independent Code) - опция -fpic для ARM GCC и для Keil.
Весь код компилировать как PIC не стоит - заметно падает производительность и растет размер.
Цитата:
//понятия не имею зачем -1, но в функцию передается адрес +1 от оригинала

Младший бит адреса показывает режим работы процессора 0 - ARM, 1 - Thumb. В cortex всегда Thumb.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: выполнение из произвольного участка памяти flash
СообщениеДобавлено: 14 сен 2015, 12:28 
Только пришел

Зарегистрирован: 20 мар 2015, 13:50
Сообщения: 6
vt340 и neiver спасибо большое, я сам практически к этому пришел, но вы подтвердили мои догадки и все объяснили.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB