Differences

This shows you the differences between two versions of the page.

Link to this comparison view

so2:teme:tema2:faq [2017/03/23 21:12]
adrian.stanciu [2 - Funcții blocante]
so2:teme:tema2:faq [2017/03/23 21:48] (current)
adrian.stanciu [3 - Legătura între read/write și întreruperi]
Line 43: Line 43:
 [[http://​cursuri.cs.pub.ro/​lurker/​message/​20070413.104853.300f0d29.en.html | Context ]] [[http://​cursuri.cs.pub.ro/​lurker/​message/​20070413.104853.300f0d29.en.html | Context ]]
  
-:?: În handler-ul pentru intrerupere <code c>​irqreturn_t ​my_handler(int irq_no,void *dev_id,struct pt_regs *regs)</​code>​+:?: În handler-ul pentru intrerupere <code c>​irqreturn_t ​my_irq_handler(int irq_no, void *dev_id)</​code>​
 putem să folosim dev_id astfel încât să refere serial[0] și serial[1] ?  putem să folosim dev_id astfel încât să refere serial[0] și serial[1] ? 
 serial [0] de exemplu este : serial [0] de exemplu este :
-<code c>err = request_irq(MY_IRQ1,​my_handler,SA_INTERRUPT,"​uart16550",&​serial[0]);</​code>​+<code c>err = request_irq(MY_IRQ1, ​my_irq_handlerIRQF_SHARED, "​uart16550",​ &​serial[0]);</​code>​
  
  
 :!: Poți să înregistrezi același handler pentru ambele întreruperi (și MY_IRQ1 și MY_IRQ2); spre exemplu: :!: Poți să înregistrezi același handler pentru ambele întreruperi (și MY_IRQ1 și MY_IRQ2); spre exemplu:
 <code c> <code c>
-request_irq(MY_IRQ1,​my_handler,SA_INTERRUPT,"​uart16550",&​my_serial[0]);​ +request_irq(MY_IRQ1, ​my_irq_handlerIRQF_SHARED, "​uart16550",​ &​my_serial[0]);​ 
-request_irq(MY_IRQ2,​my_handler,SA_INTERRUPT,"​uart16550",&​my_serial[1]);​+request_irq(MY_IRQ2, ​my_irq_handlerIRQF_SHARED, "​uart16550",​ &​my_serial[1]);​
 </​code>​ </​code>​
  
Line 76: Line 76:
  
 <code c> <code c>
-struct structura_mea * sm = (struct structura_mea *) dev_id;+struct structura_mea *sm = (struct structura_mea *)dev_id;
 sm->​base;​ sm->​base;​
 </​code>​ </​code>​
Line 86: Line 86:
 :?: Din câte am înțeles, în write copiez din userspace într-un write buffer local. Write Bufferul este scris pe serial cu outb în handlerul de intrerupere. În read copiez în userspace dintr-un read buffer local. Read bufferul este umplut cu date primite pe serială(inb) în handlerul de întrerupere. Cum se leagă exact funcțiile de read și write de întrerupere?​ Mie îmi intră o singură dată în întrerupere la inițializarea modulului. ​ :?: Din câte am înțeles, în write copiez din userspace într-un write buffer local. Write Bufferul este scris pe serial cu outb în handlerul de intrerupere. În read copiez în userspace dintr-un read buffer local. Read bufferul este umplut cu date primite pe serială(inb) în handlerul de întrerupere. Cum se leagă exact funcțiile de read și write de întrerupere?​ Mie îmi intră o singură dată în întrerupere la inițializarea modulului. ​
  
-:!: La sfârșitul fiecărei funcții write va trebui ​fie să reactivați întreruperile <code c>​outb(0x00,​ IER); outb (0x03, IER);</​code> ​fie activați întreruperea ​de empty buffer doar când există ceva în buffer-ul ​device-ului de scris.+:!: RDAI trebuie să fie activă cât timp buffer-ul de citire nu este plin. Funcția de read ar trebui să activeze RDAI după ce a luat date din buffer-ul de citire iar handler-ul de întrerupere să dezactiveze RDAI dacă buffer-ul de citire devine plin. 
 +THREI trebuie să fie activă cât timp buffer-ul de scriere nu este gol. Funcția de write ar trebui să activeze THREI după ce a pus date în buffer-ul ​de scriere iar handler-ul de întrerupere să dezactiveze THREI dacă buffer-ul ​de scriere devine gol.
  
 ==== 4 - Buffer circular ==== ==== 4 - Buffer circular ====
so2/teme/tema2/faq.1490296375.txt.gz · Last modified: 2017/03/23 21:12 by adrian.stanciu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0