女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

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

學(xué)習(xí)筆記分享|使用C庫(kù)函數(shù)控制ELF 1開發(fā)板的LED

ElfBoard ? 2024-01-19 11:12 ? 次閱讀
wKgaomWp5vyAZCKwAAUeBr-5VoU338.png(ELF1/ELF1S開發(fā)板及顯示屏)

嵌入式Linux系統(tǒng)開發(fā)中,通過編程控制硬件資源是至關(guān)重要的技能之一,今天跟各位小伙伴分享一篇專注于介紹如何使用C庫(kù)函數(shù)控制ELF 1開發(fā)板LED的學(xué)習(xí)筆記。

希望通過這篇學(xué)習(xí)筆記,讓屏幕前的小伙伴能深入理解Linux內(nèi)核對(duì)于底層硬件資源管理的抽象機(jī)制,為進(jìn)行復(fù)雜的嵌入式系統(tǒng)開發(fā)奠定基礎(chǔ)。

一、系統(tǒng)調(diào)用與庫(kù)函數(shù)

(一)系統(tǒng)調(diào)用

系統(tǒng)調(diào)用(System Call)是操作系統(tǒng)內(nèi)核提供的函數(shù),在內(nèi)核態(tài)運(yùn)行(Kernel Mode),是操作系統(tǒng)為用戶提供的一些接口。它通過軟中斷向內(nèi)核態(tài)發(fā)出一個(gè)明確的請(qǐng)求。有一些任務(wù)需要進(jìn)程跑在內(nèi)核態(tài)才能執(zhí)行,比如和硬件打交道。所以進(jìn)程調(diào)用系統(tǒng)調(diào)用就能讓自己運(yùn)行在內(nèi)核態(tài)從而執(zhí)行這些類似的任務(wù)。系統(tǒng)調(diào)用實(shí)現(xiàn)了用戶態(tài)進(jìn)程和硬件設(shè)備之間的大部分接口。

常見系統(tǒng)調(diào)用

Open, Close, Read, Write, Ioctl,F(xiàn)ork,Clone,Exit,Getpid,Access,Chdir,Chmod,Stat,Brk,Mmap等,需要包含Unistd.h等頭文件。

(二)庫(kù)函數(shù)

庫(kù)函數(shù)位于系統(tǒng)調(diào)用的上層,扮演著封裝和抽象的角色,運(yùn)行在用戶態(tài)(User Mode),旨在為程序員提供一種更為便捷的方式來調(diào)用真正實(shí)現(xiàn)底層功能的系統(tǒng)調(diào)用。這些庫(kù)函數(shù)充當(dāng)了用戶態(tài)服務(wù)的供給者,其功能實(shí)現(xiàn)機(jī)制各異:有的庫(kù)函數(shù)可能整合并包裝了一個(gè)或多個(gè)不同的系統(tǒng)調(diào)用,而有的庫(kù)函數(shù)則能夠直接在用戶態(tài)提供所需服務(wù),無需進(jìn)一步調(diào)用任何系統(tǒng)調(diào)用。

(三)區(qū)別

系統(tǒng)調(diào)用通常不可替換,而庫(kù)函數(shù)通常可替換
普通的庫(kù)函數(shù)調(diào)用由函數(shù)庫(kù)或用戶自己提供,因此庫(kù)函數(shù)是可以替換的。例如,對(duì)于存儲(chǔ)空間分配函數(shù)malloc,如果不習(xí)慣它的操作方式,我們完全可以定義自己的malloc函數(shù)。

系統(tǒng)調(diào)用通常提供最小接口,而庫(kù)函數(shù)通常提供較復(fù)雜功能

例如sbrk系統(tǒng)調(diào)用分配一塊空間給進(jìn)程,而malloc則在用戶層次對(duì)這以空間進(jìn)行管理。

系統(tǒng)調(diào)用運(yùn)行在內(nèi)核空間,而庫(kù)函數(shù)運(yùn)行在用戶空間

因?yàn)橄到y(tǒng)調(diào)用屬于內(nèi)核,和庫(kù)函數(shù)不屬于內(nèi)核。因此,如果當(dāng)用戶態(tài)進(jìn)程調(diào)用一個(gè)系統(tǒng)調(diào)用時(shí),CPU需要將其切換到內(nèi)核態(tài),并執(zhí)行一個(gè)內(nèi)核函數(shù)。

內(nèi)核調(diào)用都返回一個(gè)整數(shù)值,而庫(kù)函數(shù)并非一定如此

在內(nèi)核中,整數(shù)或0表示系統(tǒng)調(diào)用成功結(jié)束,而負(fù)數(shù)表示一個(gè)出錯(cuò)條件。而出錯(cuò)時(shí),內(nèi)核不會(huì)將其設(shè)置在errno,而是由庫(kù)函數(shù)從系統(tǒng)調(diào)用返回后對(duì)其進(jìn)行設(shè)置或使用。

POSIX 標(biāo)準(zhǔn)針對(duì)庫(kù)函數(shù)而不是系統(tǒng)調(diào)用

判斷一個(gè)系統(tǒng)是否與POSIX需要看它是否提供一組合適的應(yīng)用程序接口,而不管其對(duì)應(yīng)的函數(shù)是如何實(shí)現(xiàn)的。因此從移值性來講,使用庫(kù)函數(shù)的移植性較系統(tǒng)調(diào)用更好。

系統(tǒng)調(diào)用運(yùn)行時(shí)間屬于系統(tǒng)時(shí)間,庫(kù)函數(shù)運(yùn)行時(shí)間屬于用戶時(shí)間

調(diào)用系統(tǒng)調(diào)用開銷相對(duì)庫(kù)函數(shù)來說更大

很多庫(kù)函數(shù)本身都調(diào)用了系統(tǒng)調(diào)用,這得益于雙緩沖的實(shí)現(xiàn),在用戶態(tài)和內(nèi)核態(tài),都應(yīng)用了緩沖技術(shù),對(duì)于文件讀寫來說,調(diào)用庫(kù)函數(shù),可以大大減少調(diào)用系統(tǒng)調(diào)用的次數(shù)。而用戶進(jìn)程調(diào)用系統(tǒng)調(diào)用需要在用戶空間和內(nèi)核空間進(jìn)行上下文切換,開銷較大。如此以來,庫(kù)函數(shù)的開銷也就會(huì)比直接調(diào)用系統(tǒng)調(diào)用小了。另外一方面,庫(kù)函數(shù)同樣會(huì)對(duì)系統(tǒng)調(diào)用的性能進(jìn)行優(yōu)化。

二、使用C庫(kù)函數(shù)控制LED

(一)實(shí)驗(yàn)代碼

參考3.2.1.2 文件 I/O 的方式控制 LED的例程將使用系統(tǒng)調(diào)用的部分改為使用庫(kù)函數(shù)來實(shí)現(xiàn)。代碼如下:

#include #include #include #define LED1_BRIGHTNESS "/sys/class/leds/led1/brightness" #define LED2_BRIGHTNESS "/sys/class/leds/led2/brightness" #define LED3_BRIGHTNESS "/sys/class/leds/led3/brightness" int main() { FILE *fd1, *fd2, *fd3; fd1 = fopen(LED1_BRIGHTNESS, "w"); if(fd1 < 0) { printf("Fail to Open %s device\n", LED1_BRIGHTNESS); exit(1); } fd2 = fopen(LED2_BRIGHTNESS, "w"); if(fd2 < 0) { printf("Fail to Open %s device\n", LED2_BRIGHTNESS); exit(1); } fd3 = fopen(LED3_BRIGHTNESS, "w"); if(fd3 < 0) { printf("Fail to Open %s device\n", LED3_BRIGHTNESS); exit(1); } while(1) { fwrite("1",3,1,fd1); fflush(fd1); sleep(1); fwrite("0",1,1,fd1); fflush(fd1); fwrite("1",3,1,fd2); fflush(fd2); sleep(1); fwrite("0",1,1,fd2); fflush(fd2); fwrite("1",3,1,fd3); fflush(fd3); sleep(1); fwrite("0",1,1,fd3); fflush(fd3); } fclose(fd1); fclose(fd2); fclose(fd3); return 0; }

(二)編譯、測(cè)試將代碼編譯后拷貝到ELF 1開發(fā)板進(jìn)行測(cè)試。

wKgaomWp55GAfbdzAAA14UYzuQc929.png

執(zhí)行LED2,查看結(jié)果

wKgaomWp55iARvKJAAAaYzoNUjQ024.png

可以看到LED按照預(yù)期循環(huán)點(diǎn)亮

wKgaomWp56SAAybXAA45QUwgv9E021.png

三、總結(jié)

本次實(shí)驗(yàn)使用C庫(kù)函數(shù)實(shí)現(xiàn)了對(duì)LED的控制,通過一個(gè)簡(jiǎn)單的示例來感受系統(tǒng)調(diào)用與庫(kù)函數(shù)的區(qū)別。但是代碼中還有需要注意的地方。

代碼中調(diào)用fwrite函數(shù)寫入內(nèi)容時(shí),它可能只是把內(nèi)容保存到了C庫(kù)的緩沖區(qū),并沒有執(zhí)行真正的系統(tǒng)調(diào)用write函數(shù)把內(nèi)容寫入到設(shè)備文件,這種情況下LED燈的狀態(tài)是不會(huì)被改變的,代碼中在fwrite函數(shù)后調(diào)用了fflush要求立刻把緩沖區(qū)的內(nèi)容寫入到文件,確保 執(zhí)行了相應(yīng)的操作。在實(shí)驗(yàn)時(shí)可以嘗試把代碼中的fflush都注釋掉,這種情況下有極大的幾率是無法正常改變LED燈狀態(tài)的。

如果不考慮操作的時(shí)間開銷,其實(shí)控制硬件更推薦的做法是,每次控制LED燈都使用fopen—fwrite—fclose的流程,這樣就不需要考慮flseek、fflush的問題了,但最推薦的還是直接通過系統(tǒng)調(diào)用來控制硬件的方式。

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

    關(guān)注

    5141

    文章

    19537

    瀏覽量

    315140
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7630

    瀏覽量

    140453
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    5532

    瀏覽量

    102429
收藏 人收藏

    評(píng)論

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

    學(xué)習(xí)筆記分享|ElfBoard開發(fā)板初識(shí)

    大家分享一篇共創(chuàng)官學(xué)習(xí)筆記,共同見證攜手進(jìn)步的真實(shí)寫照: 最近很榮幸能夠參加保定飛凌嵌入式公司舉辦的Elfboard\"自創(chuàng)一派\" 共創(chuàng)社活動(dòng)。下圖是本次活動(dòng)采用的ElF 1
    發(fā)表于 01-04 10:22

    嵌入式學(xué)習(xí)-ElfBoard ELF 1板卡-使用C庫(kù)函數(shù)控制ELF1開發(fā)板LED

    來自共創(chuàng)官的學(xué)習(xí)筆記分享|使用C庫(kù)函數(shù)控制ELF1開發(fā)板L
    發(fā)表于 01-19 10:07

    I.MX6ULL-ElfBoard ELF1板卡- 使用C庫(kù)函數(shù)控制開發(fā)板LED

    來自共創(chuàng)官的學(xué)習(xí)筆記分享|使用C庫(kù)函數(shù)控制ELF1開發(fā)板L
    發(fā)表于 01-19 10:12

    嵌入式學(xué)習(xí)-ElfBoard ELF 1開發(fā)板-共創(chuàng)官學(xué)習(xí)筆記分享|將Go程序編譯到ELF 1開發(fā)板

    編譯并運(yùn)行在ELF 1開發(fā)板上的。 一、在GoLand中配置(一) 配置SSH連接Ubuntu虛擬機(jī)以及ELF 1
    發(fā)表于 02-21 10:22

    4412開發(fā)板學(xué)習(xí)筆記分

    4412開發(fā)板學(xué)習(xí)筆記
    發(fā)表于 02-05 07:40

    STM32F103學(xué)習(xí)筆記分

    藍(lán)橋杯嵌入式學(xué)習(xí)筆記|STM32F103學(xué)習(xí)筆記–寫在前沿:從準(zhǔn)備藍(lán)橋杯嵌入式開始,一步一個(gè)腳印認(rèn)真學(xué)習(xí)STM32
    發(fā)表于 12-24 07:08

    ELF 1開發(fā)板試用】+ RGB LED及按鍵的控制

    1開發(fā)板上,自然也不會(huì)少了它,其在開發(fā)板上的位置如圖1所示,共有3個(gè),其顏色分別為紅、綠、黃3個(gè)色彩。 圖1LED燈 3個(gè)
    發(fā)表于 11-21 11:11

    ELF 1開發(fā)板試用】板載資源測(cè)試1:點(diǎn)亮LED

    位置?如上圖打在左邊位置。2、USB Type-C線的另一端插入PC機(jī)/筆記本電腦USB口。在PC機(jī)/筆記本電腦設(shè)備管理器中查看端口號(hào)為COM3。3、將上圖開關(guān)撥到右邊,啟動(dòng)開發(fā)板。此
    發(fā)表于 12-13 23:01

    ALIENTEK MiniSTM32開發(fā)板例程-庫(kù)函數(shù)版本

    ALIENTEK MiniSTM32開發(fā)板例程-庫(kù)函數(shù)版本—1-27個(gè)實(shí)驗(yàn)例程。
    發(fā)表于 07-25 17:45 ?0次下載

    ALIENTEK MiniSTM32開發(fā)板例程(庫(kù)函數(shù)版本)

    ALIENTEK MiniSTM32開發(fā)板例程(庫(kù)函數(shù)版本)_標(biāo)準(zhǔn)例程+擴(kuò)展例程。
    發(fā)表于 07-25 17:45 ?0次下載

    STM32F107開發(fā)板學(xué)習(xí)筆記

    STM32F107開發(fā)板學(xué)習(xí)筆記
    發(fā)表于 10-27 09:16 ?52次下載
    STM32F107<b class='flag-5'>開發(fā)板</b>的<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>

    Alientek MiniSTM32開發(fā)板例程庫(kù)函數(shù)版本資料合集免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是Alientek Ministm32開發(fā)板例程庫(kù)函數(shù)版本資料合集免費(fèi)下載包括了:
    發(fā)表于 05-09 08:00 ?0次下載
    Alientek MiniSTM32<b class='flag-5'>開發(fā)板</b>例程<b class='flag-5'>庫(kù)函數(shù)</b>版本資料合集免費(fèi)下載

    STM32庫(kù)函數(shù)開發(fā)-GPIO

    2021-01-11 學(xué)習(xí)日志STM32f1庫(kù)函數(shù)開發(fā)學(xué)習(xí)實(shí)戰(zhàn)一 · I/O口1. 文件夾結(jié)構(gòu)2
    發(fā)表于 01-13 16:17 ?14次下載
    STM32<b class='flag-5'>庫(kù)函數(shù)</b><b class='flag-5'>開發(fā)</b>-GPIO

    關(guān)于ELF1/ELF1S開發(fā)板的音頻接口,你需要知道的都在這!

    音樂可以將平凡的畫面賦予深厚的意義,那么音頻接口就是這個(gè)支點(diǎn);今天就來給大家詳細(xì)介紹一下ELF1/ELF1S開發(fā)板的音頻接口。ELF1/ELF1
    的頭像 發(fā)表于 10-31 14:10 ?1003次閱讀
    關(guān)于<b class='flag-5'>ELF1</b>/<b class='flag-5'>ELF1</b>S<b class='flag-5'>開發(fā)板</b>的音頻接口,你需要知道的都在這!

    ELF 1技術(shù)貼|在NXP源碼基礎(chǔ)上適配ELF 1開發(fā)板LED功能

    LED適配為例,詳細(xì)說明整個(gè)適配過程。01準(zhǔn)備工作NXP源碼路徑ELF1開發(fā)板資料包\07-NXP原廠資料\07-1NXP官方源碼\linux-imx-imx_4.1
    的頭像 發(fā)表于 12-29 10:04 ?1134次閱讀
    <b class='flag-5'>ELF</b> <b class='flag-5'>1</b>技術(shù)貼|在NXP源碼基礎(chǔ)上適配<b class='flag-5'>ELF</b> <b class='flag-5'>1</b><b class='flag-5'>開發(fā)板</b>的<b class='flag-5'>LED</b>功能