Как проверить запрос приложения, найденный в проекте загрузчика - PullRequest
0 голосов
/ 24 июня 2018

Я делаю загрузчик для микроконтроллера на базе arm cortex m0, и для этого я провел несколько проектов в github и не понимаю некоторые строки в следующем коде. Что означает строка *(__IO uint32_t*)APP_ADDRESS) & ~(RAM_SIZE-1) в следующем коде. Было бы здорово, если бы кто-то это объяснил. Заранее спасибо.

#define APP_ADDRESS     (uint32_t)0x08008000
#define RAM_SIZE        (uint32_t)0x00040000

uint8_t Bootloader_CheckForApplication(void)
{
    return ( ((*(__IO uint32_t*)APP_ADDRESS) & ~(RAM_SIZE-1)) == 0x20000000 ) ? BL_OK : BL_NO_APP;
}

1 Ответ

0 голосов
/ 27 июня 2019

Я полагаю, вы ссылаетесь на этот проект на https://github.com/akospasztor/stm32-bootloader

Цель Bootloader_CheckForApplication() - определить, находится ли действительное приложение в APP_ADDRESS или 0x0800 8000.Начало этого образа приложения на самом деле - векторная таблица , поэтому значение *(__IO uint32_t*)APP_ADDRESS является начальным значением указателя стека (SP).(Ссылка описывает Cortex-M3, но первые две записи таблицы векторов одинаковы для всех процессоров Cortex-M)

Вы можете увидеть использование этого начального SP и вектора сброса в функции Bootloader_JumpToApplication() в том же исходном файле на https://github.com/akospasztor/stm32-bootloader/blob/master/Src/bootloader.c

Обратите внимание, что автор использует STM32L4, из которых начальный адрес ОЗУ равен 0x2000 0000, последний адрес - 0x2003 FFFF, а размер ОЗУ - 0x0004 0000.В этом случае Bootloader_CheckForApplication() проверяет, находится ли сохраненный начальный SP в области ОЗУ.

Однако эта проверка не будет правильной, если начальный SP окажется 0x2004 0000, что является наивысшим допустимым значениемв этом случае.(Обратите внимание, что процессоры Cortex-M используют полный нисходящий стек )

...