|
RL-ARM и bootloader, Запуск основной программы после перепрошивки |
|
|
|
May 3 2012, 09:01
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305

|
Имеется следующий проектик, как водится, состоящий из двух частей. Бутлоадер и основная программа. Причем в основной программе также есть блок перепрошивки "самой себя". Используется RL-ARM. Вопрос в следующем - как после перпрошивки перезапустить проц? Собсно как перезапустить более или менее понятно. Проблема в том, что после перезапуска все уходит в HardFault при вызове os_sys_init(). Т.е. перешиваемся, рестартуем, код запускается, но как только доходит до инита операционки - вылет. Кто знает, как это победить? Компилятор ессно Keil.
|
|
|
|
|
 |
Ответов
|
May 24 2012, 07:50
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305

|
Ну как-же не признался.  Вот оно все. Было. Цитата(EXeGLuMATOR @ May 21 2012, 17:00)  Отвлекся на другие дела... Не совсем может понятно написал. В лоадере RL-ARM не используется. Там все просто. Камушек LPC1343. Используется встроенный HID - драйвер. По HID происходит обносвление основной прошивки. Потом соотв переход на неё. Из встроенной периферии используется помимо USB еще UART - для вывода сообщений. Ну GPIO еще. И собственно все. Так вот, если заливать и стартовать основной код с адреса 0 - то он сам себя прекрасно перезапускает. Тестовый код тоже простой - ничего не инитится, только ЮАРТ - вывод строчки на терминал и далее - перезагрузка. Следующий этап - через лоадер. Заливаем софтинку лоадером. Если простая тестовая софтинка - та-же что и впредыдущем этапе - все нормально. Все обновляется, запускается и выполняется переход на основной код. Там тоже все нормально. Но как только появляется RL-ARM в пользовательском софте - все. Никаких движений после перехода на пользовательский софт. Стартапы одинаковые - тестовый проект сделан на базе основного, только урезан по максимуму. Вот - как-то так. Аналогичные грабли были и на LPC2368. Но там разобрался. Цитата На LPC2368 - нужно было стартап править и таблицу SWI. Здесь не пойму, что не так.
Может кто-нибудь startup_LPC13xx.s и SVC_Table.s от рабочих проектов с RL-ARM в качестве загружаемой софтины выложить? Перерыл кучу форумов в том числе и и на Кейле - народ мается теми-же проблемами, но решения что-то не нашел.
|
|
|
|
|
May 24 2012, 08:05
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (EXeGLuMATOR @ May 24 2012, 10:50)  Ну как-же не признался.  Вот оно все. Было. Виноват. Пропустил. Могу посоветовать такой алгоритм: 1) запрещаете прерывания. 2) записываете в SCB->VTOR значение PAYLOAD_START_ADDR. 3) Записывате в MSP значение, взятое по адресу PAYLOAD_START_ADDR. (используйте функцию CMSIS __set_MSP()) 4) Делаете переход таким образом: CODE void (*user_code_entry)(void); user_code_entry = *((void (**)(void))(PAYLOAD_START_ADDR+4)); user_code_entry(); Обратите внимание, что вы переходите не на адрес PAYLOAD_START_ADDR+4, а на адрес, который записан в ячейке с адресом PAYLOAD_START_ADDR+4. Ваши же примеры являют какую-то смесь из кода запуска для ARM (переход на первый адрес приложения, по которому располагается вектор исключения, представляющий из себя команду перехода) и кода для Cortex у которого вектор сброса расположен со смещением 4 байта (или sizeof(int)), но он представляет из себя не команду, а указатель. Поэтому очень сомнительно, что ваш предыдущий код хоть как-то работал. Добавлено: похоже, не все кортексы-M3 одинаково одинаковые. Открыл мануал на 13xx, в нем нет упоминания про VTOR (хотя это часть ядра M3), зато есть упоминание про REMAP. Поищу еще, но, похоже, вам придется делать копирование векторов в ОЗУ и Remap.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 24 2012, 08:30
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305

|
Цитата(Сергей Борщ @ May 24 2012, 12:05)  Виноват. Пропустил. Могу посоветовать такой алгоритм: 1) запрещаете прерывания. 2) записываете в SCB->VTOR значение PAYLOAD_START_ADDR. 3) Записывате в MSP значение, взятое по адресу PAYLOAD_START_ADDR. (используйте функцию CMSIS __set_MSP()) 4) Делаете переход таким образом: Код void (*user_code_entry)(void); user_code_entry = *((void (**)(void))(PAYLOAD_START_ADDR+4)); user_code_entry(); Обратите внимание, что вы переходите не на адрес PAYLOAD_START_ADDR+4, а на адрес, который записан в ячейке с адресом PAYLOAD_START_ADDR+4. Ваши же примеры являют какую-то смесь из кода запуска для ARM (переход на первый адрес приложения, по которому располагается вектор исключения, представляющий из себя команду перехода) и кода для Cortex у которого вектор сброса расположен со смещением 4 байта (или sizeof(int)), но он представляет из себя не команду, а указатель. Поэтому очень сомнительно, что ваш предыдущий код хоть как-то работал. Добавлено: похоже, не все кортексы-M3 одинаково одинаковые. Открыл мануал на 13xx, в нем нет упоминания про VTOR (хотя это часть ядра M3), зато есть упоминание про REMAP. Поищу еще, но, похоже, вам придется делать копирование векторов в ОЗУ и Remap. Спасибо. Проверю. Еще вопросик - какие особенности при компиляции основной программы? С учетом RL-ARM? Ну, помимо адреса старта.
|
|
|
|
Сообщений в этой теме
EXeGLuMATOR RL-ARM и bootloader May 3 2012, 09:01 jcxz как делаете рестарт? May 3 2012, 10:44 EXeGLuMATOR Цитата(jcxz @ May 3 2012, 14:44) как дела... May 3 2012, 11:48  _Артём_ Цитата(EXeGLuMATOR @ May 3 2012, 14:48) Р... May 3 2012, 15:49  jcxz Цитата(EXeGLuMATOR @ May 3 2012, 17:48) А... May 4 2012, 01:54 AlexandrY Цитата(EXeGLuMATOR @ May 3 2012, 12:01) Т... May 3 2012, 17:18 Sanya_kv EXeGLuMATOR
А какое ядро Вы используете ARM 7 или ... May 4 2012, 05:35 net QUOTE (EXeGLuMATOR @ May 21 2012, 17:00) ... May 23 2012, 05:18   Сергей Борщ QUOTE (Сергей Борщ @ May 24 2012, 11:05) ... May 24 2012, 08:50 EXeGLuMATOR Да может и явный ляп. Понять-бы где.
На LPC2368 - ... May 23 2012, 11:41 jcxz Не очень понятно - зачем упорно пытаться сделать с... May 24 2012, 02:14  EXeGLuMATOR Цитата(jcxz @ May 24 2012, 06:14) Не очен... May 24 2012, 04:34   Сергей Борщ QUOTE (EXeGLuMATOR @ May 24 2012, 07:34) ... May 24 2012, 05:47    EXeGLuMATOR Цитата(Сергей Борщ @ May 24 2012, 09:47) ... May 24 2012, 05:58     jcxz Цитата(EXeGLuMATOR @ May 24 2012, 11:58) ... May 24 2012, 06:52      Сергей Борщ QUOTE (jcxz @ May 24 2012, 09:52) Как пол... May 24 2012, 07:14 EXeGLuMATOR Да, сурово. Повелся на экономию места и цену. И ка... May 24 2012, 10:20 Сергей Борщ QUOTE (EXeGLuMATOR @ May 24 2012, 13:20) ... May 24 2012, 11:30 EXeGLuMATOR Урррааа! Заработало. Большое спасибо!
Дума... May 25 2012, 08:46
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|