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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Опять про загрузчик..., Не получается передать управление.
amw
сообщение Apr 11 2008, 19:51
Сообщение #16


Знающий
****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Apr 11 2008, 20:54
Сообщение #17


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



Цитата(amw @ Apr 11 2008, 23:51) *
Блин сколько уже сказано об этом.
1. Сделайте секцию с нулевого адреса.
2. Разместите в ней вектора.
3. Сделайте секцию с нужного Вам адреса.
4. Разместите в ней всю остальную программу.
5. Скомпилируйте.
6. Наслаждайтесь.
Пример для gcc см выше. С keil помочь не могу.


За пример спасибо. Только в кейле както все иначе выглядит совсем. Насколько я смог разобраться. В этом и проблема. Даже примеры на CARM и Real View - разные. синтаксис другой. Вот и мучаюсь.
Go to the top of the page
 
+Quote Post
amw
сообщение Apr 12 2008, 08:29
Сообщение #18


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(EXeGLuMATOR @ Apr 11 2008, 23:54) *
За пример спасибо. Только в кейле както все иначе выглядит совсем. Насколько я смог разобраться. В этом и проблема. Даже примеры на CARM и Real View - разные. синтаксис другой. Вот и мучаюсь.

Возмите простейшую програмку. Пусть она ничего не делает полезного, но маленькой проще разбираться.
И размещая функции и переменные в разных секциях, подвигайте эти секции в скрипте линкера по разным адресам. Смотрите на резуль дизассемблирования. Что и по каким адресам располагается уже после компиляции.

Стартап придется переписывать. По крайней мере для второй программы, которую должен запускать бутлоадер. И переписать так, чтоб не было конфликтующих действий в разных стартапах.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
eml
сообщение Apr 17 2008, 09:44
Сообщение #19





Группа: Участник
Сообщений: 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

У вас собирался, что то не так сделал?
Go to the top of the page
 
+Quote Post
amw
сообщение Apr 17 2008, 16:54
Сообщение #20


Знающий
****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение May 2 2008, 12:33
Сообщение #21


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



Цитата(eml @ Apr 17 2008, 13:44) *
У вас собирался, что то не так сделал?


Так что там, победили загрузчик?
Переделал тутошний загрузчик для IAR 5.11 и немножко доработал.
Все отлично работает. Получилось, что прикладной программе ничего и знать не нужно
о существовании загрузчика.

Сообщение отредактировал Vitaliy_ARM - May 2 2008, 12:34


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post
Guest_user234_*
сообщение May 12 2008, 08:58
Сообщение #22





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
Go to the top of the page
 
+Quote Post
amw
сообщение May 12 2008, 09:24
Сообщение #23


Знающий
****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Guest_user234_*
сообщение May 12 2008, 09:52
Сообщение #24





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().
Не подскажите в чем может быть проблема, неправильно инициализирован стек ?
Если так то что может быть неправильно ?
Go to the top of the page
 
+Quote Post
amw
сообщение May 12 2008, 09:57
Сообщение #25


Знающий
****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Guest_user234_*
сообщение May 12 2008, 11:08
Сообщение #26





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 ?
Go to the top of the page
 
+Quote Post
amw
сообщение May 12 2008, 11:29
Сообщение #27


Знающий
****

Группа: Свой
Сообщений: 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 ?

Вроде того smile.gif.
А вообще есть такой мануал 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.
Go to the top of the page
 
+Quote Post
Guest_user234_*
сообщение May 12 2008, 12:48
Сообщение #28





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
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 12 2008, 13:00
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 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]!
Go to the top of the page
 
+Quote Post
Guest_user234_*
сообщение May 12 2008, 13:39
Сообщение #30





Guests






Спасибо.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 07:29
Рейтинг@Mail.ru


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