色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

學習筆記分享|使用C庫函數控制ELF 1開發板的LED

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

嵌入式Linux系統開發中,通過編程控制硬件資源是至關重要的技能之一,今天跟各位小伙伴分享一篇專注于介紹如何使用C庫函數控制ELF 1開發板LED的學習筆記。

希望通過這篇學習筆記,讓屏幕前的小伙伴能深入理解Linux內核對于底層硬件資源管理的抽象機制,為進行復雜的嵌入式系統開發奠定基礎。

一、系統調用與庫函數

(一)系統調用

系統調用(System Call)是操作系統內核提供的函數,在內核態運行(Kernel Mode),是操作系統為用戶提供的一些接口。它通過軟中斷向內核態發出一個明確的請求。有一些任務需要進程跑在內核態才能執行,比如和硬件打交道。所以進程調用系統調用就能讓自己運行在內核態從而執行這些類似的任務。系統調用實現了用戶態進程和硬件設備之間的大部分接口。

常見系統調用

Open, Close, Read, Write, Ioctl,Fork,Clone,Exit,Getpid,Access,Chdir,Chmod,Stat,Brk,Mmap等,需要包含Unistd.h等頭文件。

(二)庫函數

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

(三)區別

系統調用通常不可替換,而庫函數通常可替換
普通的庫函數調用由函數庫或用戶自己提供,因此庫函數是可以替換的。例如,對于存儲空間分配函數malloc,如果不習慣它的操作方式,我們完全可以定義自己的malloc函數。

系統調用通常提供最小接口,而庫函數通常提供較復雜功能

例如sbrk系統調用分配一塊空間給進程,而malloc則在用戶層次對這以空間進行管理。

系統調用運行在內核空間,而庫函數運行在用戶空間

因為系統調用屬于內核,和庫函數不屬于內核。因此,如果當用戶態進程調用一個系統調用時,CPU需要將其切換到內核態,并執行一個內核函數。

內核調用都返回一個整數值,而庫函數并非一定如此

在內核中,整數或0表示系統調用成功結束,而負數表示一個出錯條件。而出錯時,內核不會將其設置在errno,而是由庫函數從系統調用返回后對其進行設置或使用。

POSIX 標準針對庫函數而不是系統調用

判斷一個系統是否與POSIX需要看它是否提供一組合適的應用程序接口,而不管其對應的函數是如何實現的。因此從移值性來講,使用庫函數的移植性較系統調用更好。

系統調用運行時間屬于系統時間,庫函數運行時間屬于用戶時間

調用系統調用開銷相對庫函數來說更大

很多庫函數本身都調用了系統調用,這得益于雙緩沖的實現,在用戶態和內核態,都應用了緩沖技術,對于文件讀寫來說,調用庫函數,可以大大減少調用系統調用的次數。而用戶進程調用系統調用需要在用戶空間和內核空間進行上下文切換,開銷較大。如此以來,庫函數的開銷也就會比直接調用系統調用小了。另外一方面,庫函數同樣會對系統調用的性能進行優化。

二、使用C庫函數控制LED

(一)實驗代碼

參考3.2.1.2 文件 I/O 的方式控制 LED的例程將使用系統調用的部分改為使用庫函數來實現。代碼如下:

#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; }

(二)編譯、測試將代碼編譯后拷貝到ELF 1開發板進行測試。

wKgaomWp55GAfbdzAAA14UYzuQc929.png

執行LED2,查看結果

wKgaomWp55iARvKJAAAaYzoNUjQ024.png

可以看到LED按照預期循環點亮

wKgaomWp56SAAybXAA45QUwgv9E021.png

三、總結

本次實驗使用C庫函數實現了對LED的控制,通過一個簡單的示例來感受系統調用與庫函數的區別。但是代碼中還有需要注意的地方。

代碼中調用fwrite函數寫入內容時,它可能只是把內容保存到了C庫的緩沖區,并沒有執行真正的系統調用write函數把內容寫入到設備文件,這種情況下LED燈的狀態是不會被改變的,代碼中在fwrite函數后調用了fflush要求立刻把緩沖區的內容寫入到文件,確保 執行了相應的操作。在實驗時可以嘗試把代碼中的fflush都注釋掉,這種情況下有極大的幾率是無法正常改變LED燈狀態的。

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5086

    文章

    19143

    瀏覽量

    306044
  • C語言
    +關注

    關注

    180

    文章

    7608

    瀏覽量

    137084
  • 開發板
    +關注

    關注

    25

    文章

    5080

    瀏覽量

    97678
收藏 人收藏

    評論

    相關推薦

    學習筆記分享|ElfBoard開發板初識

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

    嵌入式學習-ElfBoard ELF 1板卡-使用C庫函數控制ELF1開發板LED

    來自共創官的學習筆記分享|使用C庫函數控制ELF1開發板L
    發表于 01-19 10:07

    I.MX6ULL-ElfBoard ELF1板卡- 使用C庫函數控制開發板LED

    來自共創官的學習筆記分享|使用C庫函數控制ELF1開發板L
    發表于 01-19 10:12

    嵌入式學習-ElfBoard ELF 1開發板-共創官學習筆記分享|將Go程序編譯到ELF 1開發板

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

    4412開發板學習筆記分

    4412開發板學習筆記
    發表于 02-05 07:40

    STM32F103學習筆記分

    藍橋杯嵌入式學習筆記|STM32F103學習筆記–寫在前沿:從準備藍橋杯嵌入式開始,一步一個腳印認真學習STM32
    發表于 12-24 07:08

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

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

    ELF 1開發板試用】板載資源測試1:點亮LED

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

    ALIENTEK MiniSTM32開發板例程-庫函數版本

    ALIENTEK MiniSTM32開發板例程-庫函數版本—1-27個實驗例程。
    發表于 07-25 17:45 ?0次下載

    ALIENTEK MiniSTM32開發板例程(庫函數版本)

    ALIENTEK MiniSTM32開發板例程(庫函數版本)_標準例程+擴展例程。
    發表于 07-25 17:45 ?0次下載

    STM32F107開發板學習筆記

    STM32F107開發板學習筆記
    發表于 10-27 09:16 ?52次下載
    STM32F107<b class='flag-5'>開發板</b>的<b class='flag-5'>學習</b><b class='flag-5'>筆記</b>

    Alientek MiniSTM32開發板例程庫函數版本資料合集免費下載

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

    STM32庫函數開發-GPIO

    2021-01-11 學習日志STM32f1庫函數開發學習實戰一 · I/O口1. 文件夾結構2
    發表于 01-13 16:17 ?14次下載
    STM32<b class='flag-5'>庫函數</b><b class='flag-5'>開發</b>-GPIO

    關于ELF1/ELF1S開發板的音頻接口,你需要知道的都在這!

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

    ELF 1技術貼|在NXP源碼基礎上適配ELF 1開發板LED功能

    LED適配為例,詳細說明整個適配過程。01準備工作NXP源碼路徑ELF1開發板資料包\07-NXP原廠資料\07-1NXP官方源碼\linux-imx-imx_4.1
    的頭像 發表于 12-29 10:04 ?873次閱讀
    <b class='flag-5'>ELF</b> <b class='flag-5'>1</b>技術貼|在NXP源碼基礎上適配<b class='flag-5'>ELF</b> <b class='flag-5'>1</b><b class='flag-5'>開發板</b>的<b class='flag-5'>LED</b>功能
    主站蜘蛛池模板: 欧美日韩在线成人看片a| 国产日韩欧美综合久久| 男人到天堂a线牛叉在线| 内射白嫩少妇超碰| 亚洲黄色大片| 国产精品欧美亚洲| 老师系列高H文| 亚洲裸舞 hd| 好紧好湿太硬了我太爽了文字| 美女教师朝桐光在线播放| 一道精品视频一区二区| 国色精品VA在线观看免费视频| 欧美午夜a级精美理论片| 91区国产福利在线观看午夜| 成人免费毛片观看| 轻轻cao| 伊人久99久女女视频精品免| 精品国产在线观看福利| 亚洲黄色在线观看| 黄片在线观看| 中文字幕一区二区三区在线播放| 啦啦啦 中文 日本 韩国 免费 | 中文字幕亚洲男人的天堂网络 | 果冻传媒在线观看资源七夕| 亚洲破处女| 麻豆官网入口| 成人免费毛片观看| 迅雷哥在线观看高清| bbw美女与zooxx| 肉蒲团从国内封禁到日本成经典| 国产精品久久久久影院免费| 亚洲精品在线看| 美国69xxxx59| 都市妖奇谈有声| 亚洲精品久久久无码一区二区| 久久久久久久久久毛片精品美女 | 免费人成视频X8X8国产更快乐| 办公室激情在线观看| 乌克兰内射私拍| 久久免费特黄毛片| 扒开老师大腿猛进AAA片软件|