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

 
 
> Проблема с прерываниями от ядра, как то не так работает прерывания от собственного ядра
Грендайзер
сообщение Feb 10 2015, 09:48
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451



Здравствуйте, коллеги. Работую с Nios II и понадобилось подключить собственное ядро. Написал, подключил - всё хорошо, кроме прерываний. Способы подключения ядра к процессору на рисунке. В первом случае, процессор, после того как происходит прерывание, просто останавливается и всё (в режиме отладки заходит в какую то неведомую функцию после выхода из которой процес опять повторяется и он опять в неё заходит). Во втором случае, процессор нормально уходит в прерывание. В третьем, зависит от того что произошло ранеьше. Если зажать кнопку прерывания, то после ресета процессор входит в обработчик прерывания, если же кнопку не нажимать , то после ресета ядро генерит прерывание и проц столбинеет. Возможно кто то уже напарывался. Буду очень благодарен за помощь. Так же ниже приведу код на с.
Код
#include <stdio.h>
#include "io.h"
#include "system.h"
#include "alt_types.h"
#include "sys/alt_irq.h"

void chu_chu_subprog(void* context, alt_32 id);

void* context;
alt_32 id = 0;

alt_u32 a = 0;

int main()
{
    alt_irq_register(CHU_CHU_IRQ, context, (void*)chu_chu_subprog); // указываем ф-цию обработки прерывания

    while(1)
    {

        IOWR(CHU_CHU_BASE, 0, 6);     // данные в my_core
        IOWR(CHU_CHU_BASE, 1, 7);     // данные в my_core
        IOWR(CHU_CHU_BASE, 3, 1);     // маска прерывания в my_core
        IOWR(CHU_CHU_BASE, 2, 1);     // запуск my_core на выполнение

        a = IORD(CHU_CHU_BASE, 4);     // читаем данные с ядра

        IOWR(LED_BASE, 0, a);         // выводим результат работы ядра на светодиоды
    }

return 0;
}

void chu_chu_subprog(void* context, alt_32 id) // если произошло прерывание выполнить ф-цию
  {
        while(1)
        {IOWR(LED_BASE, 0, 0x55);}
        return;
  }


Сообщение отредактировал Грендайзер - Feb 10 2015, 09:50
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
serjj
сообщение Feb 10 2015, 10:10
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 527
Регистрация: 4-06-14
Из: Санкт-Петербург
Пользователь №: 81 866



Здравствуйте.
Код
void chu_chu_subprog(void* context, alt_32 id) // если произошло прерывание выполнить ф-цию
  {
        while(1)
        {IOWR(LED_BASE, 0, 0x55);}
        return;
  }

Первое, что смутило: у вас в обработчике бесконечный цикл.

Регистрация:
Код
alt_irq_register(CHU_CHU_IRQ, context, (void*)chu_chu_subprog);

Я регистрирую вот так, попробуйте мб:
Код
alt_irq_register(CHU_CHU_IRQ, NULL, chu_chu_subprog);


Приведите если не сложно код на HDL как у вас формируется сигнал прерывания и как он снимается.
В функции обработчике нет снятия флага прерывания. Оно снимается автоматически?
Проверьте дефайн CHU_CHU_IRQ - он точно содержит то что надо? Если тут напутать, то проц улетит в непонятные дебри.

Сообщение отредактировал serjj - Feb 10 2015, 10:11
Go to the top of the page
 
+Quote Post



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

 


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


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