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

LPC4337, свой загрузчик. Не получается запустить приложение.

Добрый день, прошу подсказки.
Сделал свой загрузчик, Он принимает прошивку по сети, записывает по смещению 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();
}

 

 

 

Изменено пользователем arm-user

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


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

Для передачи управления нужно:

1) установить SP = значению из 0-го вектора таблицы прерываний;

2) сделать переход по адресу из 1-го вектора таблицы прерываний.

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


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

1 hour ago, arm-user said:

При перезагрузке видит метку, но при попытке запустить приложение уходим на HardFault.

Пройдитесь пошагово в отладчике до момента вызова приложения (BX Rx). Посмотрите, верно ли инициализирован указатель стека. И какой адрес в действительности находится в регистре Rx. Если оба адреса (верхушка стека и начала приложения) указаны верно, переход на приложение 100% должен осуществиться. Заметьте, именно переход: т.е. на адрес функции, находящийся по смещению +4 байта от начала таблицы векторов. Что там дальше будет - зависит уже от кода приложения и состояния микроконтроллера на текущий момент (в загрузчике Вы могли инициализировать какую-то периферию).

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


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

45 minutes ago, haker_fox said:

Пройдитесь пошагово в отладчике до момента вызова приложения (BX Rx). Посмотрите, верно ли инициализирован указатель стека. И какой адрес в действительности находится в регистре Rx. Если оба адреса (верхушка стека и начала приложения) указаны верно, переход на приложение 100% должен осуществиться. Заметьте, именно переход: т.е. на адрес функции, находящийся по смещению +4 байта от начала таблицы векторов. Что там дальше будет - зависит уже от кода приложения и состояния микроконтроллера на текущий момент (в загрузчике Вы могли инициализировать какую-то периферию).

К сожалению, отладочный интерфейс не разведен на плате и я никогда не пользовался отладчиком на NXP.

Код приложения для теста упрощен до минимума - инициалицация GPIO пина на выход и мигание светодиода в вечном цикле.

В качестве самостоятельного приложения этот код работает без проблем. Что-то не так с переходом.

 

Я думал может какая-то очевидная ошибка в функции вызова видна.

 

 

 

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


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

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).

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


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

Тоже отлаживаю загрузчик. Специально Вам скопировал скрин. Это - момент перед переходом на приложение. R0 - содержит адрес, указанный в таблице векторов по смещению 4 байта. MSP инициализирован валидным значением. Нажимаю F11, и...

image.thumb.png.ee637ce7ca9b8833debd4572fc0702c9.png

... оказываюсь уже в приложении)

image.thumb.png.bd354f650444e940547e77bfca56a794.png

 

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


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

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? Или таблица прерываний всё же в загрузчике осталась?

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


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

11 hours ago, haker_fox said:

Припаяйте три проводка: GND, SWCLK, SWDIO. Это отладочный интерфейс SWD.

 

Да, тоже уже пришел к этому. Буду разбираться.

Отладчик для меня новая область, займет время.

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


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

6 минут назад, arm-user сказал:

Отладчик для меня новая область, займет время.

Работать без эмулятора с ARM - это всё равно что водить машину с закрытыми глазами. Можно только в очень хорошо знакомых местах и ооооооооооооооочень медленно. Оно надо (вашему работодателю)?

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


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

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? Или таблица прерываний всё же в загрузчике осталась?

Тут пробовал разные смещения. Но прерывания запрещены в момент перехода и внутри приложения, поэтому на данном этапе не должно играть значения.

Подозреваю, что что-то не так сделал с линкером и код приложения не такой как ожидается.

Похоже, с отладчиком будет проще и быстрее разобраться

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


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

22 minutes ago, arm-user said:
#define APP_BASE 0x8000

Не понял, а как так можно, если адрес банка A (как пример) начинается не с нуля?

image.thumb.png.783c71fe5c2e45ebec4b83c749a80244.png

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


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

Я тоже это не до конца понимаю.
Насколько я вижу, в скрытом указателе лежит смещение 0x1a000000. Вероятно, его ставит ISP по номеру активного банка.

Я пробовал читать область флэш-памяти - по адресам 0x8000 и 0x1a008000 читается одно и тоже.

А смещение APP_BASE пробовал разное

#define APP_BASE 0x1A008000
//#define APP_BASE 0x8000
//#define APP_BASE 0x1A000000
//#define APP_BASE 0x0

image.thumb.png.8e1f2bee6dca54bc0e3a6f51ac27b02e.png

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


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

17 hours ago, arm-user said:

Я тоже это не до конца понимаю.

С LPC43337 работал. Но сейчас ответить затрудняюсь. Делайте отладчик) По-другому никак)

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


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

image.thumb.png.3e3f7b354d4b95e452608e68a3daab55.png

Сделал отладчик. По нему стало видно, что падает при попытке загрузить новое значение в указатель стека.

Регистр R0 показывает на начало области юзеровской программы во флэше.
То, что там лежит вывел несколькими строчками выше, оно сейчас в регистре R3. Вроде значение 0x10007ff8 похоже на правду.

При попытке это выполнить происходит Hard Fault.

Тут я уже ничего не понимаю. Может быть, что изменение стека запрещено по умолчанию и надо сделать какие-то предварительные действия?

 

image.thumb.png.97695489e86ee13295d813ca09d68a5b.png

 

 

Изменено пользователем arm-user

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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