娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

Linux驅(qū)動(dòng)之同步、互斥、阻塞的應(yīng)用

發(fā)布者:美好回憶最新更新時(shí)間:2024-08-20 來源: cnblogs關(guān)鍵字:Linux驅(qū)動(dòng)  同步  互斥  阻塞 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

    

    ret = copy_to_user(userbuf, &key_val, 1);

    ev_press = 0;//按鍵已經(jīng)處理可以繼續(xù)睡眠

    

    if(ret)

    {

        printk('copy errorn');

        return -1;

    }

    

    return 1;

}


static unsigned int sixth_drv_poll(struct file *file, poll_table *wait)

{

    unsigned int ret = 0;

    poll_wait(file, &button_waitq, wait);//將當(dāng)前進(jìn)程放到button_waitq列表


    if(ev_press)

        ret |=POLLIN;//說明有數(shù)據(jù)被取到了


    return ret;

}




static int sixth_drv_fasync(int fd, struct file * file, int on)

{

    int err;

    printk('fansync_helpern');

    err = fasync_helper(fd, file, on, &sixth_fasync);//初始化sixth_fasync

    if (err < 0)

        return err;

    return 0;

}



static struct file_operations sixth_drv_ops = 

{

    .owner   = THIS_MODULE,

    .open    =  sixth_drv_open,

    .read     = sixth_drv_read,

    .release = sixth_drv_close,

    .poll      =  sixth_drv_poll,

    .fasync   = sixth_drv_fasync,

    

};


static int sixth_drv_init(void)

{

    sixthmajor = register_chrdev(0, 'buttons', &sixth_drv_ops);//注冊(cè)驅(qū)動(dòng)程序


    if(sixthmajor < 0)

        printk('failes 1 buttons_drv registern');

    

    sixth_drv_class = class_create(THIS_MODULE, 'buttons');//創(chuàng)建類

    if(sixth_drv_class < 0)

        printk('failes 2 buttons_drv registern');

    sixth_drv_class_dev = class_device_create(sixth_drv_class, NULL, MKDEV(sixthmajor,0), NULL,'buttons');//創(chuàng)建設(shè)備節(jié)點(diǎn)

    if(sixth_drv_class_dev < 0)

        printk('failes 3 buttons_drv registern');


    

    gpfcon = ioremap(0x56000050, 16);//重映射

    gpfdat = gpfcon + 1;

    gpgcon = ioremap(0x56000060, 16);//重映射

    gpgdat = gpgcon + 1;


    printk('register buttons_drvn');

    return 0;

}


static void sixth_drv_exit(void)

{

    unregister_chrdev(sixthmajor,'buttons');


    class_device_unregister(sixth_drv_class_dev);

    class_destroy(sixth_drv_class);


    iounmap(gpfcon);

    iounmap(gpgcon);


    printk('unregister buttons_drvn');

}



module_init(sixth_drv_init);

module_exit(sixth_drv_exit);


MODULE_LICENSE('GPL');


接著改寫測(cè)試程序,測(cè)試加入阻塞方式打開文件,在fd = open(filename, O_RDWR|O_NONBLOCK)函數(shù)中加入O_NONBLOCK即可以按阻塞方式打開。


#include

#include

#include

#include

#include

#include


static int fd;


//static void fifth_testsignal(int signum)

//{

//    unsigned char key_val;

//    

//    printf('signal = %dn',signum);


//    read(fd, &key_val, 1);

//         printf('signumkey_val: 0x%xnn',key_val);

//}


/*

  *usage ./buttonstest

  */

int main(int argc, char **argv)

{

    char* filename='dev/buttons';

   int oflags,ret;

   unsigned char key_val;

    

    fd = open(filename, O_RDWR|O_NONBLOCK);//打開dev/firstdrv設(shè)備文件,非阻塞方式打開

    if (fd < 0)//小于0說明沒有成功

    {

        printf('error, can't open %sn', filename);

        return 0;

    }

    

    if(argc !=1)

    {

        printf('Usage : %s ',argv[0]);

     return 0;

    }

//    signal(SIGIO, fifth_testsignal);//注冊(cè)一個(gè)信號(hào),函數(shù)為fifth_testsignal

//    

//    fcntl(fd, F_SETOWN, getpid());  // 告訴內(nèi)核,發(fā)給誰

//    

//    oflags = fcntl(fd, F_GETFL); //取得當(dāng)前的狀態(tài)

//    

//    fcntl(fd, F_SETFL, oflags | FASYNC);  // 改變fasync標(biāo)記,最終會(huì)調(diào)用到驅(qū)動(dòng)的faync > fasync_helper:初始化/釋放fasync_struct

    

  while(1)

  {

       ret = read(fd, &key_val, 1);

         printf('ret = %d,key_val: 0x%xn',ret,key_val);

    sleep(5);

  }

    

   return 0;

}


將驅(qū)動(dòng)程序與測(cè)試程序編譯后運(yùn)行。發(fā)現(xiàn)以阻塞方式運(yùn)行的測(cè)試程序如果再次運(yùn)行會(huì)處于睡眠狀態(tài);如果以非阻塞方式再次運(yùn)行程序,會(huì)導(dǎo)致第二個(gè)程序退出。

 

以上只是記錄了怎么調(diào)用內(nèi)核函數(shù)來實(shí)現(xiàn)互斥、阻塞機(jī)制,具體原理還未分析,后面再分析。


[1] [2]
關(guān)鍵字:Linux驅(qū)動(dòng)  同步  互斥  阻塞 引用地址:Linux驅(qū)動(dòng)之同步、互斥、阻塞的應(yīng)用

上一篇:Linux驅(qū)動(dòng)之定時(shí)器在按鍵去抖中的應(yīng)用
下一篇:Linux驅(qū)動(dòng)之異步OR同步,阻塞OR非阻塞概念介紹

推薦閱讀最新更新時(shí)間:2025-05-09 18:30

Linux驅(qū)動(dòng)之USB總線驅(qū)動(dòng)程序框架簡(jiǎn)析
通用串行總線(USB)是主機(jī)和外圍設(shè)備之間的一種連接。USB總線規(guī)范有1.1版和2.0版,當(dāng)然現(xiàn)在已經(jīng)有了3.0版本。USB1.1支持兩種傳輸速度:低速為1.5Mbps,高速為12Mbps。USB2.0的傳輸速度可以高達(dá)480Mbps。USB2.0向下兼容USB1.1,可以將USB1.1的設(shè)備連接到USB2.0控制器上,也可以把USB2.0的設(shè)備連接到USB1.1控制器上。S3C2440的USB主機(jī)控制器支持USB1.1總線規(guī)范。 USB總線的拓?fù)浣Y(jié)構(gòu)如下圖所示:USB主機(jī)控制器(USB Host Controller)通過根集線器(Root Hub)與其他USB設(shè)備相連。集線器也屬于USB設(shè)備,通過它可以在一個(gè)USB接口上擴(kuò)展出
[單片機(jī)]
<font color='red'>Linux</font><font color='red'>驅(qū)動(dòng)</font>之USB總線<font color='red'>驅(qū)動(dòng)</font>程序框架簡(jiǎn)析
迅為4412開發(fā)板Linux驅(qū)動(dòng)教程之內(nèi)核開發(fā)基礎(chǔ)
主要內(nèi)容 ? Linux體系結(jié)構(gòu) ? Linux內(nèi)核結(jié)構(gòu) ? Linux內(nèi)核源碼目錄結(jié)構(gòu) Linux體系結(jié)構(gòu) 從上圖可知,Linux體系結(jié)構(gòu)由用戶空間和內(nèi)核空間構(gòu)成 ? 為什么Linux體系要分為用戶空間和內(nèi)核空間? ? 從程序員的角度分析 – 將linux底層和應(yīng)用分開,做應(yīng)用的做應(yīng)用,做底層的做底層,各干各的。 經(jīng)濟(jì)學(xué)的原理是,分工產(chǎn)生效率。 從安全性的角度分析,為了保護(hù)內(nèi)核。現(xiàn)代CPU通常都實(shí)現(xiàn)了不同的工作模式。以ARM為例:ARM實(shí)現(xiàn)了7種工作模式,不同模式下CPU可以執(zhí)行的指令或者訪問的寄存器不同: – (1)用戶模式usr (2)系統(tǒng)模式sys(3)管理模式svc(4)快速中斷fiq(5)外部中斷irq
[單片機(jī)]
迅為4412開發(fā)板<font color='red'>Linux</font><font color='red'>驅(qū)動(dòng)</font>教程之內(nèi)核開發(fā)基礎(chǔ)
ADI為Linux發(fā)行版擴(kuò)充1000多個(gè)器件驅(qū)動(dòng)
ADI為L(zhǎng)inux發(fā)行版擴(kuò)充1000多個(gè)器件驅(qū)動(dòng),支持高性能解決方案開發(fā) 中國(guó),北京—2021年12月1日—在Linux開源操作系統(tǒng)迎來30 周年之際,Analog Devices, Inc. (ADI)宣布擴(kuò)充其Linux發(fā)行版的器件驅(qū)動(dòng),讓Linux內(nèi)核能夠識(shí)別并支持1000多個(gè)ADI外設(shè)。這些開源器件驅(qū)動(dòng)為ADI客戶簡(jiǎn)化了軟件開發(fā)流程,提供了對(duì)經(jīng)過測(cè)試的高質(zhì)量軟件的訪問,從而支持快速開發(fā)嵌入式解決方案,為各行各業(yè)帶來創(chuàng)新解決方案,包括電信、工業(yè)、防務(wù)、航空航天、醫(yī)療、汽車、安全、物聯(lián)網(wǎng)(IoT)、消費(fèi)電子等行業(yè)。該產(chǎn)品組合包括Maxim Integrated Products, Inc.(現(xiàn)隸屬于ADI公司)的產(chǎn)品。
[嵌入式]
ADI為<font color='red'>Linux</font>發(fā)行版擴(kuò)充1000多個(gè)器件<font color='red'>驅(qū)動(dòng)</font>
基于ARM-LINUX的溫度傳感器驅(qū)動(dòng)(DS18B20)
DS18B20數(shù)字溫度傳感器接線方便,封裝成后可應(yīng)用于多種場(chǎng)合,如管道式,螺紋式,磁鐵吸附式,不銹鋼封裝式,型號(hào)多種多樣,有LTM8877,LTM8874等等。主要根據(jù)應(yīng)用場(chǎng)合的不同而改變其外觀。封裝后的DS18B20可用于電纜溝測(cè)溫,高爐水循環(huán)測(cè)溫,鍋爐測(cè)溫,機(jī)房測(cè)溫,農(nóng)業(yè)大棚測(cè)溫,潔凈室測(cè)溫,彈藥庫(kù)測(cè)溫等各種非極限溫度場(chǎng)合。耐磨耐碰,體積小,使用方便,封裝形式多樣,適用于各種狹小空間設(shè)備數(shù)字測(cè)溫和控制領(lǐng)域。 技術(shù)性能描述 1. 獨(dú)特的單線接口方式,DS18B20在與微處理器連接時(shí)僅需要一條口線即可實(shí)現(xiàn)微處理器與DS18B20的雙向通訊。 2. 測(cè)溫范圍 -55℃~+125℃,固有測(cè)溫分辨率0.5℃。 3. 支持
[單片機(jī)]
基于ARM-<font color='red'>LINUX</font>的溫度傳感器<font color='red'>驅(qū)動(dòng)</font>(DS18B20)
Linux中加入led驅(qū)動(dòng)及測(cè)試程序詳解
51單片機(jī)我們?cè)诖髮W(xué)都學(xué)過,51也是我們一個(gè)嵌入式接觸的第一個(gè)處理器,它的結(jié)構(gòu)不算復(fù)雜。我們學(xué)習(xí)51單片機(jī),我們可以清楚的說出51單片機(jī)中的資源,累加器A和B,程序狀態(tài)寄存器,程序計(jì)數(shù)器,6個(gè)中斷源,r0-r7工作寄存器等等,其實(shí)arm處理器也可以說是一個(gè)單片機(jī),只不過它的速度更快,寄存器更多了些,位數(shù)多了些(32位),分了幾種工作模式,指令多了些等等,不過只要我們有51的學(xué)習(xí)經(jīng)驗(yàn),學(xué)習(xí)arm并不是很困難的事情。 不過我們學(xué)習(xí)arm不能在像學(xué)習(xí)51單片機(jī)那樣,希望把所有的東西都知道,弄清楚里面的結(jié)構(gòu),這個(gè)是不可能的,也是完全沒有必要的。我們學(xué)習(xí)arm處理器要學(xué)習(xí)與應(yīng)用相關(guān)的部分。官方給出的芯片手冊(cè)是一個(gè)工具,而不是教材,我們沒有哪個(gè)
[單片機(jī)]
<font color='red'>Linux</font>中加入led<font color='red'>驅(qū)動(dòng)</font>及測(cè)試程序詳解
i.MX6ULL開發(fā)板線程同步POSIX無名信號(hào)量
為保證每個(gè)線程對(duì)同一資源訪問有效,比如一個(gè)線程想要從共享資源讀數(shù)據(jù),而這些資源正在被其他線程修改,那么讀出來的數(shù)據(jù)是無效的,那么就要想辦法讓其他線程修改完再去讀,這時(shí)候就用到了同步機(jī)制。可以使用 Linux 系統(tǒng)提供的機(jī)制來對(duì)線程訪問資源的順序進(jìn)行同步,本文檔挑選了信號(hào)量,互斥鎖,條件變量來介紹線程同步機(jī)制,實(shí)驗(yàn)代碼在sync/目錄下。 1 POSIX無名信號(hào)量 本章介紹POSIX 無名信號(hào)量,以下簡(jiǎn)稱信號(hào)量。信號(hào)量類似于計(jì)數(shù)器,操作方法和前面的System V 信號(hào)燈基本一樣。 使用信號(hào)量的步驟: 1.在程序全局區(qū)定義信號(hào)量; 2.使用seminit()初始化信號(hào)量; 3.使用sem_wait()和sem_post(
[單片機(jī)]
i.MX6ULL開發(fā)板線程<font color='red'>同步</font>POSIX無名信號(hào)量
多速率仿真、同步和異步、永磁同步電機(jī)控制器模型概述
多速率仿真 通常情況下,在Simulink環(huán)境下搭建的電力電子控制系統(tǒng)的仿真模型,都是多速率的仿真模型。這是因?yàn)椋? 01 電力電子控制系統(tǒng)中包含多種類型的模型,不同模型對(duì)于仿真速率的要求是不同的。 02 被控對(duì)象模型中的電氣部分,例如永磁同步電機(jī)、逆變器,都是希望仿真速率越快越好。具體選擇多快的仿真速率,與PWM的頻率,逆變器的死區(qū)時(shí)間,模型的解算方式等因素相關(guān)。對(duì)于10kHz開關(guān)頻率,仿真速率最好是開關(guān)頻率的100倍,因此為1MHz(仿真步長(zhǎng)1μs),但是如果死區(qū)時(shí)間為2μs,那么仿真步長(zhǎng)最好是死區(qū)時(shí)間的1/10(0.2μs),此時(shí)仿真速率就是5MHz。 03 被控對(duì)象模型中的機(jī)械部分,通常情況下仿真步長(zhǎng)為1ms(仿真速率1
[嵌入式]
多速率仿真、<font color='red'>同步</font>和異步、永磁<font color='red'>同步</font>電機(jī)控制器模型概述
基于GD32F407VET6主控芯片的永磁同步電機(jī)控制器設(shè)計(jì)
作品選用GD32F407VGT6單片機(jī)作為主控芯片,將永磁同步電機(jī)的無感控制技術(shù)與單電流傳感器控制技術(shù)兩個(gè)研究熱點(diǎn)相結(jié)合,利用單母線電流傳感器實(shí)現(xiàn)永磁同步電機(jī)全速范圍無位置傳感器控制,主要?jiǎng)?chuàng)新點(diǎn)有: 1)提出一種準(zhǔn)邊沿對(duì)齊脈寬調(diào)制技術(shù)和單母線電流分時(shí)采樣誤差補(bǔ)償方法,提高了單母線電流傳感器電流檢測(cè)精度; 2)提出單母線電流采樣下的基準(zhǔn)邊沿對(duì)齊脈寬調(diào)制技術(shù)的全速無位置傳感器控制策略,零低速采用高頻方波注入位置估計(jì),并結(jié)合模型參考自適應(yīng)觀測(cè)器,實(shí)現(xiàn)了高動(dòng)態(tài)性能、高穩(wěn)態(tài)精度的全速范圍無位置傳感器控制; 3)提出一種單母線電流采樣下的動(dòng)態(tài)零矢量注入初始位置估計(jì)方法,可以實(shí)現(xiàn)表貼式/內(nèi)嵌式兩類永磁同步電機(jī)的初始位置和轉(zhuǎn)速估計(jì),在電機(jī)具有大初
[嵌入式]
基于GD32F407VET6主控芯片的永磁<font color='red'>同步</font>電機(jī)控制器設(shè)計(jì)
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 屯门区| 太康县| 广南县| 武城县| 海丰县| 武定县| 青田县| 隆子县| 咸宁市| 额尔古纳市| 绥芬河市| 建水县| 彰化市| 浦东新区| 饶平县| 临泽县| 旅游| 吴江市| 竹溪县| 天峨县| 临潭县| 忻州市| 交口县| 岳西县| 吉安市| 谷城县| 隆回县| 犍为县| 宜宾市| 来宾市| 郎溪县| 佳木斯市| 健康| 库尔勒市| 治多县| 东乡族自治县| 紫云| 屏东县| 红安县| 兴隆县| 治多县|