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

 
 
10 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> startup asm
aaarrr
сообщение Jan 15 2009, 21:47
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(sergey sva @ Jan 16 2009, 00:24) *
Начала адреса озу с 0x20000000 (at91sam7).

С количеством нулей ошиблись: ОЗУ у SAM7 начинается с 0x200000. Стек обычно располагают в конце ОЗУ, а не в начале.

P.S. Пожалуйста, используйте знаки препинания:
Цитата
другой вопрос правильно распределил адреса для стеков ремап не используется
- это можно примерно понять только с десятого прочтения.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 15 2009, 22:05
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 16 2009, 06:34
Сообщение #18


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 16 2009, 12:37
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Буду читать. Мне еще не понятен один момент по работе прерываний:
После включения питания, контроллер переходит на первую строчку кода,
запись адреса вектора сброса в PC ldr pc, RESET_ADDR,
после происходит настройка ядра, стека, прочие настройки, таймеров, и дт
дальше вызов функции маин. В ней цикл for(;;){} , все зацикливается.
Возникло прерывании, например IRQ в PC должен записаться адрес кода где находится
программа обработки прерывания. Адрес метки программы прерываний нужно тоже записывать в какой то регистр?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 16 2009, 13:22
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(sergey sva @ Jan 16 2009, 15:37) *
Возникло прерывании, например IRQ в PC должен записаться адрес кода где находится
программа обработки прерывания. Адрес метки программы прерываний нужно тоже записывать в какой то регистр?

После получения сигнала IRQ ядро перейдет на вектор 0x18, затем Вам нужно прочитать адрес подпрограммы прерывания из контроллера прерываний (а он у каждого процессора свой, т.к. к ядру не относится) и обеспечить выполнение подпрограммы. Для SAM'а изучите раздел Advanced Interrupt Controller DS.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 16 2009, 19:11
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Как разместить метку, на асме по адресу 0x18 или 0x1C для того чтобы, после возникновения прерывания прочитать
регистр AIC_IVR и записать в PC?

Label: ((*)0x0000018 ) ??
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 16 2009, 19:16
Сообщение #22


Гуру
******

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



Цитата(sergey sva @ Jan 16 2009, 22:11) *
Как разместить метку, на асме ....

Ой smile.gif, что сейчас будет....
Код
                
         ORG 0x18
         ldr     pc,[pc,#-0xFF0]; Jump directly to the address given by the AIC

Тема напоминает строительство дома без фундамента sad.gif
P.S.
Может объединить c http://electronix.ru/forum/index.php?showtopic=57912&hl= до кучи?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 16 2009, 19:33
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Цитата
строительство дома без фундамента sad.gif

Ничего страшного Москва не сразу строилась. Было бы желание smile.gif smile.gif
Да это точно, что то будет smile.gif smile.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
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 16 2009, 20:10
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 16 2009, 22:18
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 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:
....
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 16 2009, 22:32
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 16 2009, 22:44
Сообщение #27


Гуру
******

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



Цитата(aaarrr @ Jan 17 2009, 00:32) *
произойдет загрузка регистра PC значением, расположенным по адресу PC-0xF20+8



Где "магическое" число 8 две команды в конвеере.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jan 17 2009, 12:24
Сообщение #28


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(aaarrr @ Jan 16 2009, 01:47) *
Стек обычно располагают в конце ОЗУ, а не в начале.

Скорее наоборот. Что IAR v5.1 (AVR), что Keil с RV (ARM) - стёк всегда среди начальных адресов ОЗУ, окружённый RW данными программы.
Почему так?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 17 2009, 12:34
Сообщение #29


Гуру
******

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



Цитата(sonycman @ Jan 17 2009, 14:24) *
Скорее наоборот. Что IAR v5.1 (AVR), что Keil с RV (ARM)



Причем тут компиляторы вообще? Куда скажете, там и будет. Что там в неких демках идущих с каими-то компиляторами - дело "студентов" их писавших. Для реальных вещей надо думать конкретно куда и как. Для падающих стеков размещение в конце блока памяти является в общем случае максимально логичным.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 17 2009, 16:04
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Как обрабатывать исключительные ситуации, например Неопределенная инструкция?
Может есть рекомендации, или может ссылки на пример, желательно на asm.
Go to the top of the page
 
+Quote Post

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

 


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


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