Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запись константы по нужному адресу во FLASH
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
MackNill
В моем контроллере отсутсвует EEPROM, поэтому вынужден использовать flash для хранения параметров.
Могу конечно изменить скомпилированный HEX-файл, но это уж как то не по научному.
Помогите под как, что и где писать.
Нужно записать 27 32-битных переменных начиная с адреса 0x00007e00.
Lotor
Ну для начала Вам надо указать какой у вас мк и надеяться, что кто-то тут подробно всё опишет. Но лучше попробовать найти в user manual что-то вроде IAP ( in application programming). Изучить линкер ИАРа, чтобы знать как зарезервировать "27 32-битных переменных начиная с адреса 0x00007e00". Ну и гугл наконец.
MackNill
Контроллер EFM32TG210F32.
Lotor
Цитата(MackNill @ Oct 8 2012, 08:42) *
Контроллер EFM32TG210F32.

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

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

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

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

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

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

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

uint32_t *ptr = (uint32_t*) 0x00007e00;
и через этот указатель и работать.
Нужно только позаботиться чтобы эта память кому-нибудь ещё не досталась. Проще всего использовать страницы в конце флэша, а линкеру соответственно уменьшить размер доступной памяти, чтобы он там ничего не смог разместить.
_Артём_
Цитата(SSerge @ Oct 8 2012, 18:57) *
А у меня получается. Наверное дело в том, что указание адреса через @ это не предусмотренное стандартом расширение языка.
Чтобы его можно было применять нужно разрешить компилятору использовать расширения (выбрать (*)Standard with IAR extensions).

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

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

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

Нет мне не кажется, что есть противоречие - зачем нужна переменная если нельзя установить её значение.
Andy Mozzhevilov
Вам нужно поместить инициализированный массив в секцию, а затем линкеру указать, в какие адреса эту секцию положить.
Код
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 */

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

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

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

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


#pragma location= 0x00007e00 // адрес для записи
__root __flash uint32 reservForWrite[27];
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.