arm-user 0 10 апреля, 2023 Опубликовано 10 апреля, 2023 (изменено) · Жалоба Добрый день, прошу подсказки. Сделал свой загрузчик, Он принимает прошивку по сети, записывает по смещению 0х8000, выставляет метку и делает перезагрузку. При перезагрузке видит метку, но при попытке запустить приложение уходим на HardFault. В линкере для приложения указано смещение 0х8000. Функции вызова пробовал разные, например static void execute_user_code2(void) { // stack pointer is at offset 0 from vector table const uint32_t user_stack = *((volatile uint32_t*)APP_BASE); // reset function is at offset 4 from vector table const UserProgram user_program = *((volatile UserProgram*)(APP_BASE+0x4)); //4+1 // Use the vector table from the user program uint32_t flash_offset = 0; SCB->VTOR = flash_offset; // set stack pointer to program stack __set_MSP(user_stack); // boot user program user_program(); } Изменено 10 апреля, 2023 пользователем arm-user Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба Для передачи управления нужно: 1) установить SP = значению из 0-го вектора таблицы прерываний; 2) сделать переход по адресу из 1-го вектора таблицы прерываний. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 1 hour ago, arm-user said: При перезагрузке видит метку, но при попытке запустить приложение уходим на HardFault. Пройдитесь пошагово в отладчике до момента вызова приложения (BX Rx). Посмотрите, верно ли инициализирован указатель стека. И какой адрес в действительности находится в регистре Rx. Если оба адреса (верхушка стека и начала приложения) указаны верно, переход на приложение 100% должен осуществиться. Заметьте, именно переход: т.е. на адрес функции, находящийся по смещению +4 байта от начала таблицы векторов. Что там дальше будет - зависит уже от кода приложения и состояния микроконтроллера на текущий момент (в загрузчике Вы могли инициализировать какую-то периферию). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arm-user 0 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 45 minutes ago, haker_fox said: Пройдитесь пошагово в отладчике до момента вызова приложения (BX Rx). Посмотрите, верно ли инициализирован указатель стека. И какой адрес в действительности находится в регистре Rx. Если оба адреса (верхушка стека и начала приложения) указаны верно, переход на приложение 100% должен осуществиться. Заметьте, именно переход: т.е. на адрес функции, находящийся по смещению +4 байта от начала таблицы векторов. Что там дальше будет - зависит уже от кода приложения и состояния микроконтроллера на текущий момент (в загрузчике Вы могли инициализировать какую-то периферию). К сожалению, отладочный интерфейс не разведен на плате и я никогда не пользовался отладчиком на NXP. Код приложения для теста упрощен до минимума - инициалицация GPIO пина на выход и мигание светодиода в вечном цикле. В качестве самостоятельного приложения этот код работает без проблем. Что-то не так с переходом. Я думал может какая-то очевидная ошибка в функции вызова видна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 12 minutes ago, arm-user said: К сожалению, отладочный интерфейс не разведен на плате и я никогда не пользовался отладчиком на NXP. Припаяйте три проводка: GND, SWCLK, SWDIO. Это отладочный интерфейс SWD. 13 minutes ago, arm-user said: Что-то не так с переходом. Вот это я и предлагаю Вам выяснить с помощью отладочного интерфейса. Прикошачить три проводка не так сложно, даже к корпусу с 208 выводами при наличии обычного бинокуляра (крайний случай, лучше под микроскопом). 3 hours ago, arm-user said: const UserProgram user_program = *((volatile UserProgram*)(APP_BASE+0x4)); //4+1 Какого типа APP_BASE? Если это указатель на 32 бита (uint32_t *), то прибавляя к нему 4, Вы получите смещение в 16 байт, а не в 4, как ожидалось. 18 minutes ago, arm-user said: Код приложения для теста упрощен до минимума Это не играет роли. Если переход содержит ошибки, то неважно, простое приложение это из одной команды безусловного перехода или сложнейший алгоритм - результат будет один (тот же HardFault). 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба Тоже отлаживаю загрузчик. Специально Вам скопировал скрин. Это - момент перед переходом на приложение. R0 - содержит адрес, указанный в таблице векторов по смещению 4 байта. MSP инициализирован валидным значением. Нажимаю F11, и... ... оказываюсь уже в приложении) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба Исправлено: Фигню сморозил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 11 hours ago, arm-user said: // Use the vector table from the user program uint32_t flash_offset = 0; SCB->VTOR = flash_offset; Так у вас User program вроде на 0x8000? Или таблица прерываний всё же в загрузчике осталась? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arm-user 0 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 11 hours ago, haker_fox said: Припаяйте три проводка: GND, SWCLK, SWDIO. Это отладочный интерфейс SWD. Да, тоже уже пришел к этому. Буду разбираться. Отладчик для меня новая область, займет время. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 6 минут назад, arm-user сказал: Отладчик для меня новая область, займет время. Работать без эмулятора с ARM - это всё равно что водить машину с закрытыми глазами. Можно только в очень хорошо знакомых местах и ооооооооооооооочень медленно. Оно надо (вашему работодателю)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arm-user 0 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 11 hours ago, haker_fox said: Какого типа APP_BASE? Если это указатель на 32 бита (uint32_t *), то прибавляя к нему 4, Вы получите смещение в 16 байт, а не в 4, как ожидалось. #define APP_BASE 0x8000 3 hours ago, xvr said: Так у вас User program вроде на 0x8000? Или таблица прерываний всё же в загрузчике осталась? Тут пробовал разные смещения. Но прерывания запрещены в момент перехода и внутри приложения, поэтому на данном этапе не должно играть значения. Подозреваю, что что-то не так сделал с линкером и код приложения не такой как ожидается. Похоже, с отладчиком будет проще и быстрее разобраться Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба 22 minutes ago, arm-user said: #define APP_BASE 0x8000 Не понял, а как так можно, если адрес банка A (как пример) начинается не с нуля? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arm-user 0 11 апреля, 2023 Опубликовано 11 апреля, 2023 · Жалоба Я тоже это не до конца понимаю. Насколько я вижу, в скрытом указателе лежит смещение 0x1a000000. Вероятно, его ставит ISP по номеру активного банка. Я пробовал читать область флэш-памяти - по адресам 0x8000 и 0x1a008000 читается одно и тоже. А смещение APP_BASE пробовал разное #define APP_BASE 0x1A008000 //#define APP_BASE 0x8000 //#define APP_BASE 0x1A000000 //#define APP_BASE 0x0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 12 апреля, 2023 Опубликовано 12 апреля, 2023 · Жалоба 17 hours ago, arm-user said: Я тоже это не до конца понимаю. С LPC43337 работал. Но сейчас ответить затрудняюсь. Делайте отладчик) По-другому никак) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arm-user 0 18 апреля, 2023 Опубликовано 18 апреля, 2023 (изменено) · Жалоба Сделал отладчик. По нему стало видно, что падает при попытке загрузить новое значение в указатель стека. Регистр R0 показывает на начало области юзеровской программы во флэше. То, что там лежит вывел несколькими строчками выше, оно сейчас в регистре R3. Вроде значение 0x10007ff8 похоже на правду. При попытке это выполнить происходит Hard Fault. Тут я уже ничего не понимаю. Может быть, что изменение стека запрещено по умолчанию и надо сделать какие-то предварительные действия? Изменено 18 апреля, 2023 пользователем arm-user Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться