Мужики, ну ткните меня носом в правильный код! Не получается разместить переменную в самом конце прошивки, чтобы за ней был чисто свобдный флеш и я мог его весь использовать для хранения конфигурации...
Эмуляция EEPROM во флеш STM32
Сообщений 1 страница 13 из 13
Поделиться32019-07-10 21:53:25
После кода программы лежат ещё данные для инициализации ram, так что конец кода это не начало свободной флеш
В ld-скрипте есть переменные __etext - конец кода, _sdata и _edata - начало и конец данных [но _sdata и _edata не во флеш, а в ram]
К ним можно получить доступ в программе как extern uint32_t __etext и т.д.
И тогда начало свободной флеш можно вычислить &__etext+(&_edata-&_sdata)
Всё это теоретически, практически надо проверять )
Поделиться42019-07-10 22:13:28
F0?
Да все равно, в принципе. Код-то практически идентичный. Но пока работаю в F1.
После кода программы лежат ещё данные для инициализации ram, так что конец кода это не начало свободной флеш
И тогда начало свободной флеш можно вычислить &_etext+(&_edata-&_sdata)
В таком подходе мне не нравится то, что нет фиксированного адреса априори, его каждый раз при запуске нужно вычислять...
Поделиться52019-07-10 22:48:42
На казусе предложили создать секцию сразу после .data
Судя по дампу бинарника, вроде все как надо. Буду смотреть дальше, не возникнет ли косяков...
Ура, работает!
Правда, оказалось, что размер страницы у STM32F103 равен 1024 байтам, а не 2048 как я почему-то считал...
Поделиться62019-07-10 22:57:32
Тогда я не понимаю что тебе надо
Адрес секции после .data так же будет зависимым от размера кода и данных, а не фиксированным
Поделиться72019-07-10 23:22:02
а не фиксированным
Все очень просто:
... .data : { . = ALIGN(4); _sdata = .; *(.data*) . = ALIGN(4); _edata = .; } >ram AT >rom .myvars : { . = ALIGN(1024); KEEP(*(.myvars)) } > rom
вуаля! И секция лежит с выравниванием по размеру страницы сразу за последней заполненной секцией!
Поделиться82019-07-10 23:31:42
При чем тут .data это же СОЗУ, проще подумать сколько нужно памяти под EEPROM столько и взять страниц флеша из конца. А так если зацепишь флеш, если сразу после кода брать, то затрешь потом программу. Поищу под как ф1 писать/стирать, но EEPROM не эмулировал (распределение данных по всей флеши для экономии ресурса)
Поделиться92019-07-10 23:35:43
Если кто-то еще не понял, поясню: я хотел использовать весь свободный объем флеша для эмуляции еепрома! А то в обычных реализациях получается, что килобайт 10 кода пользователя, пара килобайт на эмуляцию еепрома и 116кБ флеша простаивает пустым! В данном случае используется весь флеш и значительно уменьшается количество операций стирания.
Поделиться102019-07-10 23:44:26
А ну если так, то все-равно нужно быть аккуратнее, не у всех МК распределены страницы равномерно.
Поделиться112019-07-10 23:54:45
В случае STM32 все достаточно просто.
https://github.com/eddyem/stm32samples/ … hronometer
Поделиться122019-07-11 09:27:16
И секция лежит с выравниванием по размеру страницы сразу за последней заполненной секцией!
Аа, фиксированный адрес означало выровненный )
Вычислять можно и в самом ld-скрипте
__eeprom = (__etext + _edata - _sdata + 0x400) & (~0x3ff);
Поделиться132019-07-11 10:51:14
Вычислять можно и в самом ld-скрипте
Согласен, можно и так. Особенно удобен такой вариант, если область эмуляции EEPROM'а не инициализируется в прошивке, а только после первого включения.