一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux內(nèi)核定時(shí)器

嵌入式技術(shù) ? 來(lái)源:嵌入式技術(shù) ? 作者:嵌入式技術(shù) ? 2022-09-22 08:56 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Linux內(nèi)核定時(shí)器

在Linux內(nèi)核中,也可以通過(guò)定時(shí)器來(lái)完成定時(shí)功能。但和單片機(jī)不同的是,Linux內(nèi)核定時(shí)器是一種基于未來(lái)時(shí)間點(diǎn)的計(jì)時(shí)方式,它以當(dāng)前時(shí)刻為啟動(dòng)的時(shí)間點(diǎn),以未來(lái)的某一時(shí)刻為終止點(diǎn),類似于我們的鬧鐘。
當(dāng)內(nèi)核定時(shí)器定時(shí)時(shí)間到達(dá)時(shí),會(huì)進(jìn)入用戶指定的函數(shù),相當(dāng)于軟中斷。內(nèi)核定時(shí)器完成注冊(cè)啟動(dòng)后,僅執(zhí)行一次后就不會(huì)重復(fù)執(zhí)行(即超時(shí)候會(huì)自動(dòng)關(guān)閉),若需要重復(fù)執(zhí)行則需要手動(dòng)再次啟動(dòng)(即修改超時(shí)時(shí)間)。
Linux內(nèi)核定時(shí)器相關(guān)函數(shù)位置:include/linux/timer.h

1.相關(guān)結(jié)構(gòu)體

??在使用內(nèi)核定時(shí)器時(shí),我們需要關(guān)心的相關(guān)結(jié)構(gòu)體及其成員:

struct timer_list {
struct list_head entry;
unsigned long expires; /* 定時(shí)器時(shí)鐘節(jié)拍*/
struct tvec_base *base;
void (*function)(unsigned long); /*定時(shí)器工作函數(shù) */
unsigned long data; /*傳給定時(shí)器工作函數(shù)的參數(shù) */
};

?在Linux內(nèi)核中,有一個(gè)全局變量jiffies用來(lái)記錄時(shí)鐘節(jié)拍,每當(dāng)時(shí)鐘中斷觸發(fā)一次,jiffies就會(huì)+1。因此jiffies變量記錄了系統(tǒng)從啟動(dòng)開始時(shí)鐘中斷觸發(fā)的次數(shù)。我們由此可以利用jiffies來(lái)計(jì)算驅(qū)動(dòng)程序運(yùn)行時(shí)長(zhǎng)。jiffies每秒增加HZ次,因此jiffies+1的時(shí)長(zhǎng)有HZ決定。當(dāng)HZ=100時(shí),jiffies+1的時(shí)長(zhǎng)則為10ms。在Linux3.5的內(nèi)核中HZ值默認(rèn)為200,即jiffies+1的時(shí)長(zhǎng)則為5ms。

poYBAGMrEGeAUwfeAANFKZpj6zU873.png#pic_center

2.相關(guān)函數(shù)

2.1 定時(shí)器初始化init_timer()

#define init_timer(timer)
函數(shù)功能: 初始化定時(shí)
形參: 定時(shí)器結(jié)構(gòu)體

2.2 啟動(dòng)定時(shí)器add_timer()

void add_timer(struct timer_list *timer)
函數(shù)功能: 啟動(dòng)定時(shí)器
形參: 定時(shí)器結(jié)構(gòu)體

2.3 修改定時(shí)時(shí)間mod_timer()

int mod_timer(struct timer_list *timer, unsigned long expires)
函數(shù)功能: 修改定時(shí)器時(shí)間
形參: timer – 定時(shí)器結(jié)構(gòu)體
???expires --定時(shí)時(shí)間( 以時(shí)鐘節(jié)拍填入)

??注意:expires 填寫是基于jiffies+延時(shí)時(shí)間

2.4毫秒轉(zhuǎn)為時(shí)鐘節(jié)拍 msecs_to_jiffies()

unsigned long msecs_to_jiffies(const unsigned int m)
函數(shù)功能: 將毫秒時(shí)間轉(zhuǎn)換為時(shí)鐘節(jié)拍數(shù)
形參: m – 毫秒時(shí)間
返回值: – 返回節(jié)拍數(shù)

2.5微秒轉(zhuǎn)為時(shí)鐘節(jié)拍 usecs_to_jiffies()

unsigned long usecs_to_jiffies(const unsigned int u)
函數(shù)功能: 將微秒時(shí)間轉(zhuǎn)換為時(shí)鐘節(jié)拍數(shù)
形參: m – 位秒時(shí)間
返回值: – 返回節(jié)拍數(shù)

2.6關(guān)閉定時(shí)器

int del_timer(struct timer_list *timer)
函數(shù)功能:關(guān)閉定時(shí)器(停用一個(gè)定時(shí)器)
 define del_timer_sync(t)
函數(shù)功能:關(guān)閉定時(shí)器(停用一個(gè)定時(shí)器),多處理器使用。如果編內(nèi)核時(shí)不支持 SMP(多處理器), del_timer_sync()和 del_timer()等價(jià)

2.7 獲取jiffies時(shí)間

#include 
u64 get_jiffies_64(void)
函數(shù)功能: 獲取jiffies時(shí)間
返回值: 返回時(shí)鐘節(jié)拍jiffies

2.8 獲取內(nèi)核高精度時(shí)間

ktime_t ktime_get(void)
函數(shù)功能: 獲取內(nèi)核高精度時(shí)間
返回值: ktime_t – 共用體類型
union ktime {
	s64	tv64;
	#if BITS_PER_LONG != 64 && !defined(CONFIG_KTIME_SCALAR)
		struct
		 {
			# ifdef __BIG_ENDIAN
			s32	sec, nsec;
			# else
			s32	nsec, sec;
			# endif
		} tv;
	#endif
};

2.9 時(shí)間轉(zhuǎn)換函數(shù)

s64 ktime_to_ms(const ktime_t kt) /* 將獲取的系統(tǒng)時(shí)鐘轉(zhuǎn)換為ms單位*/
s64 ktime_to_us(const ktime_t kt) /* 將獲取的系統(tǒng)時(shí)鐘轉(zhuǎn)換為us單位*/
/將獲取的時(shí)間轉(zhuǎn)換為時(shí)鐘結(jié)構(gòu)體/
struct timeval ktime_to_timeval(const ktime_t kt)
struct timespec ktime_to_timespec(const ktime_t kt)

3.內(nèi)核定時(shí)器示例

??內(nèi)核定時(shí)器使用步驟:

  1. 初始化內(nèi)核定時(shí)器init_timer,設(shè)置超時(shí)時(shí)間,編寫內(nèi)核定時(shí)工作函數(shù);
  2. 啟動(dòng)定時(shí)器add_timer;
  3. 若需要重復(fù)定時(shí),則需要在定時(shí)器工作函數(shù)中修改超時(shí)時(shí)間mod_timer
#include 
#include 
#include 
#include 
#include 
struct timer_list timer;
/*定時(shí)器工作函數(shù)*/
void timer_work(unsigned long data)
{
	ktime_t time1;
	printk("定時(shí)器時(shí)間到!data=%ld,",data);
	time1=ktime_get();
	printk("定時(shí)時(shí)間:%llu \n",ktime_to_ms(time1));
	mod_timer(&timer,jiffies+msecs_to_jiffies(2000));/*修改定時(shí)時(shí)間*/
}
static int __init wbyq_timer_init(void)
{
	timer.expires=jiffies+msecs_to_jiffies(1000);/*定時(shí)時(shí)間*/
	timer.function=timer_work;/*定時(shí)器工作函數(shù)*/
	timer.data=666;/*傳給定時(shí)器工作函數(shù)參數(shù),選填*/
	init_timer(&timer);/*初始化定時(shí)器*/
	add_timer(&timer);/*啟動(dòng)定時(shí)器*/
	return 0;
	
}
/*驅(qū)動(dòng)釋放*/
static void __exit wbyq_timer_cleanup(void)
{
	del_timer_sync(&timer);//關(guān)閉定時(shí)器
    printk("驅(qū)動(dòng)出口,驅(qū)動(dòng)注銷成功\n");
}
module_init(wbyq_timer_init);//驅(qū)動(dòng)入口函數(shù)
module_exit(wbyq_timer_cleanup);//驅(qū)動(dòng)出口函數(shù)

MODULE_LICENSE("GPL");//驅(qū)動(dòng)注冊(cè)協(xié)議
MODULE_AUTHOR("it_ashui");
MODULE_DESCRIPTION("Exynos4 timer Driver");
pYYBAGMrEGiANQMXAAEDRiQZ9h4278.png#pic_center  

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1416

    瀏覽量

    41417
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11509

    瀏覽量

    213726
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3298

    瀏覽量

    118869
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux驅(qū)動(dòng)開發(fā)-內(nèi)核定時(shí)器

    內(nèi)核定時(shí)器內(nèi)核用來(lái)控制在未來(lái)某個(gè)時(shí)間點(diǎn)(基于jiffies(節(jié)拍總數(shù)))調(diào)度執(zhí)行某個(gè)函數(shù)的一種機(jī)制,相關(guān)函數(shù)位于 和 kernel/timer.c 文件
    的頭像 發(fā)表于 09-17 15:06 ?1758次閱讀

    芯靈思SinlinxA33開發(fā)板Linux內(nèi)核定時(shí)器編程

    Linux 內(nèi)核定時(shí)器內(nèi)核用來(lái)控制在未來(lái)某個(gè)時(shí)間點(diǎn)(基于jiffies)調(diào)度執(zhí)行某個(gè)函數(shù)的一種機(jī)制,其實(shí)現(xiàn)位于和 kernel/timer.c 文件中。內(nèi)核定時(shí)器的數(shù)據(jù)結(jié)構(gòu)struc
    發(fā)表于 02-14 14:55

    「正點(diǎn)原子Linux連載」第五十章Linux內(nèi)核定時(shí)器實(shí)驗(yàn)

    1)實(shí)驗(yàn)平臺(tái):正點(diǎn)原子Linux開發(fā)板2)摘自《正點(diǎn)原子I.MX6U嵌入式Linux驅(qū)動(dòng)開發(fā)指南》關(guān)注官方微信號(hào)公眾號(hào),獲取更多資料:正點(diǎn)原子第五十章Linux內(nèi)核定時(shí)器實(shí)驗(yàn)
    發(fā)表于 03-20 11:22

    「正點(diǎn)原子Linux連載」第五十章Linux內(nèi)核定時(shí)器實(shí)驗(yàn)

    ,獲取更多資料:正點(diǎn)原子第五十章Linux內(nèi)核定時(shí)器實(shí)驗(yàn)定時(shí)器是我們最常用到的功能,一般用來(lái)完成定時(shí)功能,本章我們就來(lái)學(xué)習(xí)一下Linux
    發(fā)表于 03-20 11:22

    【正點(diǎn)原子FPGA連載】第三十二章Linux內(nèi)核定時(shí)器實(shí)驗(yàn)-領(lǐng)航者ZYNQ之linux開發(fā)指南

    原子公眾號(hào),獲取最新資料第三十二章Linux內(nèi)核定時(shí)器實(shí)驗(yàn)定時(shí)器是我們最常用到的功能,一般用來(lái)完成定時(shí)功能,本章我們就來(lái)學(xué)習(xí)一下Linux
    發(fā)表于 09-20 16:57

    STM32設(shè)置內(nèi)核定時(shí)器延時(shí)

    STM32設(shè)置內(nèi)核定時(shí)器延時(shí)
    發(fā)表于 08-10 06:30

    ARM Cortex-M0+內(nèi)核定時(shí)器

    慕課蘇州大學(xué).嵌入式開發(fā)及應(yīng)用.第三章.基本模塊.ARM Cortex-M0+內(nèi)核定時(shí)器 (Systic0 目錄3 基本模塊3.1 ARM Cortex-M0+內(nèi)核定時(shí)器 (Systic3.1.1
    發(fā)表于 11-08 06:36

    Linux內(nèi)核定時(shí)器的相關(guān)資料分享

    ?? 致敬英雄!一、Linux內(nèi)核定時(shí)器初探1、圖形界面配置系統(tǒng)節(jié)拍率??中斷周期性產(chǎn)生的頻率就是系統(tǒng)頻率,也叫做節(jié)拍率(tick rate),單位是 Hz。系統(tǒng)節(jié)拍率是可以設(shè)置的,在編
    發(fā)表于 12-16 07:37

    Linux內(nèi)核定時(shí)器的相關(guān)資料分享

    文章目錄Linux內(nèi)核定時(shí)器概念Linux內(nèi)核定時(shí)器基礎(chǔ)知識(shí)Linux內(nèi)核定時(shí)器相關(guān)函數(shù)時(shí)間轉(zhuǎn)換
    發(fā)表于 12-20 08:05

    Win32s下內(nèi)核定時(shí)器的使用

    本文介紹了一種Win32s 環(huán)境下的內(nèi)核定時(shí)器的用法。該定時(shí)器相比常用的多媒體定時(shí)器有兩個(gè)優(yōu)點(diǎn):1,消耗資源更少。2,無(wú)需消息隊(duì)列。在操作系統(tǒng)負(fù)載很重的情況下,該定時(shí)器
    發(fā)表于 06-15 10:00 ?32次下載

    LINUX內(nèi)核定時(shí)器(高精度&低精度)

    linux內(nèi)核2.6.16開始引入了高精度定時(shí)器,達(dá)到ns級(jí)別。自此,內(nèi)核擁有兩套并行計(jì)時(shí),低精度和高精度。如果高精度沒有開啟,即使使用
    發(fā)表于 05-13 09:41 ?4368次閱讀

    Linux內(nèi)核定時(shí)器的詳細(xì)資料概述

    前面我們對(duì)按鍵驅(qū)動(dòng)的開發(fā)已經(jīng)基本完成了,但是當(dāng)你對(duì)按鍵多次按下的時(shí)候,你會(huì)發(fā)現(xiàn)打印的返回值是不正確的,這是什么原因呢?學(xué)過(guò)51單片機(jī)的同學(xué)你們都應(yīng)該知道按鍵容易產(chǎn)生抖動(dòng),俗稱“消抖”,我以前的處理辦法是設(shè)置一個(gè)延時(shí)10ms,現(xiàn)在我們的按鍵也是需要延時(shí)的,當(dāng)過(guò)了10ms我們?cè)谌プx這個(gè)按鍵值。
    發(fā)表于 04-23 18:29 ?2次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核定時(shí)器</b>的詳細(xì)資料概述

    Linux內(nèi)核定制方法

    Linux內(nèi)核定制方法說(shuō)明。
    發(fā)表于 03-25 11:25 ?9次下載

    慕課嵌入式開發(fā)及應(yīng)用(第三章.ARM Cortex-M0+內(nèi)核定時(shí)器 (Systic)

    慕課蘇州大學(xué).嵌入式開發(fā)及應(yīng)用.第三章.基本模塊.ARM Cortex-M0+內(nèi)核定時(shí)器 (Systic0 目錄3 基本模塊3.1 ARM Cortex-M0+內(nèi)核定時(shí)器 (Systic3.1.1
    發(fā)表于 11-03 14:51 ?13次下載
    慕課嵌入式開發(fā)及應(yīng)用(第三章.ARM Cortex-M0+<b class='flag-5'>內(nèi)核定時(shí)器</b> (Systic)

    Linux內(nèi)核時(shí)鐘系統(tǒng)和定時(shí)器實(shí)現(xiàn)

    Linux內(nèi)核時(shí)鐘系統(tǒng)和定時(shí)器實(shí)現(xiàn) Linux 2.6.16之前,內(nèi)核只支持低精度時(shí)鐘,內(nèi)核定時(shí)器
    的頭像 發(fā)表于 11-09 09:12 ?1912次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>時(shí)鐘系統(tǒng)和<b class='flag-5'>定時(shí)器</b>實(shí)現(xiàn)