Jump to content
    

Указание линковщику выполнять код из RAM

Как сделать, чтобы определенный участок кода выполнялся не из флэш а из ОЗУ.

Так нужно, потому что этот код будет стирать флэш и записывать в нее новую программу. (Программа стирает сама себя, и при этом должна работать).

 

Микроконтроллер Atmel SAM4S.

Среда AtmelStudio.

Share this post


Link to post
Share on other sites

Спасибо, смотрю.

 

А почему в подфоруме AVR, а не ARM?

Тут вопрос скорее по среде программирования а не по архитектуре контроллера.

 

 

 

Share this post


Link to post
Share on other sites

В данном документе описано как прерывания перевести с работы из флэш на работу из РАМ.

А нет ли где пошаговой инструкции как сделать функцию int f(int) выполняемой из РАМ?

Share this post


Link to post
Share on other sites

А нет ли где пошаговой инструкции как сделать функцию int f(int) выполняемой из РАМ?
Чем функция int f(int) глобально отличается от функции void Какой_то_Handler(void)?

 

Share this post


Link to post
Share on other sites

Все заработало!

Спасибо!

 

Edited by mml

Share this post


Link to post
Share on other sites

Не работают брекпоинты в некоторых рамфункциях, а в некоторых работают. Почему?

Share this post


Link to post
Share on other sites

Не работают брекпоинты в некоторых рамфункциях, а в некоторых работают. Почему?
В исходном коде или в дизассемблированном? Строки исходного кода могут быть выкинуты оптимизатором.

 

Share this post


Link to post
Share on other sites

оптимизатор отключен

 

мне кажется дебагер не понимает, что функция копируется инициализатором в рам и ставит брекпоинты во флэш

 

В исходном коде или в дизассемблированном? Строки исходного кода могут быть выкинуты оптимизатором.

Пишет, что в ран моде не может быть открыто окно с дизассемблером.

А мне надо быть в ране. Бреакпоинт должен стоять на обработчике прерывания (который сейчас RAMFUNC). Потом я вызываю прерывание, и хочу остановиться на бреакпоинте. Пока функция была не RAMFUNC так работало.

 

Функция main сейчас тоже RAMFUNC, и в ней тоже невозможно поставить бреакпоинт.

Edited by mml

Share this post


Link to post
Share on other sites

оптимизатор отключен
Сочувствую.

 

мне кажется дебагер не понимает, что функция копируется инициализатором в рам и ставит брекпоинты во флэш

Если вы действовали по приведенному в сообщении Daniil документу, то там код функции располагается в ОЗУ, как и положено. Во флеше расположен образ кода функции и у отладчика нет никаких оснований ставить туда точки останова:

.relocate : AT (_etext)
{
. = ALIGN(4);
_sfixed_ram_vect = .;
KEEP(*(.ram_vectors .ram_vectors.*));
_srelocate = .;
*(.ramfunc .ramfunc.*);
*(.data .data.*);

 

Вы можете убедиться в этом, посмотрев содержимое .map - файла.

 

Пишет, что в ран моде не может быть открыто окно с дизассемблером.
Остановите. Потом запустите.

 

Share this post


Link to post
Share on other sites

.relocate : AT (_etext)
{
. = ALIGN(4);
_sfixed_ram_vect = .;
KEEP(*(.ram_vectors .ram_vectors.*));
_srelocate = .;
*(.ramfunc .ramfunc.*);
*(.data .data.*);

Так сделал. Подскажите, пожалуйста документ, в котором описаны все ключики для линковщика. Буду изучать.

Share this post


Link to post
Share on other sites

Подскажите, пожалуйста документ, в котором описаны все ключики для линковщика. Буду изучать.
https://sourceware.org/binutils/docs/ld/

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...