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;

Сложная штука — эти линкер-скрипты. Я до сих пор внутрь них как в магию какую-то смотрю!
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org

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 03:29 am
Powered by Dreamwidth Studios