насколько быстрое прерывание возможно обработать в модуле ядра?(интересует 2мсек прерывание с шины PCI, возможно?)
>насколько быстрое прерывание возможно обработать в модуле ядра?(интересует 2мсек прерывание с шины
>PCI, возможно?)
да, вполне возможно даже на ядре без RT патчей. хотя, конечно, многое зависит от того,
что вы делаете в обработчике.
>>насколько быстрое прерывание возможно обработать в модуле ядра?(интересует 2мсек прерывание с шины
>>PCI, возможно?)
>
>
>да, вполне возможно даже на ядре без RT патчей. хотя, конечно, многое
>зависит от того,
>что вы делаете в обработчике.ну просто чтение/запись в регистры PCI железки.
кстати можешь дать рабочие ссылки на RT-патчи? хочется потестить
>ну просто чтение/запись в регистры PCI железки.
>кстати можешь дать рабочие ссылки на RT-патчи? хочется потеститьк сожалению не могу по причине отсутствия потребности в таковых
(в нашей конторе кошерна только montavista и использование всяких левых патчей
отнюдь не приветствуется)
>
>>ну просто чтение/запись в регистры PCI железки.
>>кстати можешь дать рабочие ссылки на RT-патчи? хочется потестить
>
>к сожалению не могу по причине отсутствия потребности в таковых
>(в нашей конторе кошерна только montavista и использование всяких левых патчей
>отнюдь не приветствуется)понятно, есть какой нить скелетик как обработать 2мсек прерывание в модуле? я делаю как в книжках - по ioctl запросу от приложения делаю request_irq(с флагом SA_INTERRUPT), в обработчике читаю из регистра (при этом происходит аппаратный сброс прерывания), смотрю на осциллограф, виже сброс происходит только через раз, в чем дело?
вы уверены, что запись в регистр не кешируется?
можно Ваш код в студию?
> вы уверены, что запись в регистр не кешируется?
> можно Ваш код в студию?
// задание интревала 2 мсек срабатывания прерывания
writeb(0x2, chip_cyclone_addr + 0x11);
// включение генерирования прерывания
writeb(0x1, chip_cyclone_addr + 0x10);
iRet = request_irq(5, altera_interrupt, SA_INTERRUPT, "altera", (void *)altera_interrupt);теперь обработчк:
int tmp = 0, i, handled = 0;
count_irq++;
//считывание - для определение срабатывания прерывания, т.е. если 1-ый бит 10-го регистра равен "1", то прерывание сработало
tmp = readb(chip_cyclone_addr + 0x10);
if (tmp & _B_01)
{
count_real_irq++;
//крутим цикл, чтобы просто потянуть время после обнаружения срабатывания прерывания, этот цикл чётко видно на осцилографе, при увеличении длительности цикла, там верхняя черта растёт ;), но она обрабатывается не всегда, а как то через раз по моему
for (i = 0; i < 1000; i++) tmp = readb(chip_cyclone_addr + 0x11);
//чтение - это сброс прерывания
tmp = readb(chip_cyclone_addr + 0xCB420);
handled = 1;
}
return IRQ_RETVAL(handled);
гм, не пробовали выводить count_real_irq хотя бы раз в секунду?
Ваша затея с циклом доверия как-то не внушаетВопросы не по делу:
1) Вы повесили Altera на PCI?
2) делаете SHDSL модем или что-то вроде?
>гм, не пробовали выводить count_real_irq хотя бы раз в секунду?
выводили, не всегда совпадает с осцилограммой
>Ваша затея с циклом доверия как-то не внушает
а как можно проверить? что посоветуете?
>
>Вопросы не по делу:
>
>1) Вы повесили Altera на PCI?
>2) делаете SHDSL модем или что-то вроде?всё правильно ;)
не совсем понял, что значит не всегда совпадает - есть правильное число прерываний
или нет?
2) Вы случайно не в Питере?
>не совсем понял, что значит не всегда совпадает - есть правильное число
>прерываний
>или нет?
самих прерываний - есть, а вот их обработок меньше ;)>
>2) Вы случайно не в Питере?в Саратове ;)
у меня был похожий проект - 8 линейный SHDSL модем (правда на основе собственной
платы - клона IXDP425 с небольшими ништяками)Если будут интересные вопросы - добро пожаловать в аську 273-083-900