Rumah  >  Artikel  >  Tutorial sistem  >  Analisis rangka kerja pengenalan dan operasi yang berkaitan bagi pemasa ketepatan tinggi

Analisis rangka kerja pengenalan dan operasi yang berkaitan bagi pemasa ketepatan tinggi

WBOY
WBOYasal
2024-07-20 08:36:00460semak imbas

Analisis rangka kerja pengenalan dan operasi yang berkaitan bagi pemasa ketepatan tinggi

Sebutan pemasa berketepatan tinggi secara tiba-tiba membuatkan saya berasa keliru Sekurang-kurangnya pemula akan kecewa Dan jika anda memahaminya secara literal, ia adalah sangat mudah, maka tiada lagi. Walaupun begitu, ia hanya melibatkan beberapa butiran lain.

Jika seorang pekerja ingin menjalankan tugasnya dengan baik, dia mesti mengasah alatnya dahulu Sebelum kita mula bercakap, mari kita asah alatannya dahulu:

2 Beberapa fail kod sumber berkaitan dan laluannya adalah seperti berikut:

Hrtimers.txt(linux-3.2.12documentationtimers)

Hrtimer.c(linux-3.2.12kernel)

Hrtimer.h(linux-3.2.12includelinux)

2 Hanya kendalikan pemasa ketepatan tinggi dalam mod pemasa ketepatan tinggi Keseluruhan rangka kerja operasi adalah seperti berikut:

Inikan hrtimer_init, tetapkan data yang berkaitan melalui struktur hetimer, seperti tempoh masa, dsb.-> hrtimer_interrupt-> Alih keluar pemasa ketepatan tinggi remove_hrtimer.

Pembaca kini mempunyai rangka kerja dalam kepala mereka, dan butiran pemandu khusus akan dibincangkan satu persatu di bawah.

Mari kita beri gambaran terlebih dahulu Mungkin terdapat beberapa perkara yang janggal di dalamnya yang sukar untuk difahami.

? Isih pemasa ketepatan tinggi pada pokok merah hitam mengikut masa.

? Mereka bebas daripada jam tempoh pemasa aplikasi linux, menggunakan cap masa lebar denyut dan bukannya dimensi masa jiffies.

Mula-mula keluarkan dokumentasi yang berkaitan dengan pemasa ketepatan tinggi dalam kod Linux dan lihat pengenalannya kemudian saya akan menerangkannya, laluan dokumen: Hrtimers.txt (linux-3.2.12documentationtimers)

.

Kandungan dokumen... Sejujurnya, dokumen itu agak panjang, tetapi penyelenggaraan dokumen Linux tidak begitu tinggi saya menemui beberapa ayat dari atas dan diterjemahkan, dan kemudian menerangkannya:

?Patchinimemperkenalkansistemberitauntukpembuatkernelberesolusi tinggi. Tampalan frasa dalam ayat ini agak menarik Ini bermakna pemasa berketepatan tinggi dipasang ke dalam sistem sebagai pakej tampalan.

? Perkara kedua, bahasa Inggeris terlalu panjang jadi saya tidak akan menyiarkannya. Itulah sebabnya kita perlu menggunakan pemasa ketepatan tinggi Memandangkan setiap sistem mempunyai pemasa, ketepatannya sebenarnya tidak tinggi dipanggil pemasa ketepatan rendah. Secara terang-terangan, ketepatan tinggi diperlukan.

? Perkara ketiga, satu lagi ciri pemasa ketepatan tinggi ialah rangka kerjanya berada dalam kernel semasa menyusun, dan jika pemasa ketepatan tinggi tidak dikonfigurasikan, pemasa ketepatan tinggi sedemikian adalah berdasarkan larian pemasa biasa.

?Titik terakhir, pemasa ketepatan tinggi dilaksanakan menggunakan algoritma bakau hitam, manakala pemasa biasa dilaksanakan menggunakan algoritma time round robin.

?Selain itu, dokumen itu juga menerangkan banyak isu seperti sumber jam, struktur data, pokok merah-hitam, dll. Isu ini dibincangkan secara berasingan di bawah.

应用定时器程序-1PLC_linux 应用定时器_应用定时器2

1. Struktur data berkaitan

Struktur data yang terlibat dalam pemasa kadar bingkai tinggi, kami mempertimbangkan dari aspek berikut:

Mengenai sumber: Bagaimana jam ini berasal? Struktur ditakrifkan dalam hrtimer.h, kodnya adalah seperti berikut:

structhrtimer_clock_base{

structhrtimer_cpu_base*cpu_base;

intindex; //Atribut yang digunakan untuk membezakan jam (terdapat dua jenis secara keseluruhan, yang akan disebutkan di bawah)

clockid_tclockid; // ID jam yang disokong oleh setiap CPU

structtimerqueue_headactive;//Nod cawangan hitam dan merah pemasa didayakan

ktime_tresolution;//Kadar bingkai jam, milisaat

ktime_t(*get_time)(void);//Digunakan untuk memulihkan jam semasa

ktime_tsoftirq_time;//Masa untuk menjalankan baris gilir pemasa ketepatan yang luas dalam gangguan lembut

ktime_toffset;//Tukar jumlah offset jam pemasa

};

Mengenai elemen sebelum ini, sila jelaskan beberapa perkara.

Pemasa kadar bingkai tinggi boleh berdasarkan dua jam (dasar jam): satu ialah jam monotonik (CLOCK_MONOTONIC), yang bermula dari 0 apabila sistem bermula; Dalam struktur structhrtimer_clock_base di atas, elemen indeks digunakan untuk membezakan sama ada ia adalah jam CLOCK_MONOTONIC atau CLOCK_REALTIME. Untuk setiap CPU sistem, struktur data yang mengandungi dua pangkalan jam ini disediakan Setiap jumlah pangkalan jam mempunyai pokok merah hitam untuk mengisih semua pemasa ketepatan tinggi yang belum selesaipemasa aplikasi linux , dan setiap CPU menyediakan dua pangkalan jam (monotonik. jam dan masa nyata), dan semua pemasa diisih pada pokok merah hitam mengikut masa tamat Jika pemasa telah tamat tetapi fungsi lantunan pengendalinya masih belum dilaksanakan, maka Berhijrah daripada bakau hitam kepada tatasusunan. Apabila melaraskan jam masa nyata, akan terdapat ralat antara nilai masa tamat pemasa yang disimpan dalam jam CLOCK_REALTIME dan masa sebenar semasa. Tatasusunan offset membantu membetulkan situasi ini. Ia mewakili jumlah ofset yang perlu ditentukur oleh pemasa. Kerana ini hanya kesan sementara dan jarang berlaku.

Sebelum memahami sumber jam, kita juga mungkin perlu mengetahui structhrtimer struktur, kodnya adalah seperti berikut:

structhrtimer{

structtimerqueue_nodenode;//Nod baris gilir pemasa juga mengurus nod.expires Masa tamat tempoh mutlak pemasa ketepatan tinggi adalah dalam algoritma dalamannya ) .

应用定时器2_linux 应用定时器_应用定时器程序-1PLC

ktime_t_softexpires;//Masa tamat tempoh paling awal mutlak

enumhrtimer_restart(*)(structhrtimer*);//Fungsi lantunan tamat tempoh pemasa

structhrtimer_clock_base*base;//Tangan menunjuk ke pangkalan masa (setiap CPU, setiap jam)

unsignedlongstate;//Maklumat status, digunakan untuk melihat nilai bit

#ifdefCONFIG_TIMER_STATS

intstart_pid; //Pid tugas yang mula pemasaan disimpan dalam kawasan statistik pemasa

void*start_site;//Pemasa menyimpan nilai permulaan semasa pemasa

charstart_comm[16];//Nama kawasan statistik pemasa memulakan proses penyimpanan pemasaan

#endif

};

Untuk struktur di atas, pengguna hanya perlu mengambil berat tentang tiga mata Yang pertama ialah fungsi rebound selepas pemasa tamat tempoh, yang mewakili masa tamat penggunaan struktur pemasa ketepatan tinggi mesti dimulakan oleh fungsi hrtimer_init() Fungsi hrtimer_init() tergolong dalam soket aplikasi, jadi ia disebut di atas. Terdapat satu lagi isu di sini, yang juga merupakan isu teras pemasa ketepatan tinggi, iaitu penggunaan bakau hitam dalam pemasa ketepatan tinggi Sebenarnya, agak awal untuk membincangkan perkara ini sekarang, dan biarkan pembaca mempunyai idea asas dahulu. Pemasa tradisional Linux Pemasa dilaksanakan melalui algoritma roda masa (timer.c), tetapi hrtimer dilaksanakan melalui algoritma bakau hitam. Terdapat medan nod pada structhrtimer, jenisnya ialah structtimerqueue_node Medan ini mewakili kedudukan hrtimer dalam pokok merah hitam Perhatikan bahawa kod sumber yang saya rujuk ialah versi 3.6.X, format ini medan ialah structrb_node. Izinkan saya bertanya khabar terlebih dahulu kepada pembaca.

Dua struktur penting telah selesai Kerana ia perlu serasi dengan pemproses berbilang teras, ia akan melibatkan asas masa setiap CPU Struktur structhrtimer_cpu_base digunakan untuk menentukan jam setiap CPU Jam monotonik dan jam masa nyata, strukturnya adalah seperti berikut:

structhrtimer_cpu_base{//Struktur asas masa CPU tunggal

raw_spinlock_tlock;//Kunci pangkalan masa dan pemasa yang berkaitan, kunci pembawa

unsignedlongactive_bases;//Tandai tatasusunan bit asas dengan pemasa aktif

#ifdefCONFIG_HIGH_RES_TIMERS

ktime_texpires_next;//Waktu mutlak masa seterusnya yang akan tamat tempoh

inthres_active; //Status mod kadar bingkai tinggi, pembolehubah Boolean

应用定时器2_linux 应用定时器_应用定时器程序-1PLC

inthang_detected; // Gangguan pemasa ketepatan tinggi yang belum selesai dikesan

unsignedlongnr_events;//Jumlah gangguan pemasa ketepatan tinggi

unsignedlongnr_retries;//Jumlah percubaan semula gangguan pemasa ketepatan tinggi

unsignedlongnr_hangs;//Jumlah gangguan pemasa ketepatan tinggi terputus

ktime_tmax_hang_time;//Masa maksimum untuk gangguan pemasa ketepatan tinggi dicetuskan

#endif

structhrtimer_clock_baseclock_base[HRTIMER_MAX_CLOCK_BASES];//Jarum asas masa CPU ini

};

Tiga struktur di dalamnya hendaklah yang paling asas, mentakrifkan fungsi dan elemen yang berkaitan dengan pemasa ketepatan tinggi, dan setiap CPU mempunyai set lengkap struktur yang ditentukan, dan kemudian memulakan hrtimer.

Sekarang kita telah selesai bercakap tentang struktur asas, mari mula bercakap tentang soket API.

Yang pertama ialah mengkonfigurasi dan memulakan API hrtimer. Apabila kita bercakap tentang structhrtimer pada mulanya, kita menyebut bahawa untuk menggunakan structhrtimer, kita perlu memulakannya dahulu Kod pengisytiharan fungsi adalah seperti berikut:

voidhrtimer_init(structhrtimer*timer,clockid_tclock_id,

enumhrtimer_modemode)//Diberi pemasa permulaan jam

debug_init(pemasa, id_jam, mod);

__hrtimer_init(pemasa, id_jam, mod);

Fungsi di atas melaksanakan pemulaan pemasa ketepatan tinggi Berikut ialah penjelasan tentang elemen yang berkaitan:

/**

*hrtimer_init – Mulakan pemasa dengan jam yang diberikan

应用定时器2_应用定时器程序-1PLC_linux 应用定时器

*@timer: Pemasa yang akan dimulakan

*@clock_id: Jam yang akan digunakan

*@mode: mod pemasa abs/rel

*/

mod boleh menggunakan lima pemalar, seperti berikut:

enumhrtimer_mode{

HRTIMER_MODE_ABS=0x0,/*Masa adalah mutlak*/

HRTIMER_MODE_REL=0x1,/*Masa adalah relatif*/

HRTIMER_MODE_PINNED=0x02,/*Pemasa terikat pada CPU*/

HRTIMER_MODE_ABS_PINNED=0x02,

HRTIMER_MODE_REL_PINNED=0x03,

};

Fungsi hrtimer_init() memanggil fungsi __hrtimer_init() Berikut ialah prototaip fungsi ini:

staticvoid__hrtimer_init(structhrtimer*timer,clockid_tclock_id,enumhrtimer_modemode)

structhrtimer_cpu_base*cpu_base;

intbase;

memsettimer,0,sizeof(structhrtimer));

cpu_base=&__raw_get_cpu_var(hrtimer_bases);

应用定时器程序-1PLC_应用定时器2_linux 应用定时器

jika(id_jam==MASA_SEBENAR&&mod!=HRTIMER_MODE_ABS)

clock_id=JAM_MONOTONIK;

base=hrtimer_clockid_to_base(clock_id);

pemasa->base=&cpu_base->clock_base[base];

timerqueue_init(&timer->nod);

#ifdefCONFIG_TIMER_STATS

timer->start_site=NULL;

timer->start_pid=-1;

memset(timer->start_comm,0,TASK_COMM_LEN);

#endif

__hrtimer_init() function calls the structhrtimer_cpu_base structure to initialize the CPU and uses the memset() function. The prototype is as follows:

void*memset(void*s,intc,size_tn)

inti;

char*ss=s;

for(i=0;i

ss[i]=c;

returns;

This function clears the contents of memory and completes the initialization, memset(timer,0,sizeof(structhrtimer)).

Please note here, it is still a problem mentioned above. The source code I used is 3.2.12, and the source code provided in 2.6.X only has two constants

Atas ialah kandungan terperinci Analisis rangka kerja pengenalan dan operasi yang berkaitan bagi pemasa ketepatan tinggi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn