Как лучше выделять область флеш в скрипте линкера GCC в контексте
МК с зеркалированием памяти программ в ОЗУ? Для CH32V203G6U6 у себя пока сделал так, изменив родной скрипт (оставил лишь добавленное или изменённое мной. Новый раздел - EEPROM:
EEPROMSIZE = 4K;
FLASH_BASE = 0x08000000;
MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 32K - EEPROMSIZE
EEPROM (r) : ORIGIN = ORIGIN(FLASH) + LENGTH(FLASH) + FLASH_BASE, LENGTH = EEPROMSIZE
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 10K
}
SECTIONS
{
.eeprom :
{
} >EEPROM AT>EEPROM
}
А в исходном коде на Си, так:
#define EmptyHalfWord 0xe339u
#define StdPageSize 4096u
#define FastPageSize 256u
typedef uint16_t FLASHminWrite_t; //Minumum data amount to write to FLASH
volatile const FLASHminWrite_t __attribute__ ((section (".eeprom"), aligned (FastPageSize))) FLASHdata[StdPageSize / sizeof (FLASHminWrite_t)] = {EmptyHalfWord};
Всё работает. Имя объекта FLASHdata ссылается на адреса прямого доступа к FLASH, а не к адресам копии ОЗУ. Без создания секции в скрипте линкера, не удавалось написать чисто, без предупреждений компилятора.
Если резервировал память под константу как обычно, она размещалась в копии ОЗУ, а для прямого доступа, приходилось вычислять адрес со смещением. И компилятор ругался - дескать, у тебя нет такой памяти.
Приведённый пример, описывает секцию с прямым доступом к флеш по правильным адресам прямого доступа. Естественно, пришлось "почикать" размер области программ. Секция RAM осталась без изменений.
Есть у кого какие замечания _ПО_СУЩЕСТВУ_?
Если у вас замечания к использованию FLASH с записью/чтением из исполняемого МК кода, то пишите сюда (ссылка):
https://caxapa.ru/1509649.html