Перехват/обработка прерываний на C(++)
Добавлено: 15 окт 2007, 14:14
Под платформу Gumstix пишу драйвер Bluetooth (BT) для проприетарной ОС.
Для общения с контроллером есть доступ через UART, который работает через процессор PXA270 (Marvell/Intel) (который что-то последовательное превращает во что-то паралельное, а потом обратно .. но это не важно)
UART имеет FIFO, через который драйвер читал, писал байты контроллеру, всё было нормально, пока не пошли "большие" обьёмы данных. Т.к. FIFO имеет размер буфера 64 байта, остальная информация просто обрезается. А в спецификации BT сказано, что драйвер должен обеспечивать отсылку/приём данных минимум 255 байт.
Появилась идея написать собственный программный FIFO и по прерываниям процессора заполнять его приходящими байтами.
В спецификации процессора все регистры прекрасно описаны, и есть интерфейс для работы с ними, но я что-то никак не могу понять, как это делать.
Может кто подкинет общую идею?
Вопрос первый: что такое прерывание? ))))
что происходит с программой, когда оно случается?
Я представляю себе это так: бежит Thread (язык программирования C++, так что я могу позволить себе такую роскошь), который проверяет регистр прерываний, сравнивая его с бит-маской того, что программа ожидает.
Отступление: в регистре Interrupt Enable Register прерывания я "включил".
И когда бит прерывания установлен, программа считывает байт из регистра данных.
Может я что-то неправильно понимаю?
Ибо при такой конструкции в регистре статуса появляется Overrun и приходит лишь последний (допустим из 4-х) байт.
Кроме того вопрос, ну бежит себе Thread,
(с приоритетом выше, чем остальная программа, которая работает с клавиатурой/консолью),
но ведь кроме него мне нужны ещё ресурсы и для самой программы,
потому внутри него я делая sleep на одну милисекунду.
Но ведь именно в эту милисекунду может произойти прерывание? и что тогда?
В общем у меня есть чувство, что я что-то делаю не правильно ..
Подскажите, кто знает, как это правильно делать?
Наставьте, плиз, на путь истенный :-)
Для общения с контроллером есть доступ через UART, который работает через процессор PXA270 (Marvell/Intel) (который что-то последовательное превращает во что-то паралельное, а потом обратно .. но это не важно)
UART имеет FIFO, через который драйвер читал, писал байты контроллеру, всё было нормально, пока не пошли "большие" обьёмы данных. Т.к. FIFO имеет размер буфера 64 байта, остальная информация просто обрезается. А в спецификации BT сказано, что драйвер должен обеспечивать отсылку/приём данных минимум 255 байт.
Появилась идея написать собственный программный FIFO и по прерываниям процессора заполнять его приходящими байтами.
В спецификации процессора все регистры прекрасно описаны, и есть интерфейс для работы с ними, но я что-то никак не могу понять, как это делать.
Может кто подкинет общую идею?
Вопрос первый: что такое прерывание? ))))
что происходит с программой, когда оно случается?
Я представляю себе это так: бежит Thread (язык программирования C++, так что я могу позволить себе такую роскошь), который проверяет регистр прерываний, сравнивая его с бит-маской того, что программа ожидает.
Отступление: в регистре Interrupt Enable Register прерывания я "включил".
И когда бит прерывания установлен, программа считывает байт из регистра данных.
Может я что-то неправильно понимаю?
Ибо при такой конструкции в регистре статуса появляется Overrun и приходит лишь последний (допустим из 4-х) байт.
Кроме того вопрос, ну бежит себе Thread,
(с приоритетом выше, чем остальная программа, которая работает с клавиатурой/консолью),
но ведь кроме него мне нужны ещё ресурсы и для самой программы,
потому внутри него я делая sleep на одну милисекунду.
Но ведь именно в эту милисекунду может произойти прерывание? и что тогда?
В общем у меня есть чувство, что я что-то делаю не правильно ..
Подскажите, кто знает, как это правильно делать?
Наставьте, плиз, на путь истенный :-)