|
|
  |
startup asm |
|
|
|
Jan 15 2009, 21:47
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(sergey sva @ Jan 16 2009, 00:24)  Начала адреса озу с 0x20000000 (at91sam7). С количеством нулей ошиблись: ОЗУ у SAM7 начинается с 0x200000. Стек обычно располагают в конце ОЗУ, а не в начале. P.S. Пожалуйста, используйте знаки препинания: Цитата другой вопрос правильно распределил адреса для стеков ремап не используется - это можно примерно понять только с десятого прочтения.
|
|
|
|
|
Jan 15 2009, 22:05
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Цитата P.S. Пожалуйста, используйте знаки препинания: Виноват, исправил. Компоновщик настраиваться, в этом файле: CODE /* identify the Entry Point (_vec_reset is defined in file crt.s) */ ENTRY(_vec_reset)
/* specify the AT91SAM7S64 memory areas */ MEMORY { flash : ORIGIN = 0, LENGTH = 64K /* FLASH EPROM */ ram : ORIGIN = 0x00200000, LENGTH = 16K /* static RAM area */ }
/* define a global symbol _stack_end (see analysis in annotation above) */ _stack_end = 0x203FFC;
/* now define the output sections */ SECTIONS { . = 0; /* set location counter to address zero */ .text : /* collect all sections that should go into FLASH after startup */ { *(.text) /* all .text sections (code) */ *(.rodata) /* all .rodata sections (constants, strings, etc.) */ *(.rodata*) /* all .rodata* sections (constants, strings, etc.) */ *(.glue_7) /* all .glue_7 sections (no idea what these are) */ *(.glue_7t) /* all .glue_7t sections (no idea what these are) */ _etext = .; /* define a global symbol _etext just after the last code byte */ } >flash /* put all the above into FLASH */
.data : /* collect all initialized .data sections that go into RAM */ { _data = .; /* create a global symbol marking the start of the .data section */ *(.data) /* all .data sections */ _edata = .; /* define a global symbol marking the end of the .data section */ } >ram AT >flash /* put all the above into RAM (but load the LMA initializer copy into FLASH) */
.bss : /* collect all uninitialized .bss sections that go into RAM */ { _bss_start = .; /* define a global symbol marking the start of the .bss section */ *(.bss) /* all .bss sections */ } >ram /* put all the above in RAM (it will be cleared in the startup code */
. = ALIGN(4); /* advance location counter to the next 32-bit boundary */ _bss_end = .; /* define a global symbol marking the end of the .bss section */ } _end = .; /* define a global symbol marking the end of application RAM */ Где про это можно прочитать? Пробовал запустить из командной строки, arm-elf-ld -? Окно закрывается. Использую yagarto. Модератор. Для цитирования объемных исходников используйте тэги codebox, вместо code.
|
|
|
|
|
Jan 16 2009, 06:34
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(sergey sva @ Jan 16 2009, 00:05)  Где про это можно прочитать? В документации на binutils. Конкретно скрипты линкера (ld) - в документации на ld.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 16 2009, 12:37
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Буду читать. Мне еще не понятен один момент по работе прерываний: После включения питания, контроллер переходит на первую строчку кода, запись адреса вектора сброса в PC ldr pc, RESET_ADDR, после происходит настройка ядра, стека, прочие настройки, таймеров, и дт дальше вызов функции маин. В ней цикл for(;;){} , все зацикливается. Возникло прерывании, например IRQ в PC должен записаться адрес кода где находится программа обработки прерывания. Адрес метки программы прерываний нужно тоже записывать в какой то регистр?
|
|
|
|
|
Jan 16 2009, 19:16
|

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

|
Цитата(sergey sva @ Jan 16 2009, 22:11)  Как разместить метку, на асме .... Ой  , что сейчас будет.... Код ORG 0x18 ldr pc,[pc,#-0xFF0]; Jump directly to the address given by the AIC Тема напоминает строительство дома без фундамента  P.S. Может объединить c http://electronix.ru/forum/index.php?showtopic=57912&hl= до кучи?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 16 2009, 19:33
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Цитата строительство дома без фундамента sad.gif Ничего страшного Москва не сразу строилась. Было бы желание  Да это точно, что то будет  Понял что так можно перейти на выполнение кода находящегося по адресу, но как разместить код по этому адресу 0х18? В документации написано что после прерывания в счетчик программ будет записано 0х18 или 0х1С. По этому адресу нужно разместить, код который будет читать вектор прерывания и записывать его в PC. The CPSR is stored in SPSR_irq, the current value of the Program Counter is loaded in the Interrupt link register (R14_irq) and the Program Counter (R15) is loaded with 0x18.
Сообщение отредактировал sergey sva - Jan 16 2009, 20:00
|
|
|
|
|
Jan 16 2009, 20:10
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(sergey sva @ Jan 16 2009, 22:33)  но как разместить код по этому адресу 0х18? Помните код из своего первого поста? Вот он с небольшими модификациями: Код ldr pc, RESET_ADDR ldr pc, UNDEF_ADDR ldr pc, SWI_ADDR ldr pc, PREFETCH_ABORT_ADDR ldr pc, DATA_ABORT_ADDR .word 0 ldr pc,[pc,#-0xF20]; IRQ ldr pc,[pc,#-0xF20]; FIQ RESET_ADDR: .word RESET_handler UNDEF_ADDR: .word UNDEF_handler SWI_ADDR: .word SWI_handler PREFETCH_ABORT_ADDR: .word PREFETCH_ABORT_handler DATA_ABORT_ADDR: .word DATA_ABORT_handler
|
|
|
|
|
Jan 16 2009, 22:18
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Если правильно понимаю? После перехода PC на адрес 0x1000018 происходит вычитания - 0хF20 программный счетчик переходит на адрес AIC_IVR читается его значение и записывается в pc после выполняется программа обработки прерывания. Запись в AIC_SVR0 - 31 нужно делать после сброса, после перехода по метке LAB1? Код 0xFFFFF100 AIC_IVR 0xFFFFF104 AIC_FVR
.global _start _start:
0x1000000 ldr pc, lab1 0x1000004 ldr pc, lab2 0x1000008 ldr pc, lab3 0x100000C ldr pc, lab4 0x1000010 ldr pc, lab5 0x1000014 .word 0 0x1000018 ldr pc,[pc,#-0xF20]; @IRQ_ADDR 0x100001C ldr pc,[pc,#-0xF20]; @ FIQ_ADDR
lab1: .... lab2: ....
|
|
|
|
|
Jan 16 2009, 22:32
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(sergey sva @ Jan 17 2009, 01:18)  Если правильно понимаю? Почти: после перехода PC на адрес 0x18 (он же 0x100018 без ремапа - внимательнее с количеством нулей) произойдет загрузка регистра PC значением, расположенным по адресу PC-0xF20+8 = 0xFFFFF100 = AIC_IVR, и процессор отправится выполнять подпрограмму прерывания. Цитата(sergey sva @ Jan 17 2009, 01:18)  Запись в AIC_SVR0 - 31 нужно делать после сброса, после перехода по метке LAB1? Ну не обязательно прямо так сразу и все. Не стоит забывать только про установку AIC_SPU.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|