![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Очень неудобно задавать размер блока флеш-памяти в заголовочных файлах, т.к. он все равно должен быть определен в линкере (для выравнивания начала "эмуляции EEPROM во флеш"). Сейчас наткнулся на косяк: и в линкере, и в дефайнах у меня размер блока руками написан как 1024 байт, хотя в STM32F072CBT6 размер - 2кБ!
Попробовал явно в линкер-скрипте для данного МК указать. В файле stm32f072B.ld задаю:
А в stm32f01234.ld пишу:
Однако, если я пытаюсь у себя в исходниках обратиться к этой переменной:
то вместо ожидаемого 2048 получаю какое-то непонятное 2953142315.
Вопрос: как мне получить значение переменной _BLOCKSIZE в своем сишном файле?
Пытаюсь вот так сделать:
И все равно получаю 2953142315!
UPD. Разобрался. Надо было вот так:
Сложная штука — эти линкер-скрипты. Я до сих пор внутрь них как в магию какую-то смотрю!
Попробовал явно в линкер-скрипте для данного МК указать. В файле stm32f072B.ld задаю:
MEMORY { rom (rx) : ORIGIN = 0x08000000, LENGTH = 128K ram (rwx) : ORIGIN = 0x20000000, LENGTH = 16K } PROVIDE(_BLOCKSIZE = 2048); INCLUDE stm32f01234.ld
А в stm32f01234.ld пишу:
... .myvars : { . = ALIGN(_BLOCKSIZE); __varsstart = ABSOLUTE(.); KEEP(*(.myvars)); } > rom
Однако, если я пытаюсь у себя в исходниках обратиться к этой переменной:
extern const uint32_t _BLOCKSIZE;
то вместо ожидаемого 2048 получаю какое-то непонятное 2953142315.
Вопрос: как мне получить значение переменной _BLOCKSIZE в своем сишном файле?
Пытаюсь вот так сделать:
static const uint32_t *blocksize = (uint32_t*)&_BLOCKSIZE;
И все равно получаю 2953142315!
UPD. Разобрался. Надо было вот так:
static const uint32_t blocksize = (uint32_t)&_BLOCKSIZE;
Сложная штука — эти линкер-скрипты. Я до сих пор внутрь них как в магию какую-то смотрю!