/ / Ako dosiahnuť presný časovač v linuxovom jadre - linux, časovač, linux-kernel, driver, delay

Ako dosiahnuť presný časovač v linuxovom jadre - linux, timer, linux-kernel, driver, delay

Keď píšem ovládač infračerveného diaľkového ovládača, musím počas zapínania a vypínania PWM kontrolovať presný čas oneskorenia.

Najprv som použil funkciu udelay () v jadre, ale zistil som, že to nie je vôbec presné, ako som povedal v inom pošta

AFAIK, iné funkcie časového limitu poskytované jadrom nemôžu poskytnúť presný čas kvôli plánovači, keď vyprší časový limit, jadro ešte potrebuje nejaký čas, aby prešlo na môj proces.

Akú funkciu by som mal používať na tento účel?

odpovede:

1 pre odpoveď č. 1

Vo vyššie uvedenom príspevku sa vyskytla chyba zaokrúhlenia ndelay, chyba, ktorú ste sa značne znásobili tak, že ste funkciu zavolali veľkým argumentom (10 000 nanosekúnd) a potom ju 400 krát zavolali. Ako som zdôraznil, chyba zaokrúhľovania pomocou urobím bol vlastne celkom malý.

Potrebujete mikrosekundové rozlíšenie, v ktoromprípad, udelay sa zdá byť v poriadku. Alebo potrebujete nanosekundové rozlíšenie, v takom prípade ho nepoužívajte na čakanie 4 milióny nanosekúnd a nevyhráte takú chybu. (Mám ťažké predstaviť si zariadenie, ktoré si vyžaduje, aby ste čakali milióny nanosekúnd (alebo dokonca desiatky tisíc), ale potom očakávam, že budete reagovať v priebehu niekoľkých nanosekúnd.)

Ako očividne očakávate, že budete hlasovať bez toho, aby ste povolili prepnutie úlohy, je ďalšou možnosťou použitie ktime_get na získanie monotónne sa zvyšujúceho času nanosekundy s starostlivo udržiavanou korekciou. Potom môžete urobiť vlastný výpočet rozdielu a určiť, kedy ste čakali dosť dlho.