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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
torik
сообщение Feb 24 2011, 15:13
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Возникла проблема.

В программе под NiosII используется вывод в консоль fprintf. Очень удобно для отладки.

Добавил в систему VIC и написал обработчик прерываний для таймера. Таймер генерит прерывание с периодом 1мс.

И тут у меня начал затыкаться вывод в stdout (в функции main в бесконечном цикле). Как только я закоментил код обработчика прерываний, все заработало:

Код
//********************** ISR functions **************************************************
//void timer_interrupt_init (void* base, alt_u32 irq_controller_id, alt_u32 irq)
//{
//  /* Register the interrupt */
//  alt_ic_isr_register(irq_controller_id, irq, timer_interrupt_irq, base, NULL);
//
//  irq_cnt = 0;
//
//  /* Start timer */
//  IOWR_ALTERA_AVALON_TIMER_CONTROL(base, ALTERA_AVALON_TIMER_CONTROL_ITO_MSK
//  | ALTERA_AVALON_TIMER_CONTROL_START_MSK);
//}
//
//void timer_interrupt_irq (void* base)
//{
//  /* Clear TO bit in status register */
//  IOWR_ALTERA_AVALON_TIMER_STATUS (base, 0);
//
//  if (irq_cnt < 1000) {
//      irq_cnt++;
//  } else {
//      irq_cnt = 0;
//      send_tx_buffer(&tx);
//  }
//
//  /*Start timer */
//  IOWR_ALTERA_AVALON_TIMER_CONTROL(base, ALTERA_AVALON_TIMER_CONTROL_ITO_MSK
//  | ALTERA_AVALON_TIMER_CONTROL_START_MSK);
//
//}


Это как-то лечится, не? Отчего происходят такие сбои?


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Feb 24 2011, 15:31
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



точно помню, делал и тут выкладывал. а найти не могу laughing.gif
похоже, что прерывание начинает срабатывать слишком часто. например, в регистре period таймера 0, и он на каждом такте кидает прерывание. буквально пару недель назад такую штуку делал и те же симптомы наблюдал. завтра на работе поищу.
воткните в обработчик прерывания дамп регистров таймера, может прояснит ситуацию.
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Feb 25 2011, 04:44
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



во, нашел. ваш косяк, думаю, видно где:
Код
#include <stdio.h>
#include "alt_types.h"
#include "system.h"
#include <sys/alt_irq.h>
#include "altera_avalon_timer_regs.h"

void timer_interrupt_latency_irq()
{
    IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE,0);
    alt_ic_irq_disable(TIMER_0_IRQ_INTERRUPT_CONTROLLER_ID, TIMER_0_IRQ);
    printf("Hello timer!\n");
    alt_ic_irq_enable(TIMER_0_IRQ_INTERRUPT_CONTROLLER_ID, TIMER_0_IRQ);
    printf("IRQ enabled!\n");
}

int main()
{
    printf("Hello from Nios II!\n");
    /* Register the interrupt */
    alt_ic_isr_register(TIMER_0_IRQ_INTERRUPT_CONTROLLER_ID, TIMER_0_IRQ, timer_interrupt_latency_irq, TIMER_0_BASE, NULL);
    /* Start timer */
    IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_0_BASE,10000);
    IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_0_BASE,10000);
    IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_0_BASE,1000);
    IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE, ALTERA_AVALON_TIMER_CONTROL_ITO_MSK
            | ALTERA_AVALON_TIMER_CONTROL_CONT_MSK
            | ALTERA_AVALON_TIMER_CONTROL_START_MSK);
    while (1);//Event Loop
    return 0;
}
Go to the top of the page
 
+Quote Post
torik
сообщение Feb 25 2011, 06:34
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Не вкурил, где конкретно?
Прерывания срабатывают с нужным периодом - сейчас 10 мс.


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Feb 25 2011, 06:45
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата(torik @ Feb 25 2011, 12:34) *
Не вкурил, где конкретно?

Код
alt_ic_irq_disable(TIMER_0_IRQ_INTERRUPT_CONTROLLER_ID, TIMER_0_IRQ);
...
alt_ic_irq_enable(TIMER_0_IRQ_INTERRUPT_CONTROLLER_ID, TIMER_0_IRQ);
Go to the top of the page
 
+Quote Post
torik
сообщение Feb 25 2011, 06:50
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Да, да, заметил уже. Но... не помогло. Несколько printf проходит, а затем снова затыкается.


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Feb 25 2011, 07:04
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



а что в main? есть ли другие прерывания? есть ли зависимость от периода таймера?
Go to the top of the page
 
+Quote Post
torik
сообщение Feb 25 2011, 07:25
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Других прерываний нет.

А не может ли это быть из-за того, что одна и та же функция используется в прерываниях и в main?
функция записи в SPI используется и в main и в прерываниях.



Ага, вот пробую. не fprint затыкается похоже, а именно функция где используется запись SPI!


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Feb 25 2011, 07:26
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата(torik @ Feb 25 2011, 13:22) *
функция записи в SPI используется и в main и в прерываниях.

не хорошо, прерывание ведь может произойти во время транзакции по SPI. что будет - хз - зависит от контроллера. м.б. вообще зависнет
Go to the top of the page
 
+Quote Post
torik
сообщение Feb 25 2011, 07:36
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Запретил прерывания в main на момент выполнения функций, которые используются и в прерываниях. Стало работать.
Побочный эффект - неточность вызова прерывания таймера. И вообще тут надо осторожно...


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Feb 25 2011, 07:46
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата(torik @ Feb 25 2011, 13:36) *
И вообще тут надо осторожно...

я бы сказал, что надо саму идею пересмотреть. может озвучите задачу?
Go to the top of the page
 
+Quote Post
torik
сообщение Feb 25 2011, 09:10
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



пока еще в стадии формирования


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
vetal
сообщение Feb 25 2011, 10:48
Сообщение #13


Гуру
******

Группа: Модераторы
Сообщений: 2 095
Регистрация: 27-08-04
Из: Россия, СПб
Пользователь №: 553



Цитата
Побочный эффект - неточность вызова прерывания таймера. И вообще тут надо осторожно...

Неточность - это нормально. При доступе из двух разных мест надо решать неопределенность rmw операций.
Прерывания можно запрещать не на все время выполнения функции, а только при доступе к общим ресурсам.
Если у вас в системе более одного прерывания, то неточность все равно будет иметь место.
Go to the top of the page
 
+Quote Post
Reanimator++
сообщение Feb 25 2011, 14:18
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 399
Регистрация: 1-01-06
Из: Волгоград
Пользователь №: 12 763



Можно в прерывании взводить семафор (есть отправка на SPI) а потом вызывать функцию отправки которая его проверяет, тогда неточность вызова таймера заменится на неточность во времени отправки данных.
Впрочем тот же микриум должен это дело достаточно быстро обработать (вытесняющая ос все-таки).
Go to the top of the page
 
+Quote Post
torik
сообщение Feb 26 2011, 19:19
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Спасибо!
Я еще вернусь к теме, когда алгоритм как следует продумаю.


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post

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

 


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


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