|
Опять про загрузчик..., Не получается передать управление. |
|
|
|
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. Как надо компилить-линковать основной модуль и загрузчик по расположению в памяти?
|
|
|
|
|
 |
Ответов
|
Apr 11 2008, 19:51
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(EXeGLuMATOR @ Apr 11 2008, 22:10)  да, сорри забыл сказать. камень LPC2106. Память и вектора ремапятся нормально. А передача управления не происходит поскольку стоят неправильные адреса на векторах. Вопрос собсно как скомпилировать программу, чтобы вектора были рассчитаны на работу с 0 адреса, а сама прога с другого. Бьюсь уже сколько времени - все никак. Все компилится либо с 0 либо с адреса - соотв вектора все направлены в космос. Что-то я туплю походу где-то. Блин сколько уже сказано об этом. 1. Сделайте секцию с нулевого адреса. 2. Разместите в ней вектора. 3. Сделайте секцию с нужного Вам адреса. 4. Разместите в ней всю остальную программу. 5. Скомпилируйте. 6. Наслаждайтесь. Пример для gcc см выше. С keil помочь не могу.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Apr 11 2008, 20:54
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305

|
Цитата(amw @ Apr 11 2008, 23:51)  Блин сколько уже сказано об этом. 1. Сделайте секцию с нулевого адреса. 2. Разместите в ней вектора. 3. Сделайте секцию с нужного Вам адреса. 4. Разместите в ней всю остальную программу. 5. Скомпилируйте. 6. Наслаждайтесь. Пример для gcc см выше. С keil помочь не могу. За пример спасибо. Только в кейле както все иначе выглядит совсем. Насколько я смог разобраться. В этом и проблема. Даже примеры на CARM и Real View - разные. синтаксис другой. Вот и мучаюсь.
|
|
|
|
|
Apr 12 2008, 08:29
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(EXeGLuMATOR @ Apr 11 2008, 23:54)  За пример спасибо. Только в кейле както все иначе выглядит совсем. Насколько я смог разобраться. В этом и проблема. Даже примеры на CARM и Real View - разные. синтаксис другой. Вот и мучаюсь. Возмите простейшую програмку. Пусть она ничего не делает полезного, но маленькой проще разбираться. И размещая функции и переменные в разных секциях, подвигайте эти секции в скрипте линкера по разным адресам. Смотрите на резуль дизассемблирования. Что и по каким адресам располагается уже после компиляции. Стартап придется переписывать. По крайней мере для второй программы, которую должен запускать бутлоадер. И переписать так, чтоб не было конфликтующих действий в разных стартапах.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Apr 17 2008, 09:44
|
Группа: Участник
Сообщений: 3
Регистрация: 21-07-07
Пользователь №: 29 278

|
Цитата(amw @ Apr 12 2008, 11:29)  Возмите простейшую програмку. Пусть она ничего не делает полезного, но маленькой проще разбираться. И размещая функции и переменные в разных секциях, подвигайте эти секции в скрипте линкера по разным адресам. Смотрите на резуль дизассемблирования. Что и по каким адресам располагается уже после компиляции.
Стартап придется переписывать. По крайней мере для второй программы, которую должен запускать бутлоадер. И переписать так, чтоб не было конфликтующих действий в разных стартапах. Взял Ваш пример попытался скомпилить, вадало ошибку в скрипре линковшика $ make arm-elf-ld -Tboot-lpc2378.lds -nostdlib -o boot.elf crt0.o boot.o arm-elf-ld:boot-lpc2378.lds:57: parse error make: *** [boot.elf] Error 1 $ vi boot-lpc2378.lds .ramvectors : { _ramvectors = .; *(.ramvectors*) . = _ramvectors + LENGTH(RAMVECTORS); // :57 ? _eramvectors = .; PROVIDE(eramvectors = .); } > RAMVECTORS AT > FLASH У вас собирался, что то не так сделал?
|
|
|
|
|
May 2 2008, 12:33
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Цитата(eml @ Apr 17 2008, 13:44)  У вас собирался, что то не так сделал? Так что там, победили загрузчик? Переделал тутошний загрузчик для IAR 5.11 и немножко доработал. Все отлично работает. Получилось, что прикладной программе ничего и знать не нужно о существовании загрузчика.
Сообщение отредактировал Vitaliy_ARM - May 2 2008, 12:34
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
Guest_user234_*
|
May 12 2008, 08:58
|
Guests

|
Цитата(Vitaliy_ARM @ May 2 2008, 15:33)  Так что там, победили загрузчик? Здраствуйте, не подскажите, для инициализации стека достаточно установить SYS_MODE (нужно ли устанавливать флаги: I_BIT,F_BIT ) и инициализации памяти где этот стек определен ? -------------------------------------- _start: ldr r0,=TOP_STACK @ SET MODE msr cpsr_c, #(SYS_MODE|I_BIT|F_BIT) @ SET STACK mov sp, r0 bl fn_initSdram bl main_start -------------------------------------- Нужно ли определяеть стек для FIQ, IRQ, Это необходимо делать ? Не подскажите где можно скачать свежую версию binutils-arm для linux ?
Сообщение отредактировал user234 - May 12 2008, 09:00
|
|
|
|
|
May 12 2008, 09:24
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(user234 @ May 12 2008, 11:58)  Здраствуйте, не подскажите, для инициализации стека достаточно установить SYS_MODE (нужно ли устанавливать флаги: I_BIT,F_BIT ) и инициализации памяти где этот стек определен ? -------------------------------------- _start: ldr r0,=TOP_STACK @ SET MODE msr cpsr_c, #(SYS_MODE|I_BIT|F_BIT) @ SET STACK mov sp, r0
bl fn_initSdram bl main_start -------------------------------------- Вопрос слишком расплывчатый. По минимуму - достаточно переключить режим и занести нужное значение в SP. А нужны ли Вам прерывания в каждом конкретном случае - решать Вам. Цитата Нужно ли определяеть стек для FIQ, IRQ, Это необходимо делать ? Если используются прерывания - да. Цитата Не подскажите где можно скачать свежую версию binutils-arm для linux ? Скачать исходник отсюда http://ftp.gnu.org/gnu/binutils/ и скомпилировать. Как и все остальное. Можете воспользоваться приложенными скриптами. Перед запуском создайте каталоги: build downloads log patches scripts src и положите исходники (архивы) в downloads. Скрипты не шибко умные, только для облегчения набирания нужной последовательности команд. Инсталлируется все в /usr/local/arm/arm-elf. У Вас должны быть права на запись в ӕтот каталог. Смотрите начало файла tools.sh и поправте переменные.
Сообщение отредактировал amw - May 12 2008, 09:25
Прикрепленные файлы
tools.zip ( 6.63 килобайт )
Кол-во скачиваний: 98
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
Guest_user234_*
|
May 12 2008, 09:52
|
Guests

|
Цитата(amw @ May 12 2008, 12:24)  Вопрос слишком расплывчатый. По минимуму - достаточно переключить режим и занести нужное значение в SP. А нужны ли Вам прерывания в каждом конкретном случае - решать Вам. Если используются прерывания - да. Спасибо за ссылочку и скрипты для binutils. Стек: не получается. Пока мне не нужны прерывания, но возможно я не понимаю. Если не нужны то мне не нужно определять флаги: I_BIT, F_BIT и отводить стек в соответствующих режимах я правильно понял ? Делаю простые арифметические операции в функции на "c" // main.c int f(int a) { int rez=1; rez = rez + a; <---- пропускает инструкцию не изменяет переменную return rez; } // int main_start(void) { int a=2; int b=8; int c=0; c = f(a); // после выхода из функции с=1 b = a + c; return 0; } Смотрю через отладчик и у меня не происходит изменение переменной rez в функции f(). Не подскажите в чем может быть проблема, неправильно инициализирован стек ? Если так то что может быть неправильно ?
|
|
|
|
|
May 12 2008, 09:57
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(user234 @ May 12 2008, 12:52)  Спасибо за ссылочку и скрипты для binutils.
Стек: не получается. Пока мне не нужны прерывания, но возможно я не понимаю. Если не нужны то мне не нужно определять флаги: I_BIT, F_BIT и отводить стек в соответствующих режимах я правильно понял ?
Делаю простые арифметические операции в функции на "c" // main.c int f(int a) { int rez=1; rez = rez + a; <---- пропускает инструкцию не изменяет переменную return rez; } // int main_start(void) { int a=2; int b=8; int c=0; c = f(a); // после выхода из функции с=1 b = a + c; return 0; }
Смотрю через отладчик и у меня не происходит изменение переменной rez в функции f(). Не подскажите в чем может быть проблема, неправильно инициализирован стек ? Если так то что может быть неправильно ? Возможно. Возможно переменная rez в функции "заоптимизарована" до регистра. Но в таком случае возвращаемое значение должно быть правильным. Смотрите в отладчике, что происходит со стеком.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
Guest_user234_*
|
May 12 2008, 11:08
|
Guests

|
Цитата(amw @ May 12 2008, 12:57)  Возможно. Возможно переменная rez в функции "заоптимизарована" до регистра. Но в таком случае возвращаемое значение должно быть правильным. Смотрите в отладчике, что происходит со стеком. 1. оптимизации кода нет, есть только добавление отладочной информации CFLAGS = -g Вот disassembler функции f: 0x80014104 <f>: mov r12, sp 0x80014108 <f+4>: stmdb sp!, {r11, r12, lr, pc} 0x8001410c <f+8>: sub r11, r12, #4 ; 0x4 0x80014110 <f+12>: sub sp, sp, #12 ; 0xc 0x80014114 <f+16>: str r0, [r11, -#16] 0x80014118 <f+20>: mov r3, #1 ; 0x1 0x8001411c <f+24>: str r3, [r11, -#20] 0x80014120 <f+28>: ldr r3, [r11, -#16] 0x80014124 <f+32>: add r3, r3, #1 ; 0x1 0x80014128 <f+36>: str r3, [r11, -#24] 0x8001412c <f+40>: strb lr, [r5, #1509]! 0x80014130 <f+44>: ldr r3, [r11, -#24] 0x80014134 <f+48>: add r3, r2, r3 <------ rez = rez + a r2- не определен ? 0x80014138 <f+52>: str r3, [r11, -#20] 0x8001413c <f+56>: ldr r3, [r11, -#20] 0x80014140 <f+60>: mov r0, r3 0x80014144 <f+64>: ldmdb r11, {r11, sp, pc} End of assembler dump. Я пока не трассировал с помощью Jtag только gdb, а gdb прыгает по строчкам c-кода Это что, глюк моего компилятора ? 2. Не подскажите когда нужно определять флаги: I_BIT, F_BIT ? 3. (Плохо понимаю происходящее) Не подскажите, при выходе из функции пременная возврвщаются в регистре r0 ?
|
|
|
|
|
May 12 2008, 11:29
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(user234 @ May 12 2008, 14:08)  1. оптимизации кода нет, есть только добавление отладочной информации CFLAGS = -g Вот disassembler функции f: Код 0x80014104 <f>: mov r12, sp 0x80014108 <f+4>: stmdb sp!, {r11, r12, lr, pc} 0x8001410c <f+8>: sub r11, r12, #4 ; 0x4 0x80014110 <f+12>: sub sp, sp, #12; 0xc 0x80014114 <f+16>: str r0, [r11, -#16] 0x80014118 <f+20>: mov r3, #1; 0x1 0x8001411c <f+24>: str r3, [r11, -#20] 0x80014120 <f+28>: ldr r3, [r11, -#16] 0x80014124 <f+32>: add r3, r3, #1 ; 0x1 0x80014128 <f+36>: str r3, [r11, -#24] 0x8001412c <f+40>: strb lr, [r5, #1509]! 0x80014130 <f+44>: ldr r3, [r11, -#24] 0x80014134 <f+48>: add r3, r2, r3 <------ rez = rez + a r2- не определен ? 0x80014138 <f+52>: str r3, [r11, -#20] 0x8001413c <f+56>: ldr r3, [r11, -#20] 0x80014140 <f+60>: mov r0, r3 0x80014144 <f+64>: ldmdb r11, {r11, sp, pc} End of assembler dump. Я пока не трассировал с помощью Jtag только gdb, а gdb прыгает по строчкам c-кода Это что, глюк моего компилятора ? А перед вызовом функции чио в r2? Цитата 2. Не подскажите когда нужно определять флаги: I_BIT, F_BIT ? Дык когда нужно - тогда и определять. Что значит "определять"? Цитата 3. (Плохо понимаю происходящее) Не подскажите, при выходе из функции пременная возврвщаются в регистре r0 ? Вроде того  . А вообще есть такой мануал ARM Procedure Calling Standart. Сокращенно APCS. Берут его на arm.com. Вот только что глянул http://infocenter.arm.com/help/topic/com.a...0042B_aapcs.pdf
Сообщение отредактировал amw - May 12 2008, 11:32
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
Guest_user234_*
|
May 12 2008, 12:48
|
Guests

|
Цитата(amw @ May 12 2008, 14:29)  А перед вызовом функции чио в r2?
Дык когда нужно - тогда и определять. Что значит "определять"? Извините. Когда нужно добавлять флаги : I_BIT, F_BIT в маску ? Скорее, нужно ли маскировать прерывания если у меня нет обработчиков прерываний, не инициализированы вектора прерываний ? И не предполагается работать в других режимах ARM. Перед Вызовом: disassemble main_start Dump of assembler code for function main_start: 0x80014148 <main_start>: mov r12, sp 0x8001414c <main_start+4>: stmdb sp!, {r11, r12, lr, pc} 0x80014150 <main_start+8>: sub r11, r12, #4 ; 0x4 0x80014154 <main_start+12>: sub sp, sp, #12 ; 0xc 0x80014158 <main_start+16>: mov r3, #2 ; 0x2 0x8001415c <main_start+20>: str r3, [r11, -#16] 0x80014160 <main_start+24>: mov r3, #8 ; 0x8 0x80014164 <main_start+28>: str r3, [r11, -#20] 0x80014168 <main_start+32>: mov r3, #0 ; 0x0 0x8001416c <main_start+36>: str r3, [r11, -#24] 0x80014170 <main_start+40>: ldr r0, [r11, -#16] 0x80014174 <main_start+44>: bl 0x80014104 <f> <---- call f() 0x80014178 <main_start+48>: mov r3, r0 0x8001417c <main_start+52>: str r3, [r11, -#24] .... r2 так же не определен. перед вызовом c-функции в r2 записан 0
|
|
|
|
Сообщений в этой теме
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     amw Цитата(eml @ Apr 17 2008, 12:44) У вас со... Apr 17 2008, 16:54 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, 11:50 Сергей Борщ Цитата(Altemir @ May 24 2008, 14:50) Но, ... May 24 2008, 13:45  Altemir Всё это понятно. Вы с Argon-ом на: Сахаре
обсужда... May 24 2008, 14:01 zltigo Цитата(Altemir @ May 24 2008, 13:50) Есть... May 24 2008, 14:10  Altemir Цитата(zltigo @ May 24 2008, 18:10) Ну за... May 24 2008, 15:21   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
|
|
|