[an error occurred while processing this directive]
|
буферы будут сами заполняться контроллером дма, и по каждому дма_каунт = 0 будет происходить прерывание, токо вам про это знать не надо, контроллер сам разберется. А основная идея в том, что пока контроллер дма заполняет один буфер, ядро работает с другим буфером, т.е. контроллер дма и ядро развязаны пространственно. Нужно т.о. 2 (минимум, можно и больше) дескриптора, т.е. для каждого буфера.
А, понял (не так поняли), нет эти два буфера относятся или к tx или к rx, т.о. для приёма надо 2 буфера и для передачи надо 2 буфера, т.е. всего 4 буфера для передачи/приёма, а заполняться они ясное дело будут синхронно.
Читаете в какой нибудь указатель dm(ХХХХ_СР), а далее с помощью этот_самый_указатель = dm(0,этот_самый_указатель); встаёте прямо на адрес некст дескриптор поинтера (т.к. ХХХХ_СР=next descr pointer), т.е. определятся адрес неактивного дескриптора (не тот, с которым работает контроллер дма), далее определив этот адрес (неактивного дескриптора) надо взять из регистра start adress этого дескриптора начальный адрес буфера, с которым может работать ядро. Делается это всё в прерывании от контроллера дма как по приёму так и по передачи, хотя можно (и именно так я и делаю) обслуживать и приём и передачу только в одном прерывании, например, от передачи, а прерывание от приёма вообще запретить (спай же ведь синхронная штука).
И, если Чайник говорит, что есть какие то ограничения, связанные с фифо (может просто бредит, не знаю, пущай ткнет пальцем, если не так), сделайте буфер размером с фифо, но только в самую последнюю очередь когда убедитесь, что так не работает (на других процах работает и с буфером в одну ячейку, правда не спай, но со спортами и с екстернал бас, у которых фифо ну никак не в одно слово, а в 4..6).
E-mail: info@telesys.ru