ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
25 апреля
1079414 Топик полностью
evgeniy1294 (22.02.2021 14:58, просмотров: 427) ответил Kceния на Компилятор помещает массивы в секцию (вероятно bss), где вся эта секция обнуляется startup-кодом еще до входа в main(). Все так делают, нулями прошивку не заполняют. В ARMе заполнение нулями происходит 32-битными порциями (обнуленный регистр в цикле копируется в память), видимо из-за этого ее размер в байтах должен делиться на 4 байта без остатка. Позже я нашла иной способ - через дефиницию __no_init, тогда линкер размещает массив в другой сегмент, который при старте
Не самое лучшее решение размещать в памяти данные через директивы компилятора, я бы даже сказал максимально плохое. Нужно размещать секции через скрипт линкера, которому дополнительно можно объяснить, какие объекты куда класть. Код из куба делает следующее: 

1) Проверяет, объявлен ли DATA_IN_D2_SRAM - его объявление означает, что вы разместили данные в D2 SRAM. Т.е вы должны ручками указать где-то в заголовочниках, либо в настройках проекта

#define DATA_IN_D2_SRAM (1u)

2) Далее он проверяет, существует ли битовая маска RCC_AHB2ENR_D2SRAM3EN, если она объявлена, значит есть все три области памяти в D2. Все три области будут включены.

3) Если такой нет, проверяет наличие битовой маски RCC_AHB2ENR_D2SRAM2EN, если она есть, значит есть только две области памяти в D2. Эти две области будут включены.

4) Если и этой маски нет, значит остается только вариант с

RCC->AHB2ENR |= (RCC_AHB2ENR_AHBSRAM1EN | RCC_AHB2ENR_AHBSRAM2EN);

Эти битовые маски хранятся в заголовке cmsis и генерируются машиной по verilog-модели чипа. Так как у чипа есть модификации с разным числом областей памяти, то и библиотека построена таким образом.