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

 
 
 
Reply to this topicStart new topic
> О, чудо!, SAM7
promelectronshch...
сообщение Mar 12 2012, 11:01
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 8-11-10
Из: Украмна
Пользователь №: 60 714



Добрый день. Тут я начал разбираться детально с ARM7TDMI и у меня возник один вопрос...
Имеется SAM7X256, есть асемблерный startUp, который начинается вот так:

Код
__iar_init$$done; The interrupt vector is not needed
                    ; until after copy initialization is done
; ORG     0x00
__iar_program_start:
    LDR    PC, [PC,#24]; Absolute jump can reach 4 GByte
; ORG     0x04      
    LDR     PC, [PC,#24]; Branch to undef_handler
; ORG     0x08
    LDR     PC, [PC,#24]; Branch to swi_handler
; ORG     0x0C    
    LDR     PC, [PC,#24]; Branch to prefetch_handler
; ORG     0x10
    LDR     PC, [PC,#24]; Branch to data_handler
; ORG     0x14
    DC32    0; Reserved
; ORG     0x18    
    LDR        PC, [PC,#24]; Branch to irq_handler
; ORG     0x1C    
    LDR        PC, [PC,#24]; Branch to fiq_handler

; ORG     0x20
    DC32    ?cstartup
; ORG     0x24    
    DC32    OS_CPU_ARM_ExceptUndefInstrHndlr
; ORG     0x28    
    DC32    OS_CPU_ARM_ExceptSwiHndlr
; ORG     0x2C    
    DC32    OS_CPU_ARM_ExceptPrefetchAbortHndlr
; ORG     0x30    
    DC32    OS_CPU_ARM_ExceptDataAbortHndlr
; ORG     0x34
    DC32    0
; ORG     0x38    
    DC32    OS_CPU_ARM_ExceptIrqHndlr
; ORG     0x3C    
    DC32    OS_CPU_ARM_ExceptFiqHndlr


После сброса в счетчике команда загрузиться команда, которая находится по нулевому адресу, вот эта:
Код
  LDR        PC, [PC,#24]

Она означает, что в счетчик команд загр. команда по адресу = текущий PC + смещение (24). Выходит адрес = 0 + 24 = 24; В hex это 0x18.
Если посмотреть высшее на код, то выполниться комманда по адресу 0x18 и перейдем у функц. Branch to irq_handler, а не загрузиться DC32 ?cstartup. Хотя в железе переходит на метку cstartup. Что же это такое ? Может я чего-то не понимаю...

Сообщение отредактировал promelectronshchic - Mar 12 2012, 11:05
Go to the top of the page
 
+Quote Post
dimka76
сообщение Mar 12 2012, 11:13
Сообщение #2


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Во-первых - в РС содержится адрес не текущей, а следующей команды.
А во-торых, у вас по адресу 0х00 ничего нет кроме метки. Да и все ORG закоментарованны,
следовательно весь ваш код смещен вверх на 4 байта.
и по адресу 0x1C не LDR PC, [PC,#24]; Branch to fiq_handler, а
DC32 ?cstartup

И загрузится адрес не PC+24, а значение, которое храниться в PC + 24.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Mar 12 2012, 11:15
Сообщение #3


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



PC + #24 = PC + 0x18 = 0x08 + 0x18 = 0x20
А на 0x20 как раз и находится "DC32 ?cstartup"
http://www.keil.com/forum/16417/


Go to the top of the page
 
+Quote Post
sparcmaster
сообщение Mar 12 2012, 11:22
Сообщение #4


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

Группа: Свой
Сообщений: 93
Регистрация: 13-01-12
Из: Гатчина
Пользователь №: 69 333



Это чудо от не знания архитектуры вашего процессора, конкретнее - читайте про трехступенчатый конвейер.
Go to the top of the page
 
+Quote Post
promelectronshch...
сообщение Mar 12 2012, 11:51
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 8-11-10
Из: Украмна
Пользователь №: 60 714



Цитата
Это чудо от не знания архитектуры вашего процессора, конкретнее - читайте про трехступенчатый конвейер.

Согласен, но не согласен со следующим:

Цитата
А во-торых, у вас по адресу 0х00 ничего нет кроме метки. Да и все ORG закоментарованны,
следовательно весь ваш код смещен вверх на 4 байта.


Я в отладчике смотрю:
__iar_program_start:
LDR PC, [PC,#24]; Absolute jump can reach 4 GByte

Инструкция LDR... размещена по 0 - му адресу, а вверху пустое место и метки не считаются!

Спасибо ребята, понял. Трехступенчатый конвеер : выполнение-декодирование-извлечение. Следовательно декодирование PC+4, извлечение следующей команды pc+8.


Сообщение отредактировал promelectronshchic - Mar 12 2012, 12:04
Go to the top of the page
 
+Quote Post

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

 


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


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