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

 
 
 
Reply to this topicStart new topic
> Запись константы по нужному адресу во FLASH, IAR for ARM 6.40.2
MackNill
сообщение Oct 8 2012, 04:19
Сообщение #1





Группа: Участник
Сообщений: 13
Регистрация: 8-10-12
Пользователь №: 73 843



В моем контроллере отсутсвует EEPROM, поэтому вынужден использовать flash для хранения параметров.
Могу конечно изменить скомпилированный HEX-файл, но это уж как то не по научному.
Помогите под как, что и где писать.
Нужно записать 27 32-битных переменных начиная с адреса 0x00007e00.
Go to the top of the page
 
+Quote Post
Lotor
сообщение Oct 8 2012, 04:40
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Ну для начала Вам надо указать какой у вас мк и надеяться, что кто-то тут подробно всё опишет. Но лучше попробовать найти в user manual что-то вроде IAP ( in application programming). Изучить линкер ИАРа, чтобы знать как зарезервировать "27 32-битных переменных начиная с адреса 0x00007e00". Ну и гугл наконец.


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
MackNill
сообщение Oct 8 2012, 04:42
Сообщение #3





Группа: Участник
Сообщений: 13
Регистрация: 8-10-12
Пользователь №: 73 843



Контроллер EFM32TG210F32.
Go to the top of the page
 
+Quote Post
Lotor
сообщение Oct 8 2012, 05:08
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Цитата(MackNill @ Oct 8 2012, 08:42) *
Контроллер EFM32TG210F32.

Значит гуглить не Ваш метод?..


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
MackNill
сообщение Oct 8 2012, 07:00
Сообщение #5





Группа: Участник
Сообщений: 13
Регистрация: 8-10-12
Пользователь №: 73 843



Зачем тогда форумы?
Решил сделать цикл в программе отвечающий, за запись первоначальных значений, осталось только зарезервировать память.
Как записывать с помощью программы я разобрался,и как считывать тоже. А как резервировать и писать во флеш с помощью компилятора я не разобрался. Поэтому сюда и написал, ибо нужна помощь.
Этот app note я уже читал, и к сожалению не нашел там ответа. к нему еще прилагается сам пример, его я тоже просмотрел.

Сообщение отредактировал MackNill - Oct 8 2012, 07:01
Go to the top of the page
 
+Quote Post
Lotor
сообщение Oct 8 2012, 07:44
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Цитата(MackNill @ Oct 8 2012, 11:00) *
Зачем тогда форумы?

Ну без фанатизма же. На форумах можно получить ответ на четко поставленный вопрос. И крайне желательно, чтобы этот вопрос не находился поиском на первых страницах гугла.
Вы же задали слишком общий вопрос и только в процессе "сознались", что Вас интересует именно резервирование памяти линкером, а всё остальное уже проделано...

PS: банально, но как резервировать линкером написано в документации iar и на этом форуме обсуждалось.
PPS: Про гугл молчу.


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 8 2012, 13:59
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(MackNill @ Oct 8 2012, 10:00) *
Как записывать с помощью программы я разобрался,и как считывать тоже. А как резервировать и писать во флеш с помощью компилятора я не разобрался. Поэтому сюда и написал, ибо нужна помощь.

Так в IARARM не получается делать:
Код
volatile uint32_t Settings[27] @ 0x00007e00;

?
Go to the top of the page
 
+Quote Post
SSerge
сообщение Oct 8 2012, 15:57
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(_Артём_ @ Oct 8 2012, 20:59) *
Так в IARARM не получается делать:
?

А у меня получается. Наверное дело в том, что указание адреса через @ это не предусмотренное стандартом расширение языка.
Чтобы его можно было применять нужно разрешить компилятору использовать расширения (выбрать (*)Standard with IAR extensions).

Если же хочется стандарта, можно это сделать через #pragma и описание дополнительных секций линкеру. И то и другое описано в документации.
Впрочем, простейший способ ничего такого не требует, кроме как прочитать в учебнике о преобразовании типов, а именно целых литералов к типу указатель.

uint32_t *ptr = (uint32_t*) 0x00007e00;
и через этот указатель и работать.
Нужно только позаботиться чтобы эта память кому-нибудь ещё не досталась. Проще всего использовать страницы в конце флэша, а линкеру соответственно уменьшить размер доступной памяти, чтобы он там ничего не смог разместить.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 8 2012, 19:54
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(SSerge @ Oct 8 2012, 18:57) *
А у меня получается. Наверное дело в том, что указание адреса через @ это не предусмотренное стандартом расширение языка.
Чтобы его можно было применять нужно разрешить компилятору использовать расширения (выбрать (*)Standard with IAR extensions).

Через @ можно объявить __no_init массив , но не получается задать значения элементов.

Получается, что делать через скрипт линкера самое правильное решение.
Go to the top of the page
 
+Quote Post
MrAlex
сообщение Oct 9 2012, 05:57
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 197
Регистрация: 15-10-10
Из: г. Москва
Пользователь №: 60 179



Цитата
Через @ можно объявить __no_init массив , но не получается задать значения элементов.

А вам не кажется, что это явное противоречие.
Обявить неинициалируемую переменную и устанавливать ее значение?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 9 2012, 14:29
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(MrAlex @ Oct 9 2012, 08:57) *
А вам не кажется, что это явное противоречие.
Обявить неинициалируемую переменную и устанавливать ее значение?

Нет мне не кажется, что есть противоречие - зачем нужна переменная если нельзя установить её значение.
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Oct 12 2012, 03:40
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Вам нужно поместить инициализированный массив в секцию, а затем линкеру указать, в какие адреса эту секцию положить.
Код
struct Slon_s
{
    uint32_t  var_a;
    uint32_t  var_b;
};

#pragma section="SECTION_MY_SLON"
#pragma location="SECTION_MY_SLON"
const struct Slon_s Slon =
{
    .var_a   = 1,
    .var_b   = 2
};

в icf файле:
define symbol MY_SLON_ADDR  = 0x00007e00;  
place at address mem:MY_SLON_ADDR { readonly section SECTION_MY_SLON};
keep  {          section SECTION_MY_SLON  };  /* Это надо, только если из программы нет явных обращений к переменной Slon */

как-то так


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
MrAlex
сообщение Oct 13 2012, 19:33
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 197
Регистрация: 15-10-10
Из: г. Москва
Пользователь №: 60 179



Цитата
Через @ можно объявить __no_init массив

можно
Тогда его линкер положит в неинициализируемую область данных.
Цитата
, но не получается задать значения элементов.

И тогда им можно присвоить, значение, но уже при выполнении кода.

Инициализируемые переменные при старте перезаписываются, из области заданной константами.

Сообщение отредактировал MrAlex - Oct 13 2012, 19:35
Go to the top of the page
 
+Quote Post
aley-vi
сообщение Mar 15 2013, 15:12
Сообщение #14





Группа: Новичок
Сообщений: 2
Регистрация: 23-05-06
Пользователь №: 17 380



Цитата(MackNill @ Oct 8 2012, 11:00) *
Зачем тогда форумы?
Решил сделать цикл в программе отвечающий, за запись первоначальных значений, осталось только зарезервировать память.
Как записывать с помощью программы я разобрался,и как считывать тоже. А как резервировать и писать во флеш с помощью компилятора я не разобрался. Поэтому сюда и написал, ибо нужна помощь.
Этот app note я уже читал, и к сожалению не нашел там ответа. к нему еще прилагается сам пример, его я тоже просмотрел.


#pragma location= 0x00007e00 // адрес для записи
__root __flash uint32 reservForWrite[27];
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 22:18
Рейтинг@Mail.ru


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