simark1979 0 8 апреля, 2019 Опубликовано 8 апреля, 2019 (изменено) · Жалоба Добрый день, Ситуация следующая. Есть бутлоадер, из которого стартует основное приложение. Если я загружаю и запускаю основное приложение по адресу 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, далее основная программа запускается всегда КОРРЕКТНО. Что может быть, или как отловить? Всю дополнительную информацию готов предоставить. Просьба кидать все идеи Изменено 14 ноября, 2022 пользователем haker_fox Добавил теги к популярной теме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 8 апреля, 2019 Опубликовано 8 апреля, 2019 · Жалоба Посмотрите отладчиком, что делает загрузчик перед jumpToApplication. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 9 апреля, 2019 Опубликовано 9 апреля, 2019 · Жалоба А почему нет отладки? Загрузчик модифицируете так, чтобы не ставилась защита. Заливаете загрузчик из под отладчика. Далее заливаете программу штатно через загрузчик. Попадается в Jump_To_Application (). Переключаетесь на отладочные символы программы и вперед! Как сделать последнее в IAR - не знаю :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 9 апреля, 2019 Опубликовано 9 апреля, 2019 · Жалоба Что делает загрузчик до старта приложения? Не оставляет ли он после себя разрешенные прерывания, периферию, ПДП (DMA)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
simark1979 0 9 апреля, 2019 Опубликовано 9 апреля, 2019 · Жалоба 5 hours ago, x893 said: Посмотрите отладчиком, что делает загрузчик перед jumpToApplication. 2 minutes ago, Johnny81 said: А почему нет отладки? Загрузчик модифицируете так, чтобы не ставилась защита. О какой защите идёт речь? Заливаете загрузчик из под отладчика. Далее заливаете программу штатно через загрузчик. Попадается в Jump_To_Application (). Переключаетесь на отладочные символы программы и вперед! Как сделать последнее в IAR - не знаю :) Вчера попадался материал от IAR, как для отладки подгружать символы основной программы в загрузчик...буду сегодня пробовать Вчера многократно проверял, старт бутлоадера из-под дебагера - нет никаких проблем. Старт основной программы из-под дебагера - тоже никаких проблем (ведь так я писал основное приложение) Но как только загрузчик стартует самостоятельно, приложение начинает себя вести (ПОЧТИ ВСЕГДА (НО НЕ ВСЕГДА) нештатно. Причём как говорил ранее, в 1 случае из 5-7 включений, запуск происходит корректно. Питание снял/подал - опять не работает, в следующий раз может заработать. и т.д. В этой связи, сейчас нужно понять, почему может быть такой плавающий эффект. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
simark1979 0 9 апреля, 2019 Опубликовано 9 апреля, 2019 · Жалоба 4 minutes ago, Сергей Борщ said: Что делает загрузчик до старта приложения? Не оставляет ли он после себя разрешенные прерывания, периферию, ПДП (DMA)? Запрет прерываний установлен, пробовал убрать никакой разницы нет __disable_irq (); //Пробовал комментировать, без толку Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
simark1979 0 9 апреля, 2019 Опубликовано 9 апреля, 2019 · Жалоба Чтобы снять вопросы по коду бутлоадера, выкладываю https://pastebin.com/kWnqiTNX Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 9 апреля, 2019 Опубликовано 9 апреля, 2019 · Жалоба 15 минут назад, simark1979 сказал: Запрет прерываний установлен, пробовал убрать никакой разницы нет __disable_irq (); //Пробовал комментировать, без толку Толку от глобального запрета, если загрузчик оставляет включенным, скажем, таймер с разрешенным прерыванием, для которого в приложении нет обработчика прерывания? Вы разрешите прерывания в своем приложении и этот обработчик "выстрелит". Также чудеса можно получить, если загрузчик оставляет настроенным ПДП (DMA), который пишет в область ОЗУ, используемую приложением. Вообще ИАР издавна позволял подключиться отладчиком "на лету". Очень помогает в подобных случаях. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
simark1979 0 9 апреля, 2019 Опубликовано 9 апреля, 2019 (изменено) · Жалоба 35 minutes ago, Сергей Борщ said: Толку от глобального запрета, если загрузчик оставляет включенным, скажем, таймер с разрешенным прерыванием, для которого в приложении нет обработчика прерывания? Вы разрешите прерывания в своем приложении и этот обработчик "выстрелит". Также чудеса можно получить, если загрузчик оставляет настроенным ПДП (DMA), который пишет в область ОЗУ, используемую приложением. Вообще ИАР издавна позволял подключиться отладчиком "на лету". Очень помогает в подобных случаях. Отличная идея про "дебаг на лету", об этом совершенно забыл, Спасибо) Сейчас буду дебажить Изменено 9 апреля, 2019 пользователем simark1979 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
simark1979 0 9 апреля, 2019 Опубликовано 9 апреля, 2019 (изменено) · Жалоба Проблему локализовал. Загрузчик оказался совершенно не причём. Оказалось, что при подаче питания внешний АЦП не всегда выставляет бит готовности данных (с чем я сейчас и буду разбираться), а поток обслуживающий чтение из АЦП его ждал в бесконечном цикле, в виду чего никто не клал данные в очередь и т.д. и.т.п. Смысла рассказывать дальше наверное нет смысла. Всем огромное спасибо за участие! Изменено 9 апреля, 2019 пользователем simark1979 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksandr Baranov 1 9 апреля, 2019 Опубликовано 9 апреля, 2019 · Жалоба 3 hours ago, simark1979 said: а поток обслуживающий чтение из АЦП его ждал в бесконечном цикле, Может, заодно и концепцию бесконечных циклов пересмотрите? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
simark1979 0 9 апреля, 2019 Опубликовано 9 апреля, 2019 · Жалоба 4 minutes ago, Aleksandr Baranov said: Может, заодно и концепцию бесконечных циклов пересмотрите? Добавил задержку перед началом работы с АЦП, работает без сбоев. Но бесконечный цикл конечно буду убирать, это не дело висеть в ожидании, ведь АЦП может выйти из строя.... Спасибо, что беспокоитесь! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 9 апреля, 2019 Опубликовано 9 апреля, 2019 · Жалоба 44 минуты назад, Aleksandr Baranov сказал: Может, заодно и концепцию бесконечных циклов пересмотрите? А вот тут надо 10 раз подумать. Недавно споткнулся об бесконечный цикл ожидания включения HSE. Ножка контроллера к кварцу была плохо пропаяна. Неисправность найдена в 5 сек. А проскочил бы он, где мне потом глюки ловить без кварца на объекте? На каждый чих телеметрию и диагностику не повесишь. Уж лучше пусть висит там где неисправность. Проще локализовать будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
simark1979 0 9 апреля, 2019 Опубликовано 9 апреля, 2019 (изменено) · Жалоба 1 hour ago, VladislavS said: А вот тут надо 10 раз подумать. Недавно споткнулся об бесконечный цикл ожидания включения HSE. Ножка контроллера к кварцу была плохо пропаяна. Неисправность найдена в 5 сек. А проскочил бы он, где мне потом глюки ловить без кварца на объекте? На каждый чих телеметрию и диагностику не повесишь. Уж лучше пусть висит там где неисправность. Проще локализовать будет. Я сделаю таймаут, и выведу сообщение о неисправности на экран, он есть Изменено 9 апреля, 2019 пользователем simark1979 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 9 апреля, 2019 Опубликовано 9 апреля, 2019 · Жалоба 2 часа назад, VladislavS сказал: А вот тут надо 10 раз подумать. Недавно споткнулся об бесконечный цикл ожидания включения HSE. Ножка контроллера к кварцу была плохо пропаяна. Неисправность найдена в 5 сек. А проскочил бы он, где мне потом глюки ловить без кварца на объекте? На каждый чих телеметрию и диагностику не повесишь. Уж лучше пусть висит там где неисправность. Проще локализовать будет. А вот это очень зря, ИМХО. Называть сбой тактового генератора "чихом" и не обрабатывать корректно этот случай не комильфо. Все признаки, события и отказы такого жизненно важного модуля, как тактовый генератор, обрабатывать просто необходимо. При отказе основного рабочего генератора система должна переключиться на резервный и либо продолжить работать в штатном режиме (если позволительно) с рапортом в бортжурнал, либо уйти в безопасное состояние и посылать сигнал бедствия SOS. Спасибо за полностью отказавший датчик на каком-нибудь судне по причине отвалившегося кварца, скорее всего, никто не скажет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться