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

 
 
> Указание линковщику выполнять код из RAM
mml
сообщение Sep 6 2016, 07:16
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 10-11-10
Из: Екатеринбург
Пользователь №: 60 777



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

Микроконтроллер Atmel SAM4S.
Среда AtmelStudio.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
mml
сообщение Sep 7 2016, 09:33
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 10-11-10
Из: Екатеринбург
Пользователь №: 60 777



Не работают брекпоинты в некоторых рамфункциях, а в некоторых работают. Почему?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 7 2016, 10:01
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (mml @ Sep 7 2016, 12:33) *
Не работают брекпоинты в некоторых рамфункциях, а в некоторых работают. Почему?
В исходном коде или в дизассемблированном? Строки исходного кода могут быть выкинуты оптимизатором.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
mml
сообщение Sep 7 2016, 10:44
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 10-11-10
Из: Екатеринбург
Пользователь №: 60 777



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

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

Цитата(Сергей Борщ @ Sep 7 2016, 14:01) *
В исходном коде или в дизассемблированном? Строки исходного кода могут быть выкинуты оптимизатором.

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

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

Сообщение отредактировал mml - Sep 7 2016, 10:47
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 7 2016, 11:20
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (mml @ Sep 7 2016, 13:44) *
оптимизатор отключен
Сочувствую.

QUOTE (mml @ Sep 7 2016, 13:44) *
мне кажется дебагер не понимает, что функция копируется инициализатором в рам и ставит брекпоинты во флэш

Если вы действовали по приведенному в сообщении Daniil документу, то там код функции располагается в ОЗУ, как и положено. Во флеше расположен образ кода функции и у отладчика нет никаких оснований ставить туда точки останова:
CODE
.relocate : AT (_etext)
{
. = ALIGN(4);
_sfixed_ram_vect = .;
KEEP(*(.ram_vectors .ram_vectors.*));
_srelocate = .;
*(.ramfunc .ramfunc.*);
*(.data .data.*);


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

QUOTE (mml @ Sep 7 2016, 13:44) *
Пишет, что в ран моде не может быть открыто окно с дизассемблером.
Остановите. Потом запустите.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
mml
сообщение Sep 7 2016, 11:34
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 10-11-10
Из: Екатеринбург
Пользователь №: 60 777



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

Так сделал. Подскажите, пожалуйста документ, в котором описаны все ключики для линковщика. Буду изучать.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 7 2016, 15:14
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (mml @ Sep 7 2016, 14:34) *
Подскажите, пожалуйста документ, в котором описаны все ключики для линковщика. Буду изучать.
https://sourceware.org/binutils/docs/ld/


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 17:20
Рейтинг@Mail.ru


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