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

 
 
> Прерывания без ОС на EP9315, обработчик не вызывается
toykhee_menky
сообщение Jun 30 2008, 15:43
Сообщение #1





Группа: Новичок
Сообщений: 9
Регистрация: 30-06-08
Пользователь №: 38 654



Здравствуйте.

EP9315 на плате Tion-pro v1.
Программа на Си, компилируется WinARM 4.1.1, грузится в RAM при помощи redboot.

Пытаюсь работать с портом UART2, порт, судя по всему, работает - тестовая последовательность туда уходит.

FIFO разрешено, после посылки восьми символов оттуда появляется битик прерывания в VIC1RawIntr, т.е. прерывание до VIC вроде бы доходит.

По адресу 0x18 содержится команда, оставленная там redboot-ом, судя по всему:
00000018: 18 F0 9F E5 - перевожу как ldr r15,[r15,#0x18], т.е. должен взяться адрес процедуры реакции на прерывание с адреса 0x38 (0x18+0x18+0x08).

Подменяю указатель по адресу 0x38 на адрес своей функции. Но управление она не получает (контроль - светодиодами).

Прерывания разрешены, режим супервизора: cpsr=0x00000013
ОЗУ отмаплено само на себя, с адреса 0.

обработчик прерывания IRQ оформлен как
Код
void  __attribute__ ((interrupt ("IRQ"))) handler1();

но управления тоже не получает (источник прерывания 25 для VIC1 выбрал, прерывания разрешил, адрес ISR занес).

Чего-то я еще не сделал... Чего?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Jun 30 2008, 16:00
Сообщение #2


Гуру
******

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



VIC, наверное, неправильно инициализировали. Код приведите.

Стоп.
Цитата
Подменяю указатель по адресу 0x38 на адрес своей функции.

А VIC что, оказался совсем не у дел? Процессор будет падать на этот адрес по любому прерыванию.
Go to the top of the page
 
+Quote Post
toykhee_menky
сообщение Jun 30 2008, 16:21
Сообщение #3





Группа: Новичок
Сообщений: 9
Регистрация: 30-06-08
Пользователь №: 38 654



Цитата(aaarrr @ Jun 30 2008, 22:00) *
VIC, наверное, неправильно инициализировали. Код приведите.
Не уверен, что нужно всё подряд, вот части, непосредственно работающие с VIC1:
Код
#define IRQ_SRC 25
volatile unsigned int    *VIC1IRQStatus=(unsigned int *)0x800B0000u;
volatile unsigned int    *VIC1FIQStatus=(unsigned int *)0x800B0004u;
volatile unsigned int      *VIC1RawIntr=(unsigned int *)0x800B0008u;
volatile unsigned int    *VIC1IntSelect=(unsigned int *)0x800B000Cu;
volatile unsigned int    *VIC1IntEnable=(unsigned int *)0x800B0010u;
volatile unsigned int   *VIC1IntEnClear=(unsigned int *)0x800B0014u;
volatile unsigned int            *VIC1protection=(int *)0x800b0020u;
volatile unsigned int     *VIC1VectAddr=(unsigned int *)0x800B0030u;
volatile unsigned int  *VIC1DefVectAddr=(unsigned int *)0x800B0034u;
volatile unsigned int    *VIC1VectAddr0=(unsigned int *)0x800B0100u;
volatile unsigned int    *VIC1VectCntl0=(unsigned int *)0x800B0200u;

volatile int *pedr=(int *)0x80840020u;
unsigned int old_0x38;
unsigned int *ptr_0x38=(unsigned int *)0x38;



Код
  *pedr=3;
  old_0x38= *ptr_0x38;
  *ptr_0x38 = (unsigned int)irq_handler;


пробовал nirq=0 и =4, одинаково:

Код
  VIC1VectAddr0[nirq]=(unsigned int)handler1;
  // 2) chain to 25 source (IRQ_SRC)

  VIC1VectCntl0[nirq]=     IRQ_SRC;
  VIC1VectCntl0[nirq]=0x20|IRQ_SRC;

  // 3) enable it
  *VIC1IntEnable = (1<<IRQ_SRC);
и прибиваю торчащее откуда-то прерывание от источника 3:
Код
*VIC1IntEnClear = 0x08;
*VIC1DefVectAddr=(unsigned int)handler1;

Тексты двух обработчиков:
Код
// -------------- handler1 ----------------------
void __attribute__ ((interrupt ("IRQ"))) handler1()
{
    //volatile unsigned int *VIC1VectAddr=(unsigned int *)0x800B0030;
    //volatile unsigned int *VIC2VectAddr=(unsigned int *)0x800C0030;

    unsigned int s= *VIC1VectAddr;

    while (((*UART2Flag) & 0x10)==0) {
    int k= *UART2Data;
        rs_data_in[rs_h++]=k;
        if (rs_h>=MAX_RS_DT)
           rs_h=0;
    }
    *pedr=2;

    *VIC1VectAddr=0;

};
// --------------- irq_handler ------------------
void irq_handler(void)
{
      asm("stmfd sp!, {r0-r12, lr}");
      void (*interrupt_function)();
      unsigned int vector;
      *pedr=0;
      vector = *VIC1VectAddr;
      interrupt_function = (void(*)())vector;
      (*interrupt_function)();
      *VIC1VectAddr = 0;
      
      asm("ldmfd sp!, {r0-r12, lr}");
      asm("subs pc, lr, #4");
}

В общем, не совсем понятно соотношение обработчиков по адресу 0x18, помещенных в вектор (VIC1VectAddr0..VIC1VectAddr15) и VIC1DefVectAddr.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- toykhee_menky   Прерывания без ОС на EP9315   Jun 30 2008, 15:43
|- - aaarrr   Цитата(toykhee_menky @ Jun 30 2008, 20:21...   Jun 30 2008, 16:47
|- - toykhee_menky   Цитата(aaarrr @ Jun 30 2008, 22:47) Кто в...   Jun 30 2008, 20:01
|- - aaarrr   Цитата(toykhee_menky @ Jul 1 2008, 00:01)...   Jul 1 2008, 12:09
- - sergeeff   Ну я бы под пунктом 0 добавил: Преравание не возни...   Jul 1 2008, 05:58
|- - toykhee_menky   Цитата(sergeeff @ Jul 1 2008, 11:58) Ну я...   Jul 1 2008, 06:30
- - sergeeff   Ну я бы, для начала, написал бы тестовую функцию о...   Jul 1 2008, 08:24
- - sergeeff   Можно посмотреть http://www.siwawi.arubi.uni-kl.de...   Jul 1 2008, 15:46
- - toykhee_menky   Мда. Проблема, однако. Неужели я один такой (или п...   Jul 2 2008, 11:14
- - aaarrr   Исходники redboot'а, если охота в них ковырять...   Jul 2 2008, 11:32
|- - toykhee_menky   Цитата(aaarrr @ Jul 2 2008, 17:32) Исходн...   Jul 2 2008, 13:14
- - sergeeff   Ну вот, осталось посмотреть, что же сидит в таблиц...   Jul 2 2008, 11:33
- - sergeeff   А что за процедура вызывается по прерыванию? Как б...   Jul 2 2008, 16:02
- - Desenix   для армов EP9312, S3C2410, LPC2368 всегда писал и ...   Jul 2 2008, 17:10
- - sergeeff   Все очень здорово, но надо же еще обучить процессо...   Jul 2 2008, 18:38
|- - Desenix   ну да, еще стандартный startup забыл приложить, за...   Jul 2 2008, 19:18
|- - toykhee_menky   Цитата(sergeeff @ Jul 3 2008, 00:38) Все ...   Jul 3 2008, 05:44
- - sergeeff   Уважаемый toykhee_menky! 1. Так про то и речь...   Jul 3 2008, 06:15
- - aaarrr   Цитата(toykhee_menky @ Jun 30 2008, 19:43...   Jul 3 2008, 08:25
|- - toykhee_menky   Цитата(aaarrr @ Jul 3 2008, 14:25) Да, а ...   Jul 3 2008, 13:08
- - aaarrr   Значит на ядро прерывание передается, других вариа...   Jul 3 2008, 13:15
- - sergeeff   Ну дак и осталось то, про что я уже говорил - напи...   Jul 3 2008, 14:12
- - toykhee_menky   Всем спасибо. Перешел на eCos.   Jul 12 2008, 13:49
- - sergeeff   Ну, флаг в руки! Думаю там заморочек будет ещ...   Jul 12 2008, 18:41


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

 


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


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