eddy_em: (Default)
[personal profile] eddy_em
Очень неудобно задавать размер блока флеш-памяти в заголовочных файлах, т.к. он все равно должен быть определен в линкере (для выравнивания начала "эмуляции EEPROM во флеш"). Сейчас наткнулся на косяк: и в линкере, и в дефайнах у меня размер блока руками написан как 1024 байт, хотя в STM32F072CBT6 размер - 2кБ!
Попробовал явно в линкер-скрипте для данного МК указать. В файле 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;

Сложная штука — эти линкер-скрипты. Я до сих пор внутрь них как в магию какую-то смотрю!

April 2025

S M T W T F S
  1 23 45
67 89101112
13141516171819
20212223242526
27282930   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 22nd, 2025 02:19 am
Powered by Dreamwidth Studios