ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
6 апреля
1510232 Топик полностью
Nikolay_Po (Вчера, 11:34, просмотров: 94) ответил VladislavS. на С любой памятью можно работать по указателю не привлекая в этот процесс линкер. Так же как вы с регистрами периферии делаете.
Спасибо. Всё же, переделал без вмешательства в скрипт линкера. Всё определяется в коде Си. Из недостатков - лишь невозможность определить размер объекта со смещением. Сделал так: 
#define FLASHemptyRaw 0xFFFFu //Unscrambled value of empyt FLAHS cell
#define FLASHscramb 0x1CC6u //Hardware XOR scrambling value
#define FLASHemptyHW (FLASHemptyRaw ^ FLASHscramb) //0xE339u - empty half word value of erased FLASH cell after hardware scrambling
#define FLASHemptyWord (((uint32_t)FLASHemptyHW << 16) | FLASHemptyHW) //0xE339E339 erased FLASH state in a word

#define StdPageSize 4096u //Standard page size in bytes (used as recommended FLASH area size) #define FastPageSize 256u //Minumum writtable FLASH size in bytes #define EEPROMemulSize StdPageSize
//Define FLASH region for EEPROM emulation and initialize it by 0xFFFFu respecting hardware scrambling volatile const uint32_t __attribute__ ((section (".rodata"), aligned (FastPageSize))) FLASHdata[EEPROMemulSize / sizeof (uint32_t)] = {FLASHemptyWord}; const uint32_t FLASHdirectAccess = (uint32_t)FLASHdata + FLASH_BASE; //FLASH direct access alias address value for FLASHdata allotment const uint32_t FLASHsize = (uint32_t)sizeof (FLASHdata);//Dedicated FLASH size in bytes


В коде взаимодействия с флеш, в подавляющем большинстве случаев всё равно используется просто uint32_t, а не указатель. Лишь для прямого чтения привожу тип FLASHdirectAccess к нужному указателю. Руководство говорит, что можно читать хоть побайтно.

Без явного указания секции, расположенной во флеш, эти 4к занимают ОЗУ. Указал .rodata - норм. Всё работает и ОЗУ не занимает.


С приведённым выше кодом, флеш инициализируется 0xFFFF (читается как 0xE339), как и положено. Чиста и готова к записи.