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

arm-user

Участник
  • Постов

    11
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Контакты

  • Сайт
    Array
  • ICQ
    Array
  1. Окно дизассемблера не показывало текущую информацию. Разобрался, нашел галку прилинковать текущий debug контекст. SP не забыл, говорил, что для него заработала штатная функция __set_MSP(user_stack); С новым вариантом ассемблерной вставки стало существенно хуже, адрес перехода лежит в регистре R0, а операции производятся с другими регистрами наверное, это компилятору, чтобы не решил "оптимизировать" пустую функцию?
  2. Поправил код приложения, адреса встали на место, но проблема осталась. Попробовал код перехода, предложеннный выше (на скриншоте 1). Все равно на переходе уходит на ошибку. Чтобы понять на каком шаге происходит ошибка, разбил asm вставку на 2 - по одной строке в каждой. И в таком виде оно заработало. Есть ли объяснение почему? И второй вопрос - адрес перехода (R1) вычитывается 0x1A00C095 (в бинарнике, соответственно, также). Но дизассемблер говорит, что адрес Reset_Handler на единицу меньше 0x1A00C094. Почему так происходит и не надо ли подправить что-нибудь в процедуре перехода на эту тему? Подскажите, пожалуйста.
  3. Спасибо за отклики, попробую ответить. - scmRTOS была в этом коде. Для загрузчика отскреб ее насколько мог. Для выдачи в UART используются очереди сообщений от RTOS. Чтобы не тратить время на переделку их оставил и оставлены инклюды от scmRTOS. Но процессы и запуск самой RTOS отсутствуют. Все сейчас крутится в поллинге. А также есть прерывания от Ethernet и таймера. Но в момент перехода мы находимся в основном цикле и прерывания отключаются перед переходом. Есть ли тут какие-то еще подводные камни, которые я не знаю? - В ассемблерных процедурах перехода ничего не понимаю. Взял код, найденный на этом форуме в соседней ветке. Код на С также не заработал. Попробую предложенный выше. - Переход на приложение и планировлся через NVIC_Reset, но я не знаю, получится ли его отлаживать в таком режиме. Подхватит ли отладчик точки останова после ресета. Я почему-то решил, что нет, и убрал пока Ресет для теста. - Стек удалось изменить встроенной функцией __set_MSP(user_stack); Переход, похоже, тоже работает и сейчас проблема в том, что код приложения лежит где задумано, но сам "не знает" что он начинается с 0x1a008000. Буду с этим разбираться.
  4. Сделал отладчик. По нему стало видно, что падает при попытке загрузить новое значение в указатель стека. Регистр R0 показывает на начало области юзеровской программы во флэше. То, что там лежит вывел несколькими строчками выше, оно сейчас в регистре R3. Вроде значение 0x10007ff8 похоже на правду. При попытке это выполнить происходит Hard Fault. Тут я уже ничего не понимаю. Может быть, что изменение стека запрещено по умолчанию и надо сделать какие-то предварительные действия?
  5. Я тоже это не до конца понимаю. Насколько я вижу, в скрытом указателе лежит смещение 0x1a000000. Вероятно, его ставит ISP по номеру активного банка. Я пробовал читать область флэш-памяти - по адресам 0x8000 и 0x1a008000 читается одно и тоже. А смещение APP_BASE пробовал разное #define APP_BASE 0x1A008000 //#define APP_BASE 0x8000 //#define APP_BASE 0x1A000000 //#define APP_BASE 0x0
  6. #define APP_BASE 0x8000 Тут пробовал разные смещения. Но прерывания запрещены в момент перехода и внутри приложения, поэтому на данном этапе не должно играть значения. Подозреваю, что что-то не так сделал с линкером и код приложения не такой как ожидается. Похоже, с отладчиком будет проще и быстрее разобраться
  7. Да, тоже уже пришел к этому. Буду разбираться. Отладчик для меня новая область, займет время.
  8. К сожалению, отладочный интерфейс не разведен на плате и я никогда не пользовался отладчиком на NXP. Код приложения для теста упрощен до минимума - инициалицация GPIO пина на выход и мигание светодиода в вечном цикле. В качестве самостоятельного приложения этот код работает без проблем. Что-то не так с переходом. Я думал может какая-то очевидная ошибка в функции вызова видна.
  9. Добрый день, прошу подсказки. Сделал свой загрузчик, Он принимает прошивку по сети, записывает по смещению 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. Спасибо, подбодрили. Будем пробовать.
  11. Добрый день. Пользуюсь SCM под LPC17xx продолжительное время, но сама операционка для меня как черный ящик. Подскажите, насколько реально сделать порт под LPC43xx ? Степень сложности ?
×
×
  • Создать...