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

 
 
> Проблема с 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, 11:40
Сообщение #2


Участник
*

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



Спасибо.
Наконец прерывания заработали....но только при работе через SAM-ICE. После того как заливаю во внешнюю ОЗУ, при возникновении прерывания программа зависает.


Запускаю плату:
U-Boot 1.1.4 (Aug 20 2006 - 21:33:18)

DRAM: 32 MB
Parallel flash ignored
Flash: 0 kB
DataFlash:AT45DB642
Nb pages: 8192
Page Size: 1056
Size= 8650752 bytes
Logical address: 0xC0000000
Area 0: C0000000 to C00083FF (RO) Bootstrap
Area 1: C0008400 to C003DDFF (RO) U-Boot
Area 3: C003FF00 to C0041FFF Environment
Area 4: C0042000 to C018BFFF OS
Area 5: C018C000 to C083FFFF FS
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
U-Boot>


Закачиваю через DBGU файл - формат raw-binary:
U-Boot> loadb
## Ready for binary (kermit) download to 0x21000000 at 115200 bps...
## Total Size = 0x0000316c = 12652 Bytes
## Start Addr = 0x21000000
U-Boot>go 0x21000000


И вот тут при появлении прерывания программа зависает...

Что тут может быть?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 31 2007, 11:59
Сообщение #3


Гуру
******

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



Цитата(Daermon @ Oct 31 2007, 14:40) *
U-Boot>go 0x21000000
И вот тут при появлении прерывания программа зависает...
Видимо все то же - никто не скопировал вектора, никто не сделал Remap.Могу предложить добавить в программу функцию
Код
#include <stdint.h>
_C_LIB_DECL
#pragma language=extended
#pragma location="ICODE"
int __low_level_init(void)
{
    // copy vectors
    uint32_t const *pSrc = (uint32_t *)0x21000000;
    uint32_t *pDst = (uint32_t *)0x00200000; //RAMSTART
    uint_fast8_t Size = 0x40 / sizeof *Dst;
    do { *pDst++ = *pSrc++; } while (--Size);

    // remap
    uint32_t *pVectors = (uint32_t *)0x00200014; //reserved vector in mirrored RAM
    uint32_t Tmp = *pVectors;
    *pVectors = ~Tmp;
    if( (uint32_t *)0x00000014 != ~Tmp )
        AT91C_BASE_MC->MC_RCR = AT91C_MC_RCB;    // REMAP
    *pVectors = Tmp;

    return 1; // init RAM.
}
#pragma language=default
_END_C_LIB_DECL


--------------------
На любой вопрос даю любой ответ
"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 Текстовая версия Сейчас: 29th July 2025 - 03:29
Рейтинг@Mail.ru


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