|
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:13
|

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

|
Цитата(jcxz @ May 24 2018, 12:04)  .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 Ну в общем на вкус и цвет, как говорится. А таблицу векторов где смещаете, кстати? Тоже где-то в boot-е или в основном приложении в начале?
|
|
|
|
Сообщений в этой теме
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   scifi Цитата(jcxz @ May 24 2018, 11:04) Код ... May 24 2018, 08:36    scifi Цитата(scifi @ May 24 2018, 11:36) Точно... May 28 2018, 12:05     Arlleex Цитата(scifi @ May 28 2018, 15:05) Поправ... May 28 2018, 12:22      scifi Цитата(Arlleex @ May 28 2018, 15:22) ИМХО... May 28 2018, 12:46       Arlleex Цитата(scifi @ May 28 2018, 15:46) Не лиш... May 28 2018, 12:52        scifi Цитата(Arlleex @ May 28 2018, 15:52) Пард... May 28 2018, 13:02 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
|
|
|