реклама на сайте
подробности

 
 
> LPC4337, свой загрузчик. Инициализация SDRAM, мешает работе приложения
haker_fox
сообщение May 22 2018, 07:05
Сообщение #1


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Добрый день!
Задаю вопрос по просьбе своего коллеги. Они изготовил бутлоадер, который принимает приложение по каналу связи, и записывает его во внутреннюю флеш микроконтроллера. Само приложение 100% работает. Но вот нюанс. И приложение, и бутлоадер инициализируют внешнюю SDRAM, которую каждый использует для себя. И вот на старте инициализации SDRAM приложением проц то-ли улетает куда-то, то-ли зависает. Вопрос: почему такое может происходить. Ведь при повторной инициализации EMC приложением, данных, используемых кем-либо, нет. Это какая-то особенность контроллера памяти?


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Arlleex
сообщение May 24 2018, 04:58
Сообщение #2


Местный
***

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



Цитата(jcxz @ May 24 2018, 02:20) *
Какой из указателей? rolleyes.gif Про переключение режима CPU конечно забыли?
И про сброс периферии тоже. laughing.gif

А при чем тут указатели стека и режим 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
Go to the top of the page
 
+Quote Post
scifi
сообщение May 24 2018, 07:01
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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);
}
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 24 2018, 08:04
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Arlleex
сообщение May 24 2018, 08:13
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 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-е или в основном приложении в начале?
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 24 2018, 10:55
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Arlleex @ May 24 2018, 11:13) *
Ну в общем на вкус и цвет, как говорится. А таблицу векторов где смещаете, кстати? Тоже где-то в boot-е или в основном приложении в начале?

само запускаемое приложение программирует всю периферию как ему надо. Бутлоадер только обеспечивает чтобы после него регистры периферии были в изначальном состоянии.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 04:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01467 секунд с 7
ELECTRONIX ©2004-2016