|
|
  |
Запись константы по нужному адресу во FLASH, IAR for ARM 6.40.2 |
|
|
|
Oct 8 2012, 04:19
|
Группа: Участник
Сообщений: 13
Регистрация: 8-10-12
Пользователь №: 73 843

|
В моем контроллере отсутсвует EEPROM, поэтому вынужден использовать flash для хранения параметров. Могу конечно изменить скомпилированный HEX-файл, но это уж как то не по научному. Помогите под как, что и где писать. Нужно записать 27 32-битных переменных начиная с адреса 0x00007e00.
|
|
|
|
|
Oct 8 2012, 04:42
|
Группа: Участник
Сообщений: 13
Регистрация: 8-10-12
Пользователь №: 73 843

|
Контроллер EFM32TG210F32.
|
|
|
|
|
Oct 8 2012, 05:08
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(MackNill @ Oct 8 2012, 08:42)  Контроллер EFM32TG210F32. Значит гуглить не Ваш метод?..
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Oct 8 2012, 07:00
|
Группа: Участник
Сообщений: 13
Регистрация: 8-10-12
Пользователь №: 73 843

|
Зачем тогда форумы? Решил сделать цикл в программе отвечающий, за запись первоначальных значений, осталось только зарезервировать память. Как записывать с помощью программы я разобрался,и как считывать тоже. А как резервировать и писать во флеш с помощью компилятора я не разобрался. Поэтому сюда и написал, ибо нужна помощь. Этот app note я уже читал, и к сожалению не нашел там ответа. к нему еще прилагается сам пример, его я тоже просмотрел.
Сообщение отредактировал MackNill - Oct 8 2012, 07:01
|
|
|
|
|
Oct 8 2012, 07:44
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(MackNill @ Oct 8 2012, 11:00)  Зачем тогда форумы? Ну без фанатизма же. На форумах можно получить ответ на четко поставленный вопрос. И крайне желательно, чтобы этот вопрос не находился поиском на первых страницах гугла. Вы же задали слишком общий вопрос и только в процессе "сознались", что Вас интересует именно резервирование памяти линкером, а всё остальное уже проделано... PS: банально, но как резервировать линкером написано в документации iar и на этом форуме обсуждалось. PPS: Про гугл молчу.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Oct 8 2012, 13:59
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(MackNill @ Oct 8 2012, 10:00)  Как записывать с помощью программы я разобрался,и как считывать тоже. А как резервировать и писать во флеш с помощью компилятора я не разобрался. Поэтому сюда и написал, ибо нужна помощь. Так в IARARM не получается делать: Код volatile uint32_t Settings[27] @ 0x00007e00; ?
|
|
|
|
|
Oct 8 2012, 15:57
|
Профессионал
    
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Oct 9 2012, 05:57
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 15-10-10
Из: г. Москва
Пользователь №: 60 179

|
Цитата Через @ можно объявить __no_init массив , но не получается задать значения элементов. А вам не кажется, что это явное противоречие. Обявить неинициалируемую переменную и устанавливать ее значение?
|
|
|
|
|
Oct 12 2012, 03:40
|

Знающий
   
Группа: Свой
Сообщений: 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 */ как-то так
--------------------
Пасу котов...
|
|
|
|
|
Oct 13 2012, 19:33
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 15-10-10
Из: г. Москва
Пользователь №: 60 179

|
Цитата Через @ можно объявить __no_init массив можно Тогда его линкер положит в неинициализируемую область данных. Цитата , но не получается задать значения элементов. И тогда им можно присвоить, значение, но уже при выполнении кода. Инициализируемые переменные при старте перезаписываются, из области заданной константами.
Сообщение отредактировал MrAlex - Oct 13 2012, 19:35
|
|
|
|
|
Mar 15 2013, 15:12
|
Группа: Новичок
Сообщений: 2
Регистрация: 23-05-06
Пользователь №: 17 380

|
Цитата(MackNill @ Oct 8 2012, 11:00)  Зачем тогда форумы? Решил сделать цикл в программе отвечающий, за запись первоначальных значений, осталось только зарезервировать память. Как записывать с помощью программы я разобрался,и как считывать тоже. А как резервировать и писать во флеш с помощью компилятора я не разобрался. Поэтому сюда и написал, ибо нужна помощь. Этот app note я уже читал, и к сожалению не нашел там ответа. к нему еще прилагается сам пример, его я тоже просмотрел. #pragma location= 0x00007e00 // адрес для записи __root __flash uint32 reservForWrite[27];
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|