ARM, как не перезаписывается содержимое указанного имени раздела?

avatar
jonathan eslava
8 августа 2021 в 18:36
38
1
0

Я работаю над прошивкой, написанной на C++ с mbed-os для микроконтроллера серии STM32F4. Есть часть кода, которая должна выполняться только при первой загрузке. Для достижения этой цели разработчик использует раздел памяти с именем mysection для хранения флага с именем MAGIC_INIT_CODE. mysection определяется в файле компоновщика компилятора ARM_GCC в памяти text. Содержимое mysection записывается строками ниже в самом начале, сразу после включения заголовков:

extern uint32_t __mysection_start__;
extern uint32_t __mysection_end__;
#define MAGIC_INIT_CODE 0xBDDBBDDBBDDBBDDB
static uint64_t magicCode __attribute__((__section__(".mysection"),used)) = MAGIC_INIT_CODE;

Затем в функциональном блоке main() он перезаписывается следующими строками:

if(magicCode == MAGIC_INIT_CODE){
    uint64_t voidMagicCode = 0;
    FW_Manager_Interface.MicroFlash.ProgramFlash(reinterpret_cast<uint32_t>(&__mysection_start__), reinterpret_cast<uint8_t*>(&voidMagicCode) , 8, false);
    #ifdef BOOTLOADER_MODE
    err = FW_Manager_Interface.FW_Checker.updateExternalBackup(Bootloader);
    appSettings.boot_outcome = BOOT_OUTCOME_UNKNOWN;
    appSettings.store();
    #else
    err = FW_Manager_Interface.FW_Checker.updateExternalBackup(Application);
    #endif
}

Поэтому, если содержимое mysection равно MAGIC_INIT_CODE, логика становится истинной, содержимое mysection перезаписывается и функция резервного копирования берет резервную копию. При выполнении программы MicroFlash.ProgramFlash записывает указанное значение в соответствующий адрес памяти, начиная с __mysection_start__. Это ясно. Но вот чего я не понимаю, так это то, как содержимое моего раздела не меняется после первой загрузки? В частности, я не понимаю, что делает строка ниже.

 static uint64_t magicCode __attribute__((__section__(".mysection"),used)) = MAGIC_INIT_CODE;

В чем смысл приравнивания mysection к MAGIC_INIT_CODE. Это похоже на присвоение значения имени переменной или MAGIC_INIT_CODE записывается в указанный адрес памяти? Как эта строка не изменяет содержимое mysection после первой загрузки? Насколько я знаю счетчик программ начинает выполнение с первой строки. Затем он всегда достигает этой точки после каждого сброса. Но почему содержимое mysection снова не меняется на MAGIC_INIT_CODE?

Источник

Ответы (1)

avatar
0___________
8 августа 2021 в 19:27
1

эта строка помещает объект uint64_t в раздел .mysection и инициализирует его значением MAGIC_INIT_CODE. Если .mysection помещено во флэш-память, оно будет там постоянно. Он программируется, когда вы загружаете свою программу в свой микро. Его значение будет постоянным (оно не может быть изменено стандартными операциями C. Вы можете изменить его значение, только стерев флэш-память и запрограммировав новое значение)

jonathan eslava
8 августа 2021 в 20:06
0

Я понимаю. Но FW_Manager_Interface.MicroFlash.ProgramFlash(reinterpret_cast<uint32_t>(&__mysection_start__), reinterpret_cast<uint8_t*>(&voidMagicCode) , 8, false); записывает ноль в начальный адрес mysection. В противном случае резервный код выполнялся бы при каждой загрузке, а дело в том, что он выполняется только при первой загрузке. Вот прототип ProgramFlash, если это поможет: int c_Micro_Flash::ProgramFlash( uint32_t Address, uint8_t* Data, uint32_t size, bool autoErase )

0___________
8 августа 2021 в 20:20
0

Чтобы понять это, вам нужно прочитать Справочное руководство - раздел FLASH. Вы поймете, как программа может изменить содержимое FLASH.