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

 
 
> Проблема с IRQ прерыванием
Daermon
сообщение Oct 30 2007, 11:06
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 36
Регистрация: 26-10-07
Пользователь №: 31 739



Проект под IAR 4.41
Язык С/С++

Программа сделана для работы с внешнего ОЗУ 0х21000000
Вектора прописываются там же 0х21000000
Появиласть проблема с IRQ прерыванием... так как нужно послать PC по адресу 0хfffff100 где расположен AIC_SVR. Но при срабатывании прерывания попадаем по адрессу 0х00000018.

Как мне быть есть два пути:
1 - разместить вектора по адр 0х00000018
2 - добится того чтобы ldr pc, [pc,#-0xF20] посылала на 0xfffff100,
но тогда необходимо прибавить к PC,#0xdefff0e8 , синтаксис не позволяет мне этого сделать.

Может есть еще какие решения?

from startup code
;---------------------------------------------------------------
; ?RESET
; Reset Vector.
; Normally, segment INTVEC is linked at address 0.
; For debugging purposes, INTVEC may be placed at other
; addresses.
; A debugger that honors the entry point will start the
; program in a normal way even if INTVEC is not at address 0.
;---------------------------------------------------------------
MODULE ?RESET
; COMMON INTVEC:CODE:NOROOT(2);
RSEG ICODE:CODE:NOROOT(2)
PUBLIC __program_start
EXTERN ?cstartup
; EXTERN undef_handler, swi_handler, prefetch_handler
; EXTERN data_handler, irq_handler, fiq_handler
CODE32; Always ARM mode after reset
ADRSTART:
org 0x00+ADRSTART
__program_start
ldr pc,=?cstartup; Absolute jump
org 0x04+ADRSTART
undef_handler:
ldr pc,=undef_handler
org 0x08+ADRSTART
swi_handler:
ldr pc,=swi_handler
org 0x0c+ADRSTART
prefetch_handler:
ldr pc,=prefetch_handler
org 0x10+ADRSTART
data_handler:
ldr pc,=data_handler
org 0x18+ADRSTART
ldr pc, [pc,#-0xF20] ; IRQ : read the AIC
org 0x1c+ADRSTART
fiq_handler:
ldr pc,=fiq_handler

; Constant table entries (for ldr pc) will be placed at 0x20
org 0x20+ADRSTART
LTORG
; ENDMOD __program_start
ENDMOD

Сообщение отредактировал Daermon - Oct 30 2007, 11:20
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Daermon
сообщение Oct 31 2007, 07:17
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 36
Регистрация: 26-10-07
Пользователь №: 31 739



Все... из внутреннего ОЗУ (0x00200000) все ремапится в 0х00000000

Но вот из внешнего ОЗУ 0x21000000 не копируются данные во внутреннее ОЗУ.

execUserSetup()
{

__var tmp;
for( i = 0; i < 0x40; i += 4 ) // copy vectors from app to internal RAM
{
tmp = __readMemory32(0x21000000 + i, "Memory"); // НЕ РАБОТАЕТ!!!
__writeMemory32(tmp,0x00200000+ i, "Memory");
}
Remap_RAM();

//__writeMemory32(0xD3,0x98,"Register"); // CPSR = SVC mode, ARM, IRQ, FIQ disabled
//__writeMemory32(0x00000000,0xB4,"Register");
}
Go to the top of the page
 
+Quote Post
Daermon
сообщение Oct 31 2007, 10:25
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 36
Регистрация: 26-10-07
Пользователь №: 31 739



Вроде бы в этом разобрался, но появилась другая проблема.
Теперь программа начала стартовать с адресса 0х00000000, что не есть ГУД.

Помагает программный Reset, после которого прогрмма стартует с адресса 0x21000000 и прерывания срабатывают нормально.

execUserPreload()
{
init_PLL_180();
init_SDRAM ();
__message("Target init macro complete");
}
execUserSetup()
{
__var tmp,i;
Remap_RAM();
for( i = 0; i < 0x40; i += 4 ) // copy vectors from app to internal RAM
{
tmp = __readMemory32(0x21000000 + i, "Memory");
__writeMemory32(tmp,0x00200000+ i, "Memory");
}
__writeMemory32(0xD3,0x98,"Register"); // CPSR = SVC mode, ARM, IRQ, FIQ disabled
__writeMemory32(0x00000000,0xB4,"Register");
}


в .xlc

//************************************************
// Address range for reset and exception
// vectors (INTVEC).
// The vector area is 32 bytes,
// an additional 32 bytes is allocated for the
// constant table used by ldr PC in cstartup.s79.
//************************************************
-Z(CODE)INTVEC=0x00000000-0x0000003F
-Z(CODE)INTVEC_I=0x21000000-0x2100003f
-QINTVEC_I=INTVEC



Что сделать чтобы программа стартовала с адресса 0х21000000???
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 31 2007, 10:45
Сообщение #4


Гуру
******

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



Цитата(Daermon @ Oct 31 2007, 13:25) *
Теперь программа начала стартовать с адресса 0х00000000, что не есть ГУД.
Что сделать чтобы программа стартовала с адресса 0х21000000???
Почему не есть гуд? Ведь именно с этого адреса программа стартует в железе без отладчика. По адресу 0х21000000 располагается вектор ресета, который вы скопировали во внутреннее ОЗУ и отмапировали на адрес 0. Т.е. старт с адреса 0 должен приводить к тому же результату. Но если хотите - в execUserReset в конец допишите
Код
__writeMemory32(0xD3,0x98,"Register"); // CPSR = SVC mode, ARM, IRQ, FIQ disabled
__writeMemory32(0x21000000,0xB4,"Register");

Цитата(Daermon @ Oct 31 2007, 08:53) *
-QINTVEC=INTVEC_I // Вот тут буква Q обязательна?
Help->Linker and library tools user guide.
Цитата(Daermon @ Oct 31 2007, 08:53) *
4. Хотел узнать когда именно исполняется execUserReset() и execUserPreload() до стартапа или после него?
Посмотрите Help->ARM Embedded Workbench User guide. Поищите по ключевому слову execUserPreload - там все довольно подробно описано.

Мне тут пришел в голову еще один вариант, как обойтись без копирования - сделать ремап в execUserPreload(), а вектора расположить по адресу 0. Тогда при загрузке по адресу 0 будет внутреннее ОЗУ и вектора сразу лягут куда надо.


--------------------
На любой вопрос даю любой ответ
"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



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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 01:02
Рейтинг@Mail.ru


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