|
LPC11xx не стартует код из своего бутлоадера |
|
|
|
Oct 21 2010, 10:42
|

Частый гость
 
Группа: Свой
Сообщений: 173
Регистрация: 30-11-05
Из: San Francisco
Пользователь №: 11 593

|
Использую LPC1114. По доке вроде все понятно. Свой бутлоадер код во флеш прописал. для старта делаю следующее: 1. копирую 48 векторов прерывания основной программы в ОЗУ с адреса 0x10000000 2. Делаю ремап LPC_SYSCON->SYSMEMREMAP = 0x01; т.е. отобрашаем вектора из ОЗУ в начало адресного простанства 3. инициализирую SP и PC данными из первых 8-ми байт моей проги. Все это выглядит так: Код __asm void boot_jump( uint32_t address ) { LDR R1, [R0] ;Load new stack pointer address MOV R13, R1 LDR R1, [R0, #4];Load new program counter address BX R1 }
void run(unsigned long address) { unsigned long *dst, size; const unsigned long *src; // Copy vectors table src = (unsigned long *)address; dst = (unsigned long *)0x10000000; size = VECTORS_TABLE_SIZE >> 2; do { *dst++ = *src++; } while (--size);
LPC_SYSCON->SYSMEMREMAP = 0x01; /* remap to SRAM */
boot_jump(address); } В результате поведение непредсказуемое. то висит, то попадает куда-то в середину бутлоадера. Если убрать ремап, то целевая прога запускается, но естественно с векторами из флеша. Что я забываю в этой схеме?
|
|
|
|
|
 |
Ответов
|
Oct 21 2010, 12:58
|

Гуру
     
Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515

|
Reset - это место откуда программа стартует. Как бы по сигналу сброса. Как бы независимо. Но в реальности по сигналу сброса проц идет на собственный загрузчик и передает управление программе после ремапа. И тут якобы она стартует с 0. Делает вид,что после сброса как бы. Разумеется, можно написать даже процедуру, которая будет располагаться с 0. Токо следущими идут вектора прерываний. И если прерывания не используются - да ради бога. Можно. Против кортекса не попрешь. Извиняюсь. Но логика все равно остается. Не забывать прерывания убить. Ну и правильно джамп сделать. С переключением в режим супервизора. Я делаю Код void JMP(unsigned int addr) { //asm ("mov r0, addr \n"); asm ("SWI 0 \n"); } Вот так примерно. В том плане, что я стартую с нуля всегда после ремапа. Ибо так универсальнее, разумеется. (У меня все остальное - типа переключателя задач работает в супервизоре - выбрал за красивое название) НУ, еще контроллр внешней памяти не забыть настроить... У меня-то вектора в локальной памяти...
Сообщение отредактировал DpInRock - Oct 21 2010, 13:05
--------------------
On the road again (Canned Heat)
|
|
|
|
|
Oct 21 2010, 13:01
|

Частый гость
 
Группа: Свой
Сообщений: 173
Регистрация: 30-11-05
Из: San Francisco
Пользователь №: 11 593

|
Цитата(DpInRock @ Oct 21 2010, 15:54)  Reset - это место откуда программа стартует. Как бы по сигналу сброса. Как бы независимо. Но в реальности по сигналу сброса проц идет на собственный загрузчик и передает управление программе после ремапа. И тут якобы она стартует с 0. Делает вид,что после сброса как бы. Да, это понятно. Мой бут делает в общем тоже самое, что и встроенный, только ремапит вектора не из флеша, а из ОЗУ. Вроде нашел косяк. Забыл прерывания отключить до ремапа! Тогда еще вопрос. А барьеры синхронизации или памяти нужно после ремапа ставить или нет?
|
|
|
|
|
Oct 21 2010, 13:41
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 21-09-10
Пользователь №: 59 626

|
Цитата(zuy @ Oct 21 2010, 17:01)  Да, это понятно. Мой бут делает в общем тоже самое, что и встроенный, только ремапит вектора не из флеша, а из ОЗУ.
Вроде нашел косяк. Забыл прерывания отключить до ремапа!
Тогда еще вопрос. А барьеры синхронизации или памяти нужно после ремапа ставить или нет? Пожалуйста, опубликуйте работающий вариант процедуры ремапа. В usermanual lpc1114 написано на стр. 317: Vector table — If the program changes an entry in the vector table, and then enables the corresponding exception, use a DMB instruction between the operations. This ensures that if the exception is taken immediately after being enabled the processor uses the new exception vector. Судя по всему - надо.
|
|
|
|
|
Oct 21 2010, 17:28
|

Частый гость
 
Группа: Свой
Сообщений: 173
Регистрация: 30-11-05
Из: San Francisco
Пользователь №: 11 593

|
Цитата(Alekseeey @ Oct 21 2010, 16:41)  Пожалуйста, опубликуйте работающий вариант процедуры ремапа. Да вот что-то еще не прокатило, разбираюсь. Как будет рабочий вариант, отпишу
|
|
|
|
|
Oct 21 2010, 19:14
|

Частый гость
 
Группа: Свой
Сообщений: 173
Регистрация: 30-11-05
Из: San Francisco
Пользователь №: 11 593

|
Нет, все равно решительно не понимаю, что делает ремап в LPC1114. Вот простой код, который просто включает светодиод, и через некоторое время выключает: Код int main(void ) { unsigned long *dst, size, i; const unsigned long *src;
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16) | (1<<6); // Enable IOCON GPIO LPC_GPIO1->DIR |= ( 1 << 8 ); // LED pin direction out LPC_GPIO1->DATA &= ~( 1 << 8 ); // LED ON
// Copy vectors table from 0x0 to RAM src = (unsigned long *)0; dst = (unsigned long *)0x10000000; size = 0xC0 >> 2; do { *dst++ = *src++; } while (--size);
// Pause, just to mention the LED state. i= 10000000; while( --i );
__disable_irq(); LPC_SYSCON->SYSMEMREMAP = 0x01; // remap to SRAM __ISB();
LPC_GPIO1->DATA |= ( 1 << 8 ); // LED OFF
while( 1 ); } Чтобы ремап не мешал работать, я копирую таблицу векторов из флеш в RAM. Если строка с ремапом присутствует то код не работает, если ее комментирую то все нормально. Но я же скопировал таблицу в RAM. Т.е. после ремапа для процессора вообще ничего не поменялось в начале адресного пространства! Кто-нибудь может объяснить что тут происходит?
|
|
|
|
|
Oct 21 2010, 20:30
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 21-09-10
Пользователь №: 59 626

|
Цитата(zuy @ Oct 21 2010, 23:14)  Нет, все равно решительно не понимаю, что делает ремап в LPC1114.
Кто-нибудь может объяснить что тут происходит? Обьяснить, к сожалению не могу, но могу от себя добавить, что когда я выполняю программу в отладчике по шагам, по ассемблерным коммандам, то при включенном ремапе происходит HardFault на инструкциях ветвления. Причем, в тестовой программе blinky это исключение возникает при попытке перехода на main();, но не происходит при переходе на SystemInit(); В памяти SystemInit расположена вверх по адресам от точки вызова, а main - вниз, не знаю, важно это или нет... Вот только что увеличил размер зарез. области до 0x1000 и скопировал туда 0x1000 байт флеш. Программа blinky дошла до main и попыталась начать работать. Прогресс. Да, проект blinky заработал. При включенном ремапе. После копирования в ОЗУ 0x1000 байт флеша. У меня нехорошие предчувствия по поводу ремапа... Интересная опечатка (?) есть в старых версиях user manual на lpc1114: на картинке карты памяти размер области векторов указан 0x0200 байт. И если я копирую 0x0200 байт, то программа работает...
|
|
|
|
|
Oct 21 2010, 20:43
|

Частый гость
 
Группа: Свой
Сообщений: 173
Регистрация: 30-11-05
Из: San Francisco
Пользователь №: 11 593

|
Цитата(Alekseeey @ Oct 21 2010, 23:09)  Обьяснить, к сожалению не могу, но могу от себя добавить, что когда я выполняю программу в отладчике по шагам, по ассемблерным коммандам, то при включенном ремапе происходит HardFault на инструкциях ветвления. Отладчик Keil ? Он для LPC1114 не совсем корректно работает. Тот пример что я привел в случае если ремап убрать, то вылетает в отладчике в HardFault, но работает отлично в железе. Цитата(Alekseeey @ Oct 21 2010, 23:30)  Интересная опечатка (?) есть в старых версиях user manual на lpc1114: на картинке карты памяти размер области векторов указан 0x0200 байт. И если я копирую 0x0200 байт, то программа работает... Рано я обрадовался. в 0х200 байт у меня вся тестовая прога. Получается я ее скопировал всю в ОЗУ. В реальном бутлоадере это не помогло :-(
|
|
|
|
|
Oct 22 2010, 07:00
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 21-09-10
Пользователь №: 59 626

|
Цитата(zuy @ Oct 22 2010, 00:43)  Отладчик Keil ? Он для LPC1114 не совсем корректно работает. Тот пример что я привел в случае если ремап убрать, то вылетает в отладчике в HardFault, но работает отлично в железе.
Рано я обрадовался. в 0х200 байт у меня вся тестовая прога. Получается я ее скопировал всю в ОЗУ. В реальном бутлоадере это не помогло :-( Отладчик у меня LPCXpresso. Плата + ide. Вообще, я думаю, именно в данном случае отладчик мешает. Сложно описать ощущения, когда для отладки, после команды ремапа ставишь подряд десять нопов, и, выполняя программу по ассемблерным шагам, наблюдаешь случайные изменения регистров и вылет в ХардФолт именно, блин, на седьмом нопе. Пока я для себя решил делать так: первые 512 (0x200) байт загрузчика заняты его векторами и просто нулями. Т. е. код загрузчика будет начинаться, например, с 0x204. В основной программе будет запрещено использование ОЗУ меньше адреса 0xC0. Цитата(rezident @ Oct 22 2010, 01:48)  Встречный вопрос. А сколько памяти у вас отведено под стек? Не может ли быть так, что переписывая вектора вы затираете стек? В тестовом проекте Blinky стек начинается с 0x10000800. Но в конфигурации RAM Debug, когда ремап используется-таки, в icf-файле в начале ОЗУ резервируются 0x124 байта, а не 0x200. Такой же диапазон, но уже во Flash резервируется в конфигурации FLASH Debug. По моим сведениям, в LPCXpresso стек начинается с самого старшего адреса ОЗУ и растет в сторону уменьшения адресов. Переменные же располагаются с самого младшего адреса ОЗУ и заполняют память в сторону увеличения адресов. У lpc1114, соответственно, в lpcxpresso, стек начинается с адреса 0x10002000. А у вас, я так понял, Keil? И он резервирует 0x124? (рит) Обдумаю эту информацию на досуге.
Сообщение отредактировал Alekseeey - Oct 22 2010, 07:03
|
|
|
|
Сообщений в этой теме
zuy LPC11xx не стартует код из своего бутлоадера Oct 21 2010, 10:42 Alekseeey У меня та же проблема.
Пробую на отладке LPCXpres... Oct 21 2010, 12:12 zuy Цитата(Alekseeey @ Oct 21 2010, 15:12) Во... Oct 21 2010, 12:52  Alekseeey Цитата(zuy @ Oct 21 2010, 16:52) Если чес... Oct 21 2010, 13:01 DpInRock Вообще-то так и должно быть.
Как правильно (это м... Oct 21 2010, 12:38        rezident Цитата(Alekseeey @ Oct 22 2010, 13:00) По... Oct 22 2010, 13:28 DpInRock Понятия не имею. Но для вас вряд ли имеет значение... Oct 21 2010, 13:13 rezident Возникло предположение, что ремапу подвергается Fl... Oct 21 2010, 20:55 zuy Цитата(rezident @ Oct 21 2010, 23:55) Воз... Oct 21 2010, 21:09 rezident Встречный вопрос. А сколько памяти у вас отведено ... Oct 21 2010, 21:48 zuy Цитата(rezident @ Oct 22 2010, 00:48) Вст... Oct 22 2010, 05:17 rezident Сегодня проэкспериментировал со своей платой и исх... Oct 22 2010, 20:51 Alekseeey Цитата(rezident @ Oct 23 2010, 00:51) Что... Oct 23 2010, 05:02 zuy Цитата(rezident @ Oct 22 2010, 23:51) Сег... Oct 23 2010, 09:18  rezident Цитата(zuy @ Oct 23 2010, 15:18) Поставьт... Oct 23 2010, 20:00 DpInRock За кортекс не скажу, но кроме векторов надо копиро... Oct 23 2010, 08:47 rezident Любопытство победило Со второй попытки создал в K... Oct 24 2010, 01:05 zuy Цитата(rezident @ Oct 24 2010, 04:05) Люб... Oct 24 2010, 15:20  rezident Цитата(zuy @ Oct 24 2010, 21:20) Т.о. на ... Oct 24 2010, 16:17   zuy Цитата(rezident @ Oct 24 2010, 19:17) Люб... Oct 24 2010, 16:56 KRS Тоже столкнулся с проблемой. Но при обычной отладк... Jun 16 2011, 14:20 Almaz1988 Вот код бутлоадера:
CODE#include "LPC11xx.h... Sep 24 2012, 08:46 _Артём_ Цитата(Almaz1988 @ Sep 24 2012, 11:46) Ра... Sep 24 2012, 11:18 Сергей Борщ QUOTE (Almaz1988 @ Sep 24 2012, 11:46) Во... Sep 24 2012, 12:45 _Артём_ Цитата(Almaz1988 @ Sep 24 2012, 11:46) Ра... Sep 24 2012, 15:09 KRS Т.к. у Cortex-M0 нет VTOR и переместить таблицу пр... Sep 24 2012, 11:41 Almaz1988 Наметился небольшой прогресс))
В "загрузчике... Sep 28 2012, 06:22 KRS Цитата(Almaz1988 @ Sep 28 2012, 10:22) Ещ... Sep 28 2012, 07:15 Сергей Борщ QUOTE (Almaz1988 @ Sep 28 2012, 09:22) и ... Sep 28 2012, 07:56 _Артём_ Цитата(Almaz1988 @ Sep 28 2012, 09:22) Ис... Sep 28 2012, 18:55 Almaz1988 Цитата(KRS @ Sep 28 2012, 11:15) Если вы ... Sep 28 2012, 08:10 Сергей Борщ QUOTE (Almaz1988 @ Sep 28 2012, 11:10) Ср... Sep 28 2012, 08:44 KRS Цитата(Almaz1988 @ Sep 28 2012, 12:10) Я ... Sep 28 2012, 10:45 Almaz1988 Цитата(Сергей Борщ @ Sep 28 2012, 12:44) ... Sep 28 2012, 09:06 Сергей Борщ QUOTE (Almaz1988 @ Sep 28 2012, 12:06) Та... Sep 28 2012, 09:26 alx2 Кажется, без ответа остался этот вопрос:
Цитата(Al... Oct 2 2012, 10:16 Almaz1988 Цитата(Сергей Борщ @ Sep 28 2012, 13:26) ... Sep 28 2012, 09:43 Almaz1988 Продолжаю штурм))
и в загрузчике и в рабочей прогр... Oct 1 2012, 11:34 Almaz1988 Продолжаю штурм))
и в загрузчике и в рабочей прогр... Oct 1 2012, 11:36 Almaz1988 Продолжаю штурм))
и в загрузчике и в рабочей прогр... Oct 1 2012, 11:36 Almaz1988 Продолжаю штурм))
и в загрузчике и в рабочей прогр... Oct 1 2012, 11:36 Almaz1988 Продолжаю штурм))
и в загрузчике и в рабочей прогр... Oct 1 2012, 11:38 Almaz1988 Добил бутлоадер)))
В бутлоадере использую только C... Oct 2 2012, 06:09 Сергей Борщ QUOTE (Almaz1988 @ Oct 2 2012, 09:09) Как... Oct 2 2012, 06:31 Almaz1988 Дело близится к завершению))
"Программный за... Oct 5 2012, 10:07 _Артём_ Цитата(Almaz1988 @ Oct 5 2012, 13:07) ... Oct 5 2012, 13:23  igor_mmm Добрый День!
Использую 11с24 и работаю с CAN. ... Oct 6 2012, 19:07   KRS Цитата(igor_mmm @ Oct 6 2012, 23:07) Необ... Oct 6 2012, 20:13    igor_mmm Цитата(KRS @ Oct 7 2012, 00:13) Если в се... Oct 7 2012, 07:29 Almaz1988 Цитата(igor_mmm @ Oct 6 2012, 22:07) Добр... Oct 8 2012, 04:11 igor_mmm Цитата(Almaz1988 @ Oct 8 2012, 08:11) Вот... Oct 9 2012, 03:21 Almaz1988 Вопрос по примеру "NXP secondary bootloader... Oct 8 2012, 06:05 Сергей Борщ QUOTE (Almaz1988 @ Oct 8 2012, 09:05) Как... Oct 8 2012, 06:34 Almaz1988 Цитата(Сергей Борщ @ Oct 8 2012, 09:34) П... Oct 8 2012, 09:28 Сергей Борщ QUOTE (Almaz1988 @ Oct 8 2012, 12:28) Как... Oct 8 2012, 11:02 Almaz1988 В общем осталась последняя проблема.
Есть функция ... Oct 8 2012, 11:45 Сергей Борщ QUOTE (Almaz1988 @ Oct 8 2012, 14:45) Что... Oct 8 2012, 11:57 Almaz1988 Цитата(igor_mmm @ Oct 9 2012, 06:21) а гд... Oct 9 2012, 04:24 igor_mmm Цитата(Almaz1988 @ Oct 9 2012, 08:24) В п... Oct 9 2012, 05:53 Almaz1988 Цитата(Сергей Борщ @ Oct 8 2012, 14:57) Н... Oct 9 2012, 08:34
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|