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

|
Цитата(eml @ Apr 17 2008, 12:44)  У вас собирался, что то не так сделал? Код $ arm-elf-as -v GNU assembler version 2.18 (arm-elf) using BFD version (GNU Binutils) 2.18 $ arm-elf-ld -v GNU ld (GNU Binutils) 2.18 $ arm-elf-gcc -v Using built-in specs. Target: arm-elf Configured with: /home/amw/devel/ARM/arm7tdmi/tools/src/gcc-4.2.2/configure --target=arm-elf --prefix=/usr/local/arm/arm-elf --enable-interwork --enable-multilib --with-newlib --with-headers=/usr/local/arm/arm-elf/arm-elf/include --with-gnu-ld --with-gnu-as --disable-nls --disable-shared --enable-languages=c Thread model: single gcc version 4.2.2 Может в этом?
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
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
|
|
|
|
|
May 12 2008, 13:00
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(user234 @ May 12 2008, 16:48)  Когда нужно добавлять флаги : I_BIT, F_BIT в маску ? Скорее, нужно ли маскировать прерывания если у меня нет обработчиков прерываний, не инициализированы вектора прерываний ? И не предполагается работать в других режимах ARM. Флаги I и F нужно устанавливать для запрета соответствующих исключений. Маскировать прерывания в вашем случае нужно. Настоятельно рекомендую прочитать Technical Reference Manual на ядро. И код какой-то странный сгенерирован. Особенно вот это смущает: Код 0x8001412c <f+40>: strb lr, [r5, #1509]!
|
|
|
|
Guest_user234_*
|
May 12 2008, 13:39
|
Guests

|
Спасибо.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|