|
LPC4337, свой загрузчик. Инициализация SDRAM, мешает работе приложения |
|
|
|
 |
Ответов
|
May 24 2018, 04:58
|

Местный
  
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264

|
Цитата(jcxz @ May 24 2018, 02:20)  Какой из указателей?  Про переключение режима CPU конечно забыли? И про сброс периферии тоже.  А при чем тут указатели стека и режим CPU? Загрузчик обязан обеспечить обновление ПО и (если необходимо) переход на приложение. Приложение не должно знать о существовании загрузчика, поэтому компилируется ровно так же, как и без загрузчика (только поправить ld-скрипт и вначале приложения сместить таблицу векторов. Ну или перед переходом на приложение в загрузчике ее сместить). При старте МК с загрузчиком: 1. Проверяется тип сброса - если программный, то (в моем случае) это только означает, что был запрос обновления ПО из приложения, если нет - JumpToApplicatioin(). 2. Инициализируется периферия, необходимая для приема прошивки. 3. Принимается прошивка, сравниваются соответствующие контрольные суммы и т.д. 4. Деинициализируется периферия в случае успешного обновления ПО. 5. JumpToApplication(). Код void HW_JumpToApplication(void) { unsigned int pFunction = *((volatile unsigned int *)(APPLICATION_BASE_ADDRESS + 4)); void (*UserApplication)(void) = (void (*)())pFunction; __set_MSP(*(volatile unsigned int *)APPLICATION_BASE_ADDRESS); UserApplication(); return; } О каком переключении CPU идет речь? И о каком стеке? После сброса CPU всегда использует основной стек и находится в режиме потока с привелегированным доступом, поэтому загрузчик инициализирует именно MSP. Внутри целевого прилоежния первым делом сдвигается таблица векторов прерываний (если это не сделал загрузчик) и поехали. Или Вы о чем?
Сообщение отредактировал Arlleex - May 24 2018, 05:08
|
|
|
|
|
May 24 2018, 07:01
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Arlleex @ May 24 2018, 07:58)  Код void HW_JumpToApplication(void) { unsigned int pFunction = *((volatile unsigned int *)(APPLICATION_BASE_ADDRESS + 4)); void (*UserApplication)(void) = (void (*)())pFunction; __set_MSP(*(volatile unsigned int *)APPLICATION_BASE_ADDRESS); UserApplication(); return; } Мне больше нравится вот так: Код void jump_to_app(void) { static const uint16_t code[] = { 0x1d01, // adds r1, r0, #4 0x6800, // ldr r0, [r0, #0] 0x4685, // mov sp, r0 0x6809, // ldr r1, [r1, #0] 0x4708 // bx r1 }; ((void (*)(int))code)(APP_BASE); }
|
|
|
|
|
May 24 2018, 08:04
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(scifi @ May 24 2018, 10:01)  Мне больше нравится вот так: .h: Код #define PFLASH_BEGIN_C 0x08000000 //адрес начала внутренней флешь МК (кэшированная область) #define FW_WORK_BEGIN 0x00020000 //смещение рабочего ПО (FIRMWARE_TARGET_WORK) относительно начала флешь extern "C" void StartWorkFw(); .cpp (в бутлоадере): Код //деинит/reset использованной в буте периферии и старт рабочего ПО IntCpuDis(); FaultCpuDis(); IntDisAll(); //отключение тактирования периферии SCU.CCU.CGAT[0].SET = B0 | B1 | B2 | B3 | B4 | B7 | B8 | B9 | B10 | B11 | B16; SCU.CCU.CGAT[1].SET = B0 | B3 | B4 | B5 | B6 | B7 | B8; SCU.CCU.CGAT[2].SET = B1 | B2 | B4 | B5 | B6 | B7 | B10; SCU.CCU.CGAT[3].SET = B2; MPUoff(); StartWorkFw(); .asm: Код SECTION .text:CODE:NOROOT(2) THUMB PUBLIC StartWorkFw StartWorkFw: LDR R0, =PFLASH_BEGIN_C + FW_WORK_BEGIN LDRD R1, R2, [R0] MOV SP, R1 BX R2 LTORG
|
|
|
|
|
May 24 2018, 08:36
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(jcxz @ May 24 2018, 11:04)  Код SECTION .text:CODE:NOROOT(2) THUMB PUBLIC StartWorkFw StartWorkFw: LDR R0, =PFLASH_BEGIN_C + FW_WORK_BEGIN LDRD R1, R2, [R0] MOV SP, R1 BX R2 LTORG Точно! Код void jump_to_app(void) { static const uint16_t code[] = { 0xc806, // ldmia r0!, {r1, r2} 0x468d, // mov sp, r1 0x4710 // bx r2 }; ((void (*)(int))code)(APP_BASE); } Этот код будет работать и на Cortex-M0, в отличие от.
|
|
|
|
|
May 28 2018, 12:22
|

Местный
  
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264

|
Цитата(scifi @ May 28 2018, 15:05)  Поправлю сам себя. Последний штрих: Код void jump_to_app(void) { static const uint16_t code[] = { 0xc806, // ldmia r0!, {r1, r2} 0x468d, // mov sp, r1 0x4710 // bx r2 }; ((void (*)(int))(1 + (int)code))(APP_BASE); } ИМХО, лишнее. Компилятор вроде сам это контролирует (я про режим Thumb). На ассемблере да, надо следить. P.S. Может, ошибаюсь.
|
|
|
|
|
May 28 2018, 12:52
|

Местный
  
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264

|
Цитата(scifi @ May 28 2018, 15:46)  Не лишнее. При тестировании вскрылось. Пардон. Я вычитывал слово по нужному адресу, а там было слово из таблицы векторов прерываний (вектор сброса) - а там уже в младшем бите установлена единица. Интересно, а считается ли Ваш способ наглядным примером самомодифицирующегося кода?
Сообщение отредактировал Arlleex - May 28 2018, 12:54
|
|
|
|
Сообщений в этой теме
haker_fox LPC4337, свой загрузчик. Инициализация SDRAM May 22 2018, 07:05 scifi Переход из загрузчика в приложение надо делать так... May 22 2018, 08:01 jcxz Цитата(scifi @ May 22 2018, 11:01) Перехо... May 22 2018, 08:30  scifi Цитата(jcxz @ May 22 2018, 11:30) Не совс... May 22 2018, 08:45   haker_fox QUOTE (scifi @ May 22 2018, 16:45) В конц... May 22 2018, 10:28 Kabdim У меня логика бута нацелена на исключение возможны... May 22 2018, 08:03 haker_fox Спасибо, господа!!! Передам эти рекоме... May 22 2018, 08:17 haker_fox При сбросе EMC модуля через RGU возникает hardfaul... May 23 2018, 01:46 jcxz Цитата(haker_fox @ May 23 2018, 04:46) Пр... May 23 2018, 18:30 Arlleex Хм. А я не использую никаких зарезервированных мет... May 23 2018, 05:01 VladislavS Мне кажется, правильнее всего "добить" к... May 23 2018, 06:04 Arlleex ЦитатаЧто мешает делать после приёма прошивки рест... May 23 2018, 20:00 jcxz Цитата(Arlleex @ May 23 2018, 23:00) Ниче... May 23 2018, 22:20 jcxz Цитата(Arlleex @ May 24 2018, 07:58) 1. П... May 24 2018, 06:09   Arlleex Цитата(jcxz @ May 24 2018, 12:04) .asm:
К... May 24 2018, 08:13    jcxz Цитата(Arlleex @ May 24 2018, 11:13) Ну в... May 24 2018, 10:55 Arlleex ЦитатаЕсли после приёма прошивки (и записи её во ф... May 24 2018, 06:39 Arlleex ЦитатаМне больше нравится вот так:
А какие плюшки ... May 24 2018, 07:20 scifi Цитата(Arlleex @ May 24 2018, 10:20) А ка... May 24 2018, 07:29 Arlleex Да нет, не запутался.
Говорю же что ошибся насчёт ... May 28 2018, 14:42
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|