20.11.2013, 13:47
|
|
Временная регистрация
Регистрация: 19.05.2010
Сообщений: 78
Сказал спасибо: 10
Сказали Спасибо 8 раз(а) в 8 сообщении(ях)
|
Свой компилятор/транлятор для stm32
Необходимо создать свой компилятор для stm32.
Как оттраслировать код пользователя в машинные кода- более ли менее понятно: есть ассемблерные инструкции и соотвествующие им опкоды.
Мне не понятно другое: насколько я понимаю, то программа начинается с описания меток векторов прерываний. Поскольку программа пользователя по умолчанию начинается с адреса 0х08000000, то по этому адресу должна быть метка типа goto Reset_Handler и т.д. послдовательно для всех векторов прерываний.
Но глядя на sturupоский файл и дизассемблинг программы по адресу 0х08000000 и далее находятся следующие инструкции типа:
0х08000000 0678 DCW 0x0678
0x08000002 2000 DCW 0x2000
0х08000004 0840 DCW 0x0840
0x08000006 0800 DCW 0x0800
и т.д.
судя по дальнейшим данным, записанным дальше, вроде становится понятно, что начиная с адреса 0х08000004 записаны адреса+1 функций обработчиков прерываний. И сдесь возникает первый вопрос:
1. Судя по документации для stm32f417 адресное пространство 0х188(392) байта занимают вектора. Получается в область с 0х08000000 по 0х08000188 ничего лишнего писать нельзя. Там обязательно должны быть адреса обработчиков векторов прерываний?
2.Далее, что же такое
0х08000000 0678 DCW 0x0678
0x08000002 2000 DCW 0x2000
Судя по всему 0х20000678 это какой-то адрес оперативной памяти.По стартапу написано DCD _initial_sp, то есть это инициализация вершины стека. Я так понимаю-это адрес вершины стека.Но почему выбран именно этот адрес? После проведения экспериментов в добавлением переменных в программу, стало понятно что адресс стека всегда будет в конце всех переменных ОЗУ. Но я так понимаю, что адресс вершины стека я,как разработчик компилятора и транслятора могу объявить каким угодно в области оперативной памяти. Правильно ли я понимаю? И правильно ли я понимаю, что главное записать этот адрес вершины стека по адресу 0х08000000 ? Где можно прочитать, что по этому адресу должен всегда быть записан адрес вершины стека?
3.Далее после адресного пространства векторов прерываний идет код:
Код:
|
0x08000188 F000F802 BL.W __scatterload (0x08000190)
0x0800018C F000F83C BL.W __rt_entry (0x08000208)
__scatterload:
0x08000190 A00A ADR r0,{pc}+4 ; @0x080001BC
0x08000192 E8900C00 LDM r0,{r10-r11}
0x08000196 4482 ADD r10,r10,r0
0x08000198 4483 ADD r11,r11,r0
0x0800019A F1AA0701 SUB r7,r10,#0x01
__scatterload_null:
0x0800019E 45DA CMP r10,r11
0x080001A0 D101 BNE 0x080001A6
0x080001A2 F000F831 BL.W __rt_entry (0x08000208)
0x080001A6 F2AF0E09 ADR.W lr,{pc}-0x07 ; @0x0800019F
0x080001AA E8BA000F LDM r10!,{r0-r3}
0x080001AE F0130F01 TST r3,#0x01
0x080001B2 BF18 IT NE
0x080001B4 1AFB SUBS r3,r7,r3
0x080001B6 F0430301 ORR r3,r3,#0x01
0x080001BA 4718 BX r3
0x080001BC 034C DCW 0x034C
0x080001BE 0000 DCW 0x0000
0x080001C0 036C DCW 0x036C
0x080001C2 0000 DCW 0x0000
__scatterload_copy:
0x080001C4 3A10 SUBS r2,r2,#0x10
0x080001C6 BF24 ITT CS
0x080001C8 C878 LDM r0!,{r3-r6}
0x080001CA C178 STM r1!,{r3-r6}
0x080001CC D8FA BHI __scatterload_copy (0x080001C4)
0x080001CE 0752 LSLS r2,r2,#29
0x080001D0 BF24 ITT CS
0x080001D2 C830 LDM r0!,{r4-r5}
0x080001D4 C130 STM r1!,{r4-r5}
0x080001D6 BF44 ITT MI
0x080001D8 6804 LDR r4,[r0,#0x00]
0x080001DA 600C STR r4,[r1,#0x00]
0x080001DC 4770 BX lr
0x080001DE 0000 MOVS r0,r0
__scatterload_zeroinit:
0x080001E0 2300 MOVS r3,#0x00
0x080001E2 2400 MOVS r4,#0x00
0x080001E4 2500 MOVS r5,#0x00
0x080001E6 2600 MOVS r6,#0x00
0x080001E8 3A10 SUBS r2,r2,#0x10
0x080001EA BF28 IT CS
0x080001EC C178 STM r1!,{r3-r6}
0x080001EE D8FB BHI 0x080001E8
0x080001F0 0752 LSLS r2,r2,#29
0x080001F2 BF28 IT CS
0x080001F4 C130 STM r1!,{r4-r5}
0x080001F6 BF48 IT MI
0x080001F8 600B STR r3,[r1,#0x00]
0x080001FA 4770 BX lr
__rt_lib_init:
0x080001FC B51F PUSH {r0-r4,lr}
__rt_lib_init_fp_1:
0x080001FE F000F97E BL.W __semihosting_library_function (0x080004FE)
__rt_lib_init_alloca_1:
0x08000202 BD1F POP {r0-r4,pc}
__rt_lib_shutdown:
0x08000204 B510 PUSH {r4,lr}
__rt_lib_shutdown_fp_trap_1:
0x08000206 BD10 POP {r4,pc}
__rt_entry:
0x08000208 F000F943 BL.W __user_setup_stackheap (0x08000492)
0x0800020C 4611 MOV r1,r2
__rt_entry_li:
0x0800020E F7FFFFF5 BL.W __rt_lib_init (0x080001FC)
__rt_entry_main:
0x08000212 F000F905 BL.W main (0x08000420)
0x08000216 F000F961 BL.W exit (0x080004DC)
__rt_exit:
0x0800021A B403 PUSH {r0-r1}
__rt_exit_ls:
0x0800021C F7FFFFF2 BL.W __rt_lib_shutdown (0x08000204)
__rt_exit_exit:
0x08000220 BC03 POP {r0-r1}
0x08000222 F000F965 BL.W _sys_exit (0x080004F0) |
В стартапе я такого не наблюдаю, то есть я так понимаю кейл сам нахимичил эти вещи, что это такое и что оно делает?
Полазив по сайту арма стало ясно, что этто использование какой-то библиотеки линкера кейла, а что она делает эта библиотека?
То есть из всего этого, я так понимаю, что есть адресное пространство, которое использует и куда отправляет железо в процессе выполнения программы и которое должно быть сконфигурировано определенным образом. А есть адресное пространство, с которого начинается сама программа пользователя как таковая.
Вот меня интересует, где можно четко прочитать про эти вещи.
|
|
|
|
20.11.2013, 14:11
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
|
Re: Свой компилятор/транлятор для stm32
Сообщение от Batisto4ka
|
Необходимо создать свой компилятор для stm32
|
А точно необходимо? Знаю, навскидку, только одного кто писал собственный компилятор и ОС, правда не под АРМ, что-то смог бы подсказать, но он сейчас не у дел, забил на это, здесь практически не появляется.
ИМХО, зря вы в это впряглись.
|
|
|
|
20.11.2013, 14:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Свой компилятор/транлятор для stm32
Сообщение от Batisto4ka
|
Вот меня интересует, где можно четко прочитать про эти вещи.
|
Здесь http://www.dsi.fceia.unr.edu.ar/down...0Cortex-M3.pdf
|
|
|
|
20.11.2013, 15:45
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,637
Сказал спасибо: 116
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: Свой компилятор/транлятор для stm32
Batisto4ka, с разморозкой!
arm-none-eabi-gcc
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
20.11.2013, 16:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,637
Сказал спасибо: 116
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: Свой компилятор/транлятор для stm32
Сообщение от Batisto4ka
|
Абсолютно свободный КОНСОЛЬНЫЙ компилятор, линкер и транслятор в виде экзешников, без установок
|
Так вам, батенька, еще и под мастдайку надо? Хм, как бы сказать...
Но даже под игровую прошивку можно найти бинарник gcc для ARM'ов.
А еще напрягает выделение слова "консольный". А что, есть гуевые компиляторы? Отсыпьте, пожалуйста, своей травы!
И что значит "без установок"? Не хочется глобально ставить — втыкаете в хомяк + маленько переменные изменяете. Все будет работать.
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
20.11.2013, 16:56
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
|
Re: Свой компилятор/транлятор для stm32
Сообщение от Batisto4ka
|
их нужно скомпилировать, скомпоновать и создать исполняемый хекс или бин файл.
|
Желаете посоревноваться/утереть нос ведущим? Снимаю шляпу, удачи!
|
|
|
|
20.11.2013, 18:15
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: Свой компилятор/транлятор для stm32
Сообщение от Batisto4ka
|
Главное никто не спросил зачем
|
А зачем это другим?
Вы бы сразу объяснили зачем , глядишь ухмылок меньше было БЫ ...
__________________
Осторожно , злой кот
|
|
|
|
20.11.2013, 22:24
|
|
Прописка
Регистрация: 09.02.2011
Сообщений: 164
Сказал спасибо: 1
Сказали Спасибо 27 раз(а) в 22 сообщении(ях)
|
Re: Свой компилятор/транлятор для stm32
Сообщение от Batisto4ka
|
Необходимо создать свой компилятор для stm32.
|
А с какого языка?
Если ассемблер, то на сайте ARM есть исходник синтаксического анализатора.
Значение стека как раз по адресу 0х08000000. Это требование архитектуры.
Определяется компоновщиком.
Последний раз редактировалось Impartial; 20.11.2013 в 22:29.
|
|
|
|
21.11.2013, 07:23
|
|
Частый гость
Регистрация: 30.12.2008
Сообщений: 36
Сказал спасибо: 7
Сказали Спасибо 28 раз(а) в 13 сообщении(ях)
|
Re: Свой компилятор/транлятор для stm32
Сообщение от Batisto4ka
|
Главное никто не спросил зачем
|
Зачем?
Это очень напряжно, писать подобные тулзы. Нужен не дюжий опыт в создании подобных инструментов.
Если нет опыта - вы будете "изобретать велосипед" и не закончите.
Если есть опыт - тем более не возьметесь, т.к. придется выкинуть год и более жизни на то, что уже сделано другими.
Самый оптимальный способ - подогнать под себя то, что уже есть. Если что-то нужно страшное по конструкциям - то проще сделать препроцессор (вернее, использовать существующие тулзы, опять же), написать свои библиотеки и т.д.
"C" позволяет над собой очень издеваться...
Собираете набор небольших утилит, которые и будут собирать ваш проект из исходных *.c файлов.
Это будет гораздо быстрее и, главное, безглючнее.
|
|
|
|
21.11.2013, 10:50
|
|
Прописка
Регистрация: 31.08.2008
Сообщений: 117
Сказал спасибо: 4
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Свой компилятор/транлятор для stm32
девочка работает на космос. наверное хорошо платят раз взялась за написание транслятора, ой,... извините, компилятора.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:04.
|
|