2016-09-02 3 views
0

Я разделил программное обеспечение на две части: загрузчик (без RTX), образ приложения с RTX. Но загрузчик не смог загрузить изображение приложения с помощью RTX. настройки срабатывания вспышки является:IAP Bootloader не смог загрузить изображение приложения RTX

 
-------------------------------------------------------------------- 
     start address  size 
IROM 1: 0x08000000   0x2800 - Bootloader (without RTX) 
IROM 2: 0x08002800   0xD000 - Application Image (with RTX) 

У меня есть тест 3 способа: (1) С помощью другого приложения без RTX. Загрузочный загрузчик может загрузить приложение успешно.

(2) Измените приложение с настройкой IROM проекта RTX. Я меняю начальный адрес IROM проекта приложения с 0x08002800 на 0x08000000. И я загружаю изображение приложения в flash с адреса 0x08000000. Изображение может успешно работать с 0x08000000.

(3) Исходный адрес изображения IROM приложения - 0x08002800. После загрузки загрузочного загрузчика и изображения приложения во флэш-память я отлаживаю проект приложения по-умолчанию. Я обнаружил, что существует ошибка «переполнение стека osTimerthread». Затем также перекрывается основной поток потоков. Я попытался увеличить размер стека, но он не работает. Я обнаружил, что приложение запускается при переключении ядра RTX. Все потоки находятся в состоянии ожидания и не работают.

Ps, когда я отлаживаю keil, тестовый элемент (2) также имеет ошибки переполнения стека во время инициализации ядра. Предмет (2) отлично работает до сих пор. Поэтому я просто помещаю любую информацию, необходимую здесь.

Это изображение отладки для элемента (3). enter image description here

ответ

0

ли вы на самом деле изменения сценария компоновщика, чтобы связать начиная с 0x08002800 при использовании загрузчика или просто загрузки приложения (ссылки на 0x08000000) по смещению 0x2800? Дважды проверьте это (посмотрите в файле карты) для вашего связанного вывода, чтобы убедиться, что все ваши символы не связаны в диапазоне 0x08000000 - 0x08002800.

Кроме того, убедитесь, что вы используете правильную точку входа и указатель стека. Указатель стека приложения должен быть равен 0x08002800, а вектор сброса будет равен 0x08002804. Ваш загрузчик должен будет установить регистр MSP с правильным указателем стека перед тем, как перейти к приложению. Вот несколько примеров кода с USB DFU загрузчику С.Т.:

typedef void (*pFunction)(void); 
pFunction JumpToApplication; 
uint32_t JumpAddress; 

/* Jump to user application */ 
JumpAddress = *(__IO uint32_t*) (USBD_DFU_APP_DEFAULT_ADD + 4); 
JumpToApplication = (pFunction) JumpAddress; 

/* Initialize user application's Stack Pointer */ 
__set_MSP(*(__IO uint32_t*) USBD_DFU_APP_DEFAULT_ADD); 
JumpToApplication(); 

Кроме того, в зависимости от того, насколько ваш загрузчик конфигурирует, прежде чем прыгать в приложение, вам может понадобиться «» некоторые из конфигурации периферийных устройств. Например, если вы настроите свои часы в загрузчике, прежде чем решите перейти к приложению, вы можете столкнуться с проблемами в своем приложении, если предполагается, что часы уже находятся в конфигурации по умолчанию. Аналогичные вещи могут произойти с NVIC и SysTick, если ваш загрузчик использует их перед тем, как перейти к приложению.

Наконец, в тех же строках, что и в предыдущем разделе, приложение может делать предположения о том, что состояние периферийных устройств является стандартным, но также может быть сделано предположение, что значения по умолчанию по умолчанию являются правильными. Например: SCB->VTOR имеет значение по умолчанию (я считаю, что оно всегда 0x00000000), и это указывает на таблицу векторов. Ваш загрузчик будет привязан к своей векторной таблице в этом месте. Вам нужно убедиться, что при запуске приложения оно обновляет регистр VTOR, чтобы указать на фактическое местоположение его векторной таблицы.

Надеюсь, один из этих разделов поможет вам определить проблему.

+0

Спасибо. ** (1) ** Мой загрузчик настроил системные часы. Потому что это первая работа в startup.s. И startup.s в приложении также повторно инициализирует его. ** (2) ** И, как и в моем посте, ядро ​​RTX os работает, но оно находится в бесконечных задачах переключения цикла. Все задачи были в состоянии «ГОТОВ», но ядро ​​ОС не могло поместить одного из них в состояние «РАБОТА». Таким образом, не было шансов называться основным и пользовательским потоками. –

Смежные вопросы