成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

芯靈思SinlinxA33開(kāi)發(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)位于 <Linux/timer.h> 和 kernel/timer.c 文件中。

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

創(chuàng)新互聯(lián)始終致力于在企業(yè)網(wǎng)站建設(shè)領(lǐng)域發(fā)展。秉承“創(chuàng)新、求實(shí)、誠(chéng)信、拼搏”的企業(yè)精神,致力為企業(yè)提供全面的網(wǎng)絡(luò)宣傳與技術(shù)應(yīng)用整體策劃方案,為企業(yè)提供包括“網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站設(shè)計(jì)、手機(jī)網(wǎng)站建設(shè)、微信網(wǎng)站建設(shè)、成都小程序開(kāi)發(fā)、商城網(wǎng)站建設(shè)、平臺(tái)網(wǎng)站建設(shè)秉承"和諧、參與、激情"的文化,與客戶(hù)和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

開(kāi)發(fā)平臺(tái)

  • 芯靈思SinlinxA33開(kāi)發(fā)板

    淘寶店鋪: https://sinlinx.taobao.com/

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

嵌入式linux 開(kāi)發(fā)板交流 QQ:641395230

內(nèi)核定時(shí)器的數(shù)據(jù)結(jié)構(gòu)

struct timer_list {
    struct list_head entry;  //雙向鏈表元素list:用來(lái)將多個(gè)定時(shí)器連接成一條雙向循環(huán)隊(duì)列。
    unsigned long expires; //expires 字段表示期望定時(shí)器執(zhí)行的 jiffies 值,到達(dá)該 jiffies 值時(shí),將調(diào)用 function 函數(shù),并傳遞 data 作為參數(shù)。
    void (*function)(unsigned long); //指向一個(gè)可執(zhí)行函數(shù)。當(dāng)定時(shí)器到期時(shí),內(nèi)核就執(zhí)行function所指定的函數(shù)。而data域則被內(nèi)核用作function函數(shù)的調(diào)用參數(shù)。
    unsigned long data; 
    struct tvec_base *base;
    /* ... */
};

時(shí)間比較操作

在定時(shí)器應(yīng)用中經(jīng)常需要比較兩個(gè)時(shí)間值,以確定timer是否超時(shí),所以L(fǎng)inux內(nèi)核在timer.h頭文件中定義了4個(gè)時(shí)間關(guān)系比較操作宏。這里我們說(shuō)時(shí)刻a在時(shí)刻b之后,就意味著時(shí)間值a≥b。Linux強(qiáng)烈推薦用戶(hù)使用它所定義的下列4個(gè)時(shí)間比較操作宏(include/linux/timer.h):

#define time_after(a,b) ((long)(b) - (long)(a) &lt; 0) 
#define time_before(a,b) time_after(b,a) 
#define time_after_eq(a,b) ((long)(a) - (long)(b) &gt;= 0) 
#define time_before_eq(a,b) time_after_eq(b,a)

Linux 內(nèi)核時(shí)間相關(guān)轉(zhuǎn)換函數(shù)

1. unsigned long usecs_to_jiffies(const unsigned int u)

功能: 把微秒轉(zhuǎn)換成時(shí)鐘節(jié)拍
參數(shù): u 時(shí)間微秒
返回: 對(duì)應(yīng)的時(shí)鐘節(jié)拍數(shù)量

2. unsigned long msecs_to_jiffies(const unsigned int m)

功能: 把毫秒轉(zhuǎn)換成時(shí)鐘節(jié)拍
參數(shù): u 時(shí)間毫秒
返回: 對(duì)應(yīng)的時(shí)鐘節(jié)拍數(shù)量
示例: 要定時(shí)從現(xiàn)在開(kāi)始, 3 毫秒執(zhí)行一個(gè)函數(shù)
expires 設(shè)置為 jiffies+ msecs_to_jiffies(3)

Linux 內(nèi)核定時(shí)器操作相關(guān) API

  1. 靜態(tài)定義結(jié)構(gòu)體變量并且初始化(宏)
    DEFINE_TIMER(_name, _function, _expires, _data)

功能: 定義一個(gè)名字為_(kāi)name 的 struct timer_list 結(jié)構(gòu)的變量, 并且初始化它的 function, expires, data 成員

2. 定時(shí)器初始化(宏)

init_timer(timer)

功能: 只是對(duì) struct timer_list 結(jié)構(gòu)成員進(jìn)行一些基礎(chǔ)初始化操作, function, expires, data 成員還需要用戶(hù)自
己填充。

3.設(shè)置定時(shí)器(宏)

setup_timer(timer, fn, data)

功能: 設(shè)置定時(shí)器中的 function, data 和一些基礎(chǔ)成員, expires 并沒(méi)有初始化, 需要用戶(hù)自己進(jìn)行初始化

4. 注冊(cè)定時(shí)器到內(nèi)核

void add_timer(struct timer_list *timer)

功能: 向內(nèi)核注冊(cè)一個(gè)定時(shí)器, 注冊(cè)后會(huì)馬上開(kāi)始計(jì)時(shí)。

5.從內(nèi)核注銷(xiāo)定時(shí)器

int del_timer(struct timer_list * timer);

功能: 從內(nèi)核定時(shí)鏈表上刪除指定的定時(shí)器, 刪除后就不會(huì)再執(zhí)行綁定的函數(shù)

6. 修改定時(shí)器定時(shí)時(shí)間值, 并且重新注冊(cè)

int mod_timer(struct timer_list *timer, unsigned long expire0.s);

功能: 修改定時(shí)器定時(shí)時(shí)間值, 并且重新注冊(cè), 不管這個(gè)定時(shí)的超時(shí)函數(shù)是否執(zhí)行過(guò)。 執(zhí)行完成后會(huì)馬上啟
動(dòng)定時(shí)。

內(nèi)核定時(shí)器編程步驟

Step1 定義timer_list 結(jié)構(gòu)變量

Step2 定義超時(shí)函數(shù)

Step3 對(duì)timer_list結(jié)構(gòu)變量進(jìn)行初始化

Step4 注冊(cè)定時(shí)器,啟動(dòng)定時(shí)

Step5 注銷(xiāo)定時(shí)器

實(shí)驗(yàn)平臺(tái):芯靈思SinlinxA33開(kāi)發(fā)板

驅(qū)動(dòng)代碼:

#include <linux/module.h>
#include <linux/init.h>
#include <linux/timer.h>

//Step1 timer_list 結(jié)構(gòu)變量
struct timer_list timer;
//Step2 超時(shí)函數(shù)
void timer_fun(long data)
{
        printk("%s is call! data:%d\r\n",__FUNCTION__,data);//__FUNCTION__   獲取當(dāng)前函數(shù)名
        mod_timer(&timer, jiffies + HZ*1); //再次修改本定時(shí)器超時(shí)時(shí)間為當(dāng)前時(shí)間后1秒
}
static int __init timer_init(void)
{
        //Step3 對(duì)timer_list結(jié)構(gòu)變量進(jìn)行初始
        init_timer(&timer);
        setup_timer(&timer, timer_fun, 666);
        timer.expires = jiffies + HZ*2;
        //Step4 注冊(cè)定時(shí)器,啟動(dòng)定時(shí)
        add_timer(&timer); 
        printk("Timer start!\r\n");
        return 0;
}
static void __exit timer_exit(void) //Module exit function specified by module_exit()
{
        //Step5 注銷(xiāo)定時(shí)器
        del_timer_sync(&timer);
        printk("Timer over!\r\n");
}
module_init(timer_init);
module_exit(timer_exit);
MODULE_LICENSE("GPL");

Makefile代碼:

KERN_DIR = /work/lichee/linux-3.4
all:
        make -C $(KERN_DIR) M=`pwd` modules 
clean:
        make -C $(KERN_DIR) M=`pwd` modules clean
        rm -rf modules.order
obj-m        += timer_drv.o

嵌入式linux 開(kāi)發(fā)板交流 QQ:641395230

最后使用 dmseg 命令查看,可以看到每隔1秒打印一次

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

本文標(biāo)題:芯靈思SinlinxA33開(kāi)發(fā)板Linux內(nèi)核定時(shí)器編程
分享地址:http://jinyejixie.com/article20/ghhpco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器企業(yè)網(wǎng)站制作、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)網(wǎng)站營(yíng)銷(xiāo)、響應(yīng)式網(wǎng)站、全網(wǎng)營(yíng)銷(xiāo)推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開(kāi)發(fā)
江川县| 陕西省| 洛隆县| 密云县| 项城市| 延边| 南乐县| 东山县| 咸阳市| 开阳县| 铜川市| 拉孜县| 华阴市| 双流县| 平凉市| 沐川县| 河源市| 任丘市| 阿克陶县| 西乌| 汨罗市| 长宁区| 泽普县| 大新县| 通化市| 庄浪县| 新昌县| 陕西省| 崇义县| 鲁甸县| 嵊州市| 苍山县| 富川| 珲春市| 镇康县| 正蓝旗| 广水市| 宽城| 右玉县| 额尔古纳市| 平利县|