Запустить загрузчик из прошивки

Я хочу иметь возможность запускать загрузчик непосредственно из кода без необходимости иметь высокий контакт и сбрасывать микроконтроллер для доступа к нему. Идея ниже заключается в том, что двоичный файл загрузчика хранится в массиве символов. При вызове Start_BootLoader() загрузчик копируется в SRAM и выполняется.

Однако код копируется в ОЗУ, но когда он пытается выполнить код в том месте, куда я его скопировал, он ничего не делает.

Микро. это Energy Micro EFM32380f1024. Приведенный ниже код, который я использую, основан на примечаниях по применению Energy Micro AN0042.

void Start_Bootloader(void)
{
  /* Diable interrupts */
  INT_Disable();

  __set_MSP( ( 0x20000000 + sizeof( bootloader ) + 0x400 ) & 0xFFFFFFF0 );

  /* Load the entire bootloader into SRAM. */

  memcpy( (void*)0x20000000, bootloader, sizeof( bootloader ) );

  /* Start executing the bootloader. */

  BOOT_jump( *(uint32_t*)0x20000000, *(uint32_t*)0x20000004 );
}

person allanwglen    schedule 24.03.2014    source источник
comment
Я не знаю конкретно это устройство, но быстрый поиск в Интернете указывает на чип ARM? Вы скопировали код. BOOT_jump()Очищает ли кэш инструкций?   -  person mfro    schedule 25.03.2014
comment
Мне не ясно, что загрузчик EM не зависит от позиции. Я ничего не видел в примечании к приложению, и файлы проекта IAR, которые распространяются вместе с примечанием к приложению, не строят его как независимое от позиции. Поэтому я думаю, мне было бы интересно, что заставляет вас думать, что он должен запускаться при копировании в новую область памяти.   -  person andy mango    schedule 25.03.2014
comment
Вы убедились, что данные загрузчика действительно существуют (в энергонезависимой памяти), а не просто копируются случайные данные из ОЗУ в ОЗУ?   -  person old_timer    schedule 25.03.2014
comment
а вы отключили кеши i и d?   -  person old_timer    schedule 25.03.2014
comment
EFM32GG не имеет ни I, ни D кэша. См. тег Cortex M3.   -  person Turbo J    schedule 25.03.2014


Ответы (1)


Код поставляется с настройками компоновщика ПЗУ и ОЗУ, но в вашем случае, скорее всего, будет работать только версия для ОЗУ. Попробуйте прочитать второе слово (32-битный прямой порядок байтов) из вашего двоичного файла — оно должно указывать на нечетный адрес в диапазоне 0x20000000, так как это новое значение ПК.

person Turbo J    schedule 24.03.2014
comment
Тот: *(uint32_t*)0x20000004 после memcpy(). - person Turbo J; 25.03.2014