2011-09-03 9 views
6

Sto sviluppando un modello I/O di driver di periferica per piccole applicazioni di microcontrollori, utilizzando POSIX come linea guida per la progettazione di interfacce. Ho implementato ioctl() come mezzo di controllo dei parametri del driver/hardware - per la frequenza ad esempio UART baud, I2C indirizzo slave, eccSostituzione per la funzione ioctl()

Ho notato, che POSIX: 2008 liste ioctl() e <stropts.h> come obsolescenza. Qual è il meccanismo alternativo consigliato per comunicare con un driver di dispositivo?

risposta

8

POSIX definisce solo un sottoinsieme molto limitato della funzionalità ioctl(), quella relativa a STREAM. Poiché la funzione STREAMS è obsoleta, l'interfaccia ad essa è anche obsoleta in POSIX.

Tuttavia, ioctl() è stato parte di Unix da "per sempre" (era certamente nella settima edizione di UNIX e sono certo che non era nuovo nemmeno allora). È 'il modo' per controllare i driver di periferica dopo che sono aperti. L'unico problema è che tali interfacce e controlli non sono standardizzati.

È possibile dare un'occhiata ai file <termios.h> per un insieme di funzioni scritte sui terminali di controllo. Mi aspetto che l'implementazione tipica utilizzi lo ioctl() o altri meccanismi specializzati simili, ma l'interfaccia è stata resa generale quando è stata standardizzata (l'interfaccia <termios.h> non è identica a nessuna interfaccia precedente, né la 7a Edizione né il Sistema III o qualsiasi altra interfaccia). Se lo si desidera, è possibile scrivere funzioni standard in cima all'interfaccia ioctl() che gli utenti useranno; implementeresti tali funzioni per chiamare l'interfaccia ioctl().

Quindi, ioctl() non sta andando via; è il modo corretto di controllare i driver di dispositivo. POSIX ha un programma leggermente diverso, tutto qui.

+4

Per espandere su questo, l'eliminazione di POSIX di 'ioctl' non indica che' ioctl' non dovrebbe essere usato, ma piuttosto che POSIX non è interessato a specificare come i dispositivi hardware dovrebbero funzionare. Poiché 'ioctl' era anche usato con STREAMS, POSIX precedentemente specificato * solo quell'aspetto * di' ioctl' (nessun altro uso con i dispositivi), ma ora che gli STREAM sono obsoleti, non rimane nulla da specificare. –

+0

Grazie - sì, è esattamente ciò che intendevo. –

+3

ioctl() va indietro ... personalmente l'ho usato negli anni '80. Mentre i manuali System V del 1983 descrivono ancora ioctl() lo sporco reale su come usarlo è stato trovato nei file .h e nei manuali tecnici. Ti esorto a inserire tutti i dettagli sui TUO ioctl nel file .h del dispositivo per assicurarti che sia sempre disponibile per gli sviluppatori. – Gilbert