Перейти к содержанию
    

Проблема со стартом приложения из загрузчика

Добрый день,

Ситуация следующая.
Есть бутлоадер, из которого стартует основное приложение.

Если я загружаю и запускаю основное приложение по адресу  0x08020000 непосредственно из IAR. всё работает чётко, но если программу запускает загрузчик, один из потоков затыкается (возможно и не один)
Отладки при старте через загрузчик нет, поэтому приходится только гадать.

Часть бутлоадера:

#define MAIN_PROGRAM_START_ADDRESS              (uint32_t)0x08020000
void jumpToApplication(); // Переход в основную программу
typedef   void (*pFunction)(void);
uint32_t  jumpAddress;
pFunction Jump_To_Application;
.........................
.........................
void jumpToApplication()
{
  HAL_DeInit();
  __disable_irq ();                           //Пробовал комментировать, без толку
  jumpAddress = *(__IO uint32_t*) (MAIN_PROGRAM_START_ADDRESS + 4);
  Jump_To_Application = (pFunction) jumpAddress;
  SCB->VTOR = MAIN_PROGRAM_START_ADDRESS;
  __set_MSP(*(__IO uint32_t*) MAIN_PROGRAM_START_ADDRESS);
  Jump_To_Application();
}

Приведу комментарий из основной программы, т.е. это то, что там сделано.
  // ВНИМАНИЕ: НЕСТАНДАРТНОЕ РАЗМЕЩЕНИЕ ПРОГРАММЫ ВО FLASH: 0x08020000 (стандартное 0x08000000)
  // Так как используем загрузчик, эту программу нужно разместить там, куда прыгает загрузчик (см. в загрузчике MAIN_PROGRAM_START_ADDRESS)
  // в нашем случае (0x08020000), поэтому нужно поправить:
  // 1. Указать абсолютный адрес программы во flash в настройках линкера.
  //        тут: VECTOR TABLE/.intvec start
  //        тут: Memory Regiong/ROM Start
  // 2. В system_stm32f2xx.c в VECT_TAB_OFFSET указать сдвиг относительно стандартного размещения программы.
  // В нашем случае VECT_TAB_OFFSET = 0x20000 (т.е. 0x08020000 - 0x08000000)


Самое интересное, что иногда приложение стартует штатно. примерно 1 раз из 5, всегда по разному.

 

Дополнение.
Если я запускаю бутлоадер из IAR, далее основная программа запускается всегда КОРРЕКТНО.

Что может быть, или как отловить?
Всю дополнительную информацию готов предоставить.
Просьба кидать все идеи

 

Изменено пользователем haker_fox
Добавил теги к популярной теме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему нет отладки?

Загрузчик модифицируете так, чтобы не ставилась защита.

Заливаете загрузчик из под отладчика. Далее заливаете программу штатно через загрузчик.

Попадается в Jump_To_Application (). Переключаетесь на отладочные символы программы и вперед! Как сделать последнее в IAR - не знаю :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что делает загрузчик до старта приложения? Не оставляет ли он после себя разрешенные прерывания, периферию, ПДП (DMA)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 hours ago, x893 said:

Посмотрите отладчиком, что делает загрузчик перед jumpToApplication.

 

 

2 minutes ago, Johnny81 said:

А почему нет отладки?

Загрузчик модифицируете так, чтобы не ставилась защита.
О какой защите идёт речь?

Заливаете загрузчик из под отладчика. Далее заливаете программу штатно через загрузчик.

Попадается в Jump_To_Application (). Переключаетесь на отладочные символы программы и вперед! Как сделать последнее в IAR - не знаю :)

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

Вчера многократно проверял, старт бутлоадера из-под дебагера - нет никаких проблем.
Старт основной программы из-под дебагера - тоже никаких проблем (ведь так я писал основное приложение)
Но как только загрузчик стартует самостоятельно, приложение начинает себя вести (ПОЧТИ ВСЕГДА (НО НЕ ВСЕГДА) нештатно.
Причём как говорил ранее, в 1 случае из 5-7 включений, запуск происходит корректно.
Питание снял/подал - опять не работает, в следующий раз может заработать. и т.д.

В этой связи, сейчас нужно понять, почему может быть такой плавающий эффект.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, Сергей Борщ said:

Что делает загрузчик до старта приложения? Не оставляет ли он после себя разрешенные прерывания, периферию, ПДП (DMA)?

Запрет прерываний установлен, пробовал убрать никакой разницы нет
 
__disable_irq (); 
                          //Пробовал комментировать, без толку

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы снять вопросы по коду бутлоадера, выкладываю https://pastebin.com/kWnqiTNX

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 минут назад, simark1979 сказал:

Запрет прерываний установлен, пробовал убрать никакой разницы нет
 
__disable_irq (); 
                          //Пробовал комментировать, без толку

Толку от глобального запрета, если загрузчик оставляет включенным, скажем, таймер с разрешенным прерыванием, для которого в приложении нет обработчика прерывания? Вы разрешите прерывания в своем приложении и этот обработчик "выстрелит". Также чудеса можно получить, если загрузчик оставляет настроенным ПДП (DMA), который пишет в область ОЗУ, используемую приложением.

 

Вообще ИАР издавна позволял подключиться отладчиком "на лету". Очень помогает в подобных случаях.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

35 minutes ago, Сергей Борщ said:

Толку от глобального запрета, если загрузчик оставляет включенным, скажем, таймер с разрешенным прерыванием, для которого в приложении нет обработчика прерывания? Вы разрешите прерывания в своем приложении и этот обработчик "выстрелит". Также чудеса можно получить, если загрузчик оставляет настроенным ПДП (DMA), который пишет в область ОЗУ, используемую приложением.

Вообще ИАР издавна позволял подключиться отладчиком "на лету". Очень помогает в подобных случаях.
 

Отличная идея про "дебаг на лету", об этом совершенно забыл, Спасибо)
Сейчас буду дебажить

Изменено пользователем simark1979

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблему локализовал.
Загрузчик оказался совершенно не причём.
Оказалось, что при подаче питания внешний АЦП не всегда выставляет бит готовности данных (с чем я сейчас и буду разбираться), а поток обслуживающий чтение из АЦП его ждал в бесконечном цикле, в виду чего никто не клал данные в очередь и т.д. и.т.п.
Смысла рассказывать дальше наверное нет смысла.
Всем огромное спасибо за участие!

Изменено пользователем simark1979

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, simark1979 said:

 а поток обслуживающий чтение из АЦП его ждал в бесконечном цикле,

 

Может, заодно и концепцию бесконечных циклов пересмотрите?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, Aleksandr Baranov said:

Может, заодно и концепцию бесконечных циклов пересмотрите?

Добавил задержку перед началом работы с АЦП, работает без сбоев.
Но бесконечный цикл конечно буду убирать,  это не дело висеть в ожидании, ведь АЦП может выйти из строя....

Спасибо, что беспокоитесь!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

44 минуты назад, Aleksandr Baranov сказал:

Может, заодно и концепцию бесконечных циклов пересмотрите?

А вот тут надо 10 раз подумать. Недавно споткнулся об бесконечный цикл ожидания включения HSE. Ножка контроллера к кварцу была плохо пропаяна. Неисправность найдена в 5 сек. А проскочил бы он, где мне потом глюки ловить без кварца на объекте? На каждый чих телеметрию и диагностику не повесишь. Уж лучше пусть висит там где неисправность. Проще локализовать будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, VladislavS said:

А вот тут надо 10 раз подумать. Недавно споткнулся об бесконечный цикл ожидания включения HSE. Ножка контроллера к кварцу была плохо пропаяна. Неисправность найдена в 5 сек. А проскочил бы он, где мне потом глюки ловить без кварца на объекте? На каждый чих телеметрию и диагностику не повесишь. Уж лучше пусть висит там где неисправность. Проще локализовать будет.

Я сделаю таймаут, и выведу сообщение о неисправности на экран, он есть

Изменено пользователем simark1979

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, VladislavS сказал:

А вот тут надо 10 раз подумать. Недавно споткнулся об бесконечный цикл ожидания включения HSE. Ножка контроллера к кварцу была плохо пропаяна. Неисправность найдена в 5 сек. А проскочил бы он, где мне потом глюки ловить без кварца на объекте? На каждый чих телеметрию и диагностику не повесишь. Уж лучше пусть висит там где неисправность. Проще локализовать будет.

А вот это очень зря, ИМХО. Называть сбой тактового генератора "чихом" и не обрабатывать корректно этот случай не комильфо.

Все признаки, события и отказы такого жизненно важного модуля, как тактовый генератор, обрабатывать просто необходимо. При отказе основного рабочего генератора система должна переключиться на резервный и либо продолжить работать в штатном режиме (если позволительно) с рапортом в бортжурнал, либо уйти в безопасное состояние и посылать сигнал бедствия SOS.

Спасибо за полностью отказавший датчик на каком-нибудь судне по причине отвалившегося кварца, скорее всего, никто не скажет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...