|
Опять про загрузчик..., Не получается передать управление. |
|
|
|
Apr 9 2008, 07:05
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305

|
Перечитал все что нашел, по этой теме - так и не дошло в чем проблема. Итак. Написан загрузчик - все пишется, все обновляется, но не получается передать управление на основную программу. Ремаплю-передаю вот так: Код MEMMAP = 2; //Map vector table from RAM // Copy vectors table src = (unsigned long *)START_ADDR; dst = (unsigned long *)0x00000000; size = 0x40 / sizeof(*dst); do { *dst++ = *src++; } while (--size);
//Reset controller ((void(*)(void))(0x00000000))(); Смотрю в симуляторе, все ремапится, но после перехода на 0 получаю вот это: *** error 65: access violation at 0x00000000 : no 'execute/read' permission Загрузчик линкуется вот так: Код ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; *************************************************************
LR_IROM1 0x00000000 0x00020000 { ; load region size_region ER_IROM1 0x00000000 0x00020000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x40000040 0x0000FFC0 { ; RW data .ANY (+RW +ZI) } } Основной модуль вот так: Код ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; *************************************************************
LR_IROM1 0x00006000 0x0001A000 { ; load region size_region ER_IROM1 0x00006000 0x0001A000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x40000000 0x00010000 { ; RW data .ANY (+RW +ZI) } } В связи с этим вопросы: 1. Что не так делаю? 2. Как надо компилить-линковать основной модуль и загрузчик по расположению в памяти?
|
|
|
|
|
 |
Ответов
|
May 24 2008, 11:50
|
Местный
  
Группа: Свой
Сообщений: 249
Регистрация: 2-05-06
Из: Россия, Поволжье
Пользователь №: 16 686

|
Здравствуйте, уважаемые. Понимаю, что этот вопрос уже поднимался, но хотелось бы получить ответы конкретно по своей задаче. Итак, был мною написан загрузчик для LPC2132, работающий по следующей схеме: 1. Проекты загрузчика и основной программы независимы 2. Для загрузчика определено адресное пространство во флэш: -DROMSTART=01000 -DROMEND=05FFF Жирность загрузчика определяется необходимостью поддержки части периферии, возможностью связи с внешним устройством и компом для получения прошивки основной программы и работы с AT45.
Для основной программы (ОП): [200-FFF],[6000-FFFF] 3. При получении прошивки ОП загрузчик проверяет её на валидность, делает подмену стартового адреса своим, сохраняет стартовый адрес ОП в резервной области LPC, корректирует CRC-векторов, записывает нулевую страницу, обходит "свою" область, записывает оставшуюся область ОП. 4. По окончании записи проверяет ОП во flash LPC на валидность, переходит на исполнение ОП.
Всё работает, работает замечательно, но, как можно заметить, необходимо стирать нулевой сектор, что приводит к возможному "слёту" прошивки при выключении питания/сбросе, если не успела записаться область 0x00-0x3F. Хотелось бы узнать пути решения этой проблемы: как вообще не трогать нулевой сектор? Т.е. адреса 0x0000-0x5FFF должны быть неприкосновенными. Из форума видел пока только одно решение - ремапить в ОЗУ по адресам 0x00-0x3F область INTVEC основной программы. Но, судя опять же по форуму, это ненадёжно, т.к. существует риск затирания этой области некорректным исполнением кода основной программы. Есть ли возможность использования для основной программы векторов из flash, жертвуя использованием прерываний в загрузчике?
Сообщение отредактировал Altemir - May 24 2008, 12:31
|
|
|
|
|
May 24 2008, 14:10
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Altemir @ May 24 2008, 13:50)  Есть ли возможность использования для основной программы векторов из flash, жертвуя использованием прерываний в загрузчике? Ну зачем чем-то жертвовать, куда-то мапировать (жертвуя RAM), если банально перепрограммируется контроллер прерываний и все. А, exceptions handlers при этом всегда в загрузчике - так даже лучше. Первые 0x40 байт загрузчика для LPC21/2xx: Код ORG 0x00 __program_start: ldr pc,(?vect_entry + 4*0) ; 00 Reset ldr pc,(?vect_entry + 4*1) ; 04 UND ldr pc,(?vect_entry + 4*2) ; 08 SWI ldr pc,(?vect_entry + 4*3) ; 0C P_ABT ldr pc,(?vect_entry + 4*4) ; 10 D_ABT dc32 0 ; 14 Summ of other vectors instructions ldr pc, [pc,#-0xFF0] ; 18 Jump directly to the address given by the AIC ; from [0xFFFFF030] Curent 18h +8(conveyer)=20h ldr pc,(?vect_entry + 4*7) ; 1C FRQ ;---------------------------------------------------------------------------- ?vect_entry: dc32 ?cstartup ; Reset dc32 ?undf_abort ; UND dc32 (KERNEL_LOCATION+0x08) ; SWI dc32 ?pref_abort ; P_ABT dc32 ?data_abort ; D_ABT ldr pc,(?vect_entry +4*6) ; Entry Point from application dc32 ?entry_point ; ... dc32 (KERNEL_LOCATION+0x0C) ; FRQ ( With offset in Kernel )
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 24 2008, 15:21
|
Местный
  
Группа: Свой
Сообщений: 249
Регистрация: 2-05-06
Из: Россия, Поволжье
Пользователь №: 16 686

|
Цитата(zltigo @ May 24 2008, 18:10)  Ну зачем чем-то жертвовать, куда-то мапировать (жертвуя RAM), если банально перепрограммируется контроллер прерываний и все. А, exceptions handlers при этом всегда в загрузчике - так даже лучше. Я, конечно, понимаю, что вы давно работаете в этой области и хорошо изучили данный вопрос, но всю силу ARM-ов мне пока не привелось познать. В текущем проекте основной программы я настраивал Vectored Interrupt Controller (VIC), например, так: Код //Vectored Interrupt Controller VICProtection=0x00; //No Protection VICIntSelect=0x00000000; //All requests - IRQ VICSoftIntClear=0xFFFFFFFF; //Release all software requests VICIntEnClear=0xFFFFFFFF; //Disable all interrupts VICIntEnable=((1<<VIC_TIMER0)| //Включить прерывание по TIMER0 (1<<VIC_TIMER1)| //Включить прерывание по TIMER1 (1<<VIC_PWM0)| //Включить прерывание по PWM0 (1<<VIC_UART1)); //Включить прерывание по UART1 VICVectAddr0=(DWORD)&Timer0_Int; //Priority 0 - TIMER0 VICVectCntl0=0x20|VIC_TIMER0; VICVectAddr1=(DWORD)&Timer1_Int; //Priority 1 - TIMER1 VICVectCntl1=0x20|VIC_TIMER1; VICVectAddr2=(DWORD)&PWM0_Int; //Priority 2 - PWM0 VICVectCntl2=0x20|VIC_PWM0; VICVectAddr3=(DWORD)&Uart1_Int; //Priority 3 - UART1 VICVectCntl3=0x20|VIC_UART1; VICVectAddr=0; //Clear one interrupt Я понимаю, что векторов 16 и при переинициализации VIC их может использовать, к примеру, загрузчик, но при этом пока не понимаю как соотносить адреса 0x00-0x3F для основной программы и загрузчика. И где это указывать? Спасибо за терпение. P.S. Похоже, пока я отвечал, вы добавили код, изучаю... zltigoКак я понял: 1. KERNEL_LOCATION - адрес основной программы (ОП) 2. ?cstartup - загрузчик 3. Производится разделение прерываний для ОП и загрузчика. В моём случае хочу так: IRQ - для ОП, FIQ - для загрузчика 4. При инициализации VIC-а в загрузчике: VICIntSelect=0xFFFFFFFF, в ОП: VICIntSelect=0x00000000 5. В итоге - задействую всего 3 адреса в пространстве 0x00-0x3F: 0x0000 0000 Reset 0x0000 0018 IRQ 0x0000 001C FIQ Я всё правильно понял? Тогда я должен прописать в *.xcl-файле IARа для основной программы -Z(CODE)INTVEC=00-3F и поскольку адрес основной программы предопределён, то никаких последующих изменений и подмен адресов не потребуется?
Сообщение отредактировал Altemir - May 24 2008, 14:28
|
|
|
|
Сообщений в этой теме
EXeGLuMATOR Опять про загрузчик... Apr 9 2008, 07:05 aaarrr Не знаю, как оформлены вектора в основной программ... Apr 9 2008, 07:24 EXeGLuMATOR Цитата(aaarrr @ Apr 9 2008, 11:24) Не зна... Apr 9 2008, 07:28  aaarrr Цитата(EXeGLuMATOR @ Apr 9 2008, 11:28) С... Apr 9 2008, 07:41   EXeGLuMATOR Цитата(aaarrr @ Apr 9 2008, 11:41) После ... Apr 9 2008, 07:51    aaarrr Цитата(EXeGLuMATOR @ Apr 9 2008, 11:51) С... Apr 9 2008, 08:00 EXeGLuMATOR То что лежит в 64 байтах от адреса 0х6000 переноси... Apr 9 2008, 08:26 aaarrr Цитата(EXeGLuMATOR @ Apr 9 2008, 12:26) п... Apr 9 2008, 08:32 EXeGLuMATOR Может что не так скомпилировано? Не по тем адресам... Apr 9 2008, 09:21 aaarrr Цитата(EXeGLuMATOR @ Apr 9 2008, 13:21) М... Apr 9 2008, 09:28 EXeGLuMATOR Тогда не понятно в чем проблема. Ладно-бы симуля... Apr 9 2008, 10:01 EXeGLuMATOR Глас вопиющего в пустыне.
Все делают подобные про... Apr 11 2008, 07:51 Сергей Борщ Цитата(EXeGLuMATOR @ Apr 11 2008, 10:51) ... Apr 11 2008, 09:56 amw Цитата(EXeGLuMATOR @ Apr 11 2008, 10:51) ... Apr 11 2008, 10:50 EXeGLuMATOR да, сорри забыл сказать. камень LPC2106. Память и... Apr 11 2008, 19:10 amw Цитата(EXeGLuMATOR @ Apr 11 2008, 22:10) ... Apr 11 2008, 19:51  EXeGLuMATOR Цитата(amw @ Apr 11 2008, 23:51) Блин ско... Apr 11 2008, 20:54   amw Цитата(EXeGLuMATOR @ Apr 11 2008, 23:54) ... Apr 12 2008, 08:29    eml Цитата(amw @ Apr 12 2008, 11:29) Возмите ... Apr 17 2008, 09:44     amw Цитата(eml @ Apr 17 2008, 12:44) У вас со... Apr 17 2008, 16:54     Vitaliy_ARM Цитата(eml @ Apr 17 2008, 13:44) У вас со... May 2 2008, 12:33      user234 Цитата(Vitaliy_ARM @ May 2 2008, 15:33) Т... May 12 2008, 08:58       amw Цитата(user234 @ May 12 2008, 11:58) Здра... May 12 2008, 09:24        user234 Цитата(amw @ May 12 2008, 12:24) Вопрос с... May 12 2008, 09:52         amw Цитата(user234 @ May 12 2008, 12:52) Спас... May 12 2008, 09:57          user234 Цитата(amw @ May 12 2008, 12:57) Возможно... May 12 2008, 11:08           amw Цитата(user234 @ May 12 2008, 14:08) 1.
... May 12 2008, 11:29            user234 Цитата(amw @ May 12 2008, 14:29) А перед ... May 12 2008, 12:48 aaarrr Цитата(user234 @ May 12 2008, 16:48) Когд... May 12 2008, 13:00 user234 Спасибо. May 12 2008, 13:39  amw Цитата(user234 @ May 12 2008, 16:39) Спас... May 12 2008, 16:56 Сергей Борщ Цитата(Altemir @ May 24 2008, 14:50) Но, ... May 24 2008, 13:45  Altemir Всё это понятно. Вы с Argon-ом на: Сахаре
обсужда... May 24 2008, 14:01   zltigo Цитата(Altemir @ May 24 2008, 17:21) 3. П... May 24 2008, 16:21    Altemir ЦитатаНет.
Читаем комментарий: IRQ "Jump dir... May 24 2008, 17:01     zltigo Цитата(Altemir @ May 24 2008, 19:01) Везд... May 24 2008, 17:51      Altemir Цитата(zltigo @ May 24 2008, 21:51) Что т... May 24 2008, 18:06       Сергей Борщ Цитата(Altemir @ May 24 2008, 21:06) 3. О... May 24 2008, 19:38        Altemir Цитата(Сергей Борщ @ May 24 2008, 23:38) ... May 24 2008, 19:53         Altemir Кстати, порывшись в опциях XLINK, обнаружил возмож... May 24 2008, 21:15 Altemir Всё сделал. Всё работает. Никакой правки и копания... May 26 2008, 19:06 zltigo Цитата(Altemir @ May 26 2008, 21:06) Всё ... May 26 2008, 19:31  Altemir Цитата(zltigo @ May 26 2008, 23:31) Сдела... May 26 2008, 19:36 vesago Хочу разобраться с ремапом основного приложения в ... Mar 23 2009, 12:03
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|