Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » Архив » Эмуляция EEPROM во флеш STM32


Эмуляция EEPROM во флеш STM32

Сообщений 1 страница 13 из 13

1

Мужики, ну ткните меня носом в правильный код! Не получается разместить переменную в самом конце прошивки, чтобы за ней был чисто свобдный флеш и я мог его весь использовать для хранения конфигурации...

2

F0?

3

После кода программы лежат ещё данные для инициализации ram, так что конец кода это не начало свободной флеш
В ld-скрипте есть переменные __etext - конец кода, _sdata и _edata - начало и конец данных [но _sdata и _edata не во флеш, а в ram]
К ним можно получить доступ в программе как extern uint32_t __etext и т.д.
И тогда начало свободной флеш можно вычислить &__etext+(&_edata-&_sdata)
Всё это теоретически, практически надо проверять )

4

MasterElectric написал(а):

F0?

Да все равно, в принципе. Код-то практически идентичный. Но пока работаю в F1.

vt написал(а):

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

vt написал(а):

И тогда начало свободной флеш можно вычислить &_etext+(&_edata-&_sdata)

В таком подходе мне не нравится то, что нет фиксированного адреса априори, его каждый раз при запуске нужно вычислять...

5

На казусе предложили создать секцию сразу после .data
Судя по дампу бинарника, вроде все как надо. Буду смотреть дальше, не возникнет ли косяков...

Ура, работает!
Правда, оказалось, что размер страницы у STM32F103 равен 1024 байтам, а не 2048 как я почему-то считал...

6

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

7

vt написал(а):

а не фиксированным

Все очень просто:

Код:
...
  .data :
  {
    . = ALIGN(4);
    _sdata = .;
    *(.data*)
    . = ALIGN(4);
    _edata = .;
  } >ram AT >rom

.myvars :
{
 . = ALIGN(1024);
 KEEP(*(.myvars))
} > rom

вуаля! И секция лежит с выравниванием по размеру страницы сразу за последней заполненной секцией!

8

При чем тут .data это же СОЗУ, проще подумать сколько нужно памяти под EEPROM столько и взять страниц флеша из конца. А так если зацепишь флеш, если сразу после кода брать, то затрешь потом программу. Поищу под как ф1 писать/стирать, но EEPROM не эмулировал (распределение данных по всей флеши для экономии ресурса)

9

Если кто-то еще не понял, поясню: я хотел использовать весь свободный объем флеша для эмуляции еепрома! А то в обычных реализациях получается, что килобайт 10 кода пользователя, пара килобайт на эмуляцию еепрома и 116кБ флеша простаивает пустым! В данном случае используется весь флеш и значительно уменьшается количество операций стирания.

10

А ну если так, то все-равно нужно быть аккуратнее, не у всех МК распределены страницы равномерно.

11

В случае STM32 все достаточно просто.
https://github.com/eddyem/stm32samples/ … hronometer

12

Eddy_Em написал(а):

И секция лежит с выравниванием по размеру страницы сразу за последней заполненной секцией!

Аа, фиксированный адрес означало выровненный )
Вычислять можно и в самом ld-скрипте
__eeprom = (__etext + _edata - _sdata + 0x400) & (~0x3ff);

13

vt написал(а):

Вычислять можно и в самом ld-скрипте

Согласен, можно и так. Особенно удобен такой вариант, если область эмуляции EEPROM'а не инициализируется в прошивке, а только после первого включения.


Вы здесь » Микроконтроллеры » Архив » Эмуляция EEPROM во флеш STM32