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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

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

3天內不再提示

介紹一個用C語言編寫的硬件外設訪問庫

strongerHuang ? 來源:老吳嵌入式 ? 2023-10-26 10:36 ? 次閱讀

轉自 | 老吳嵌入式

今天要介紹的開源軟件叫 c-periphery,一個用 C 語言編寫的硬件外設訪問庫。

我們可以用它來讀寫 Serial、SPI、I2C 等,非常適合在嵌入式產品上使用。

我們可以基于它優秀的代碼框架,不斷地擴展出更多的功能模塊,最終形成自己產品適用的 Linux 硬件抽象層。

源文件:

$tree.
├──src
│├──gpio.c
│├──gpio.h
│├──i2c.c
│├──i2c.h
│├──led.c
│├──led.h
│├──mmio.c
│├──mmio.h
│├──pwm.c
│├──pwm.h
│├──serial.c
│├──serial.h
│├──spi.c
│├──spi.h
│├──version.c
│└──version.h

約 4500 行代碼,每個硬件模塊的代碼都是相對獨立,上手難度小。

能收獲什么?
1、降低硬件編程的門檻;

2、了解 Linux 應用層如何訪問 GPIO / I2C / SPI / PWM 等硬件;

3、了解如何對硬件外設進行封裝,并提供良好的 API;

4、了解如何將代碼封裝成庫;

5、了解如何為代碼編寫單元測試程序;

c-periphery 很好地示范了如何在 Linux 平臺上進行硬件編程,定義出來的接口即豐富又實用。

另外,它最終輸出的是靜態庫 libperiphery.a,并且為每一個硬件模塊功能都編寫了單元測試代碼,代碼質量有保障。

c-periphery 的用法

簡單例子

我們以最常見的串口讀寫為例:

intmain(void)
{
serial_t*serial;
uint8_ts[]="HelloWorld!";
uint8_tbuf[128];
intret;

serial=serial_new();

/*Open/dev/ttyUSB0withbaudrate115200,anddefaultsof8N1,noflowcontrol*/
if(serial_open(serial,"/dev/ttyUSB0",115200)

serial_t 是對串口設備的抽象;

serial_new() 用于創建一個串口設備, 這里只是申請了數據,使用完畢后, 要通過 serial_free() 將其釋放掉。

serial_open() 用于初始化串口,設置設備節點、波特率等; 相應地,用 serial_close() 可以關閉串口。

serial_write() 用于給串口發數據,模仿了系統調用 write()。

serial_read() 用于從串口讀數據,比系統調用 read() 多了一個 timeout_ms 的參數,有了超時機制后,至少可以避免程序一直阻塞。

這就是一個最簡單的基于 c-periphery 的串口示例。即便是嵌入式初學者,基于這些接口,也能輕松地讀寫串口了。

另外,這里只用到了最常用的幾個 API。對于串口模塊,c-periphery 還有很多實用的 API:

4d3374ac-73a0-11ee-939d-92fbcf53809c.png


比較有意思的幾個 API:

serial_poll() 類似 select(),用于監控串口是否有數據,避免死等;

serial_get/set_xxx() 用于讀寫串口的屬性;

serial_fd() 用于獲取文件描述符,有了 fd 就意味這所有 Linux 應用編程的機制都可以使用了。例如我們可以將這個 fd 傳遞給 libev,然后就能進行事件驅動編程了。

c-periphery 的實現

關鍵數據

c-periphery 里對每個硬件模塊封裝的方法都是類似,用一個結構體來保存模塊所有相關的信息,看下面這幾個例子。

Serial:

4d393f36-73a0-11ee-939d-92fbcf53809c.png


I2C:

4d483b1c-73a0-11ee-939d-92fbcf53809c.png


GPIO:

4d599376-73a0-11ee-939d-92fbcf53809c.png


它們的成員變量大多都有文件描述符 fd、用于記錄錯誤狀態的 errno / error string,然后再加上一些硬件模塊特有的成員變量。

最終庫的調用者只會看到 serial_t、i2c_t、gpio_t 這種類似描述符的數據類型,使用時不需要關心內部細節。

后續我們要添加自己的硬件模塊時,可以依葫蘆畫瓢,模仿著定義出屬于該硬件的 xxx_t 結構體,然后一步步地為 c-periphery 擴展出新的功能模塊。

幾個關鍵 API 的實現

我們以 Serial 為例,看下其核心 API 的實現。


分配與釋放:

4d640e64-73a0-11ee-939d-92fbcf53809c.png

就是在申請分配和釋放 serial_t 的內存。


寫數據 serial_write() 就是調用 write(),讀數據 serial_read() 則是利用 select() 實現了超時的功能:

4d6e816e-73a0-11ee-939d-92fbcf53809c.png


serial_poll() 則是使用 poll() 來完成 io 監控。

4d860334-73a0-11ee-939d-92fbcf53809c.png

其他硬件模塊的實現都是類似的。

到此,c-periphery 的核心實現代碼就拆解完畢了。


為 c-periphery 添加新的硬件模塊
學以致用,我們按照 c-periphery 的框架,添加背光 Backlight 功能。

Backlight 的控制方法可以參考這篇文章:一個控制背光的命令行小工具。

先定義 backlight_t:

4d8a2324-73a0-11ee-939d-92fbcf53809c.png

然后再實現好下面這些 API:

4d901374-73a0-11ee-939d-92fbcf53809c.png

API 的具體實現代碼就不再這里展示了,因為控制背光無非就是讀寫 /sys/class/backlight/ 內的文件節點,難度不大。


總結

c-periphery 是一個 C 語言編寫的硬件訪問庫,已支持 Serial、I2C、SPI、MMIO、PWM、GPIO 等硬件。約 4500 行代碼,每個硬件模塊的代碼都是相對獨立,上手難度小,非常使用在嵌入式 Linux 平臺上使用。

另外,我們可以基于它優秀的代碼框架,不斷地擴展出自己需要的功能模塊,最終形成自己產品專用的 Linux 硬件抽象層,絕對的嵌入式開發的利器。

審核編輯:湯梓紅

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

    關注

    5133

    文章

    19498

    瀏覽量

    314163
  • Linux
    +關注

    關注

    87

    文章

    11443

    瀏覽量

    212610
  • SPI
    SPI
    +關注

    關注

    17

    文章

    1766

    瀏覽量

    94470
  • C語言
    +關注

    關注

    180

    文章

    7629

    瀏覽量

    140085
  • 開源
    +關注

    關注

    3

    文章

    3569

    瀏覽量

    43388

原文標題:嵌入式開發神器:硬件外設訪問庫

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

收藏 0人收藏

    評論

    相關推薦
    熱點推薦

    C語言實現圣誕樹!

    2022年12月25號就是圣誕節了!圣誕節當然要有圣誕樹了,今天給你們C語言編寫
    發表于 12-07 11:18 ?2007次閱讀

    C語言標準的基本使用

    寫出看起來專業的C代碼,除了規范的變量/函數命名,還需要熟練使用C語言的標準。當為了數組拷貝自己編寫
    發表于 09-14 14:04 ?883次閱讀

    STM32標準外設概述

    描述和應用實例,為開發者訪問底層硬件提供了中間API,通過使用固件函數,無需深入掌握底層硬件
    發表于 08-05 06:59

    STM32標準外設概述

    描述和應用實例,為開發者訪問底層硬件提供了中間API,通過使用固件函數,無需深入掌握底層硬件
    發表于 08-06 06:32

    C語言中使用嵌入式SQL訪問Oracle數據的方法

    (Oracle Call Interface簡稱OCI),通過調用系列OCI函數即可訪問數據。我在這里介紹的是前種方法。另外,在本文中
    發表于 12-15 06:35

    編寫C語言為基礎的DSP程序

    實驗2 : 編寫C 語言為基礎的DSP程序.實驗目的1.學習用標準
    發表于 03-17 00:13 ?3592次閱讀
    <b class='flag-5'>編寫</b><b class='flag-5'>一</b><b class='flag-5'>個</b>以<b class='flag-5'>C</b><b class='flag-5'>語言</b>為基礎的DSP程序

    C語言編寫程序實現通過按鍵使LED燈周期閃爍

    C語言編寫程序實現通過按鍵使LED燈周期閃爍。
    發表于 03-30 16:54 ?10次下載

    arduino什么語言編程

    Arduino使用C/C++編寫程序,雖然C++兼容C語言,但這是兩種
    發表于 11-08 15:21 ?7w次閱讀

    基于keil mdk 標準外設的軟件開發

    的性能特征。該函數還包括每一個外設的驅動描述和應用實例,為開發者訪問底層硬件提供了
    發表于 11-24 17:56 ?1303次閱讀
    基于keil mdk 標準<b class='flag-5'>外設</b><b class='flag-5'>庫</b>的軟件開發

    ASP訪問數據的幾種常見方式

    Connectivity (ODBC) 兼容的數據和 OLE DB 兼容的數據源。如果您是對數據連接有定了解的腳本
    發表于 03-26 14:46 ?4次下載

    STM32開發標準外設的詳細資料說明

    底層硬件提供了中間API,通過使用固件函數,無需深入掌握底層硬件細節,開發者就可以輕松應用每一個
    發表于 05-09 18:15 ?1次下載
    STM32開發標準<b class='flag-5'>外設</b><b class='flag-5'>庫</b>的詳細資料說明

    STM32F10x _硬件I2C讀寫EEPROM(標準外設版本)

    STM32F10x_硬件I2C讀寫EEPROM(標準外設版本)
    的頭像 發表于 03-25 11:11 ?1.1w次閱讀
    STM32F10x _<b class='flag-5'>硬件</b>I2<b class='flag-5'>C</b>讀寫EEPROM(標準<b class='flag-5'>外設</b><b class='flag-5'>庫</b>版本)

    CC++編寫環境下LabVIEW如何調用動態

    C語言編寫的動態鏈接相比,不同的地方在于extern int “C” __declspec(dllexport) add(int x,i
    發表于 06-11 09:15 ?8812次閱讀
    <b class='flag-5'>C</b>和<b class='flag-5'>C</b>++<b class='flag-5'>編寫</b>環境下LabVIEW如何調用動態<b class='flag-5'>庫</b>?

    c語言hello world程序編寫

    C語言種非常經典和常用的編程語言,而"Hello world"程序是每一個編程入門者的必修課。它是用來熟悉編程
    的頭像 發表于 11-26 09:23 ?3200次閱讀

    如何解決C語言中的“訪問權限沖突”異常?C語言引發異常原因分析

    些措施來解決和防止其發生。本文將詳細介紹C語言訪問權限沖突異常的原因以及解決方法。
    的頭像 發表于 01-12 16:03 ?6911次閱讀
    主站蜘蛛池模板: 久久视频精品38线视频在线观看 | 妻子+免费观看完整 | 亚洲精品成人 | 国模大胆一区二区三区 | 大学生第一次破女在线观看 | 午夜伦理电影在线观免费 | 国产欧美在线亚洲一区刘亦菲 | 男人团apk| 亚洲精品天堂在线 | 台湾佬休闲中性娱乐网 | 日韩一卡二卡三卡四卡免费观在线 | 日韩毛片大全 | ewp绞死vk失禁编 | 成年人视频免费在线播放 | 小萝ar视频网站 | 99热国产这里只有精品9九 | 91久久夜色精品 | 欧美视频毛片在线播放 | 999zyz色资源站在线观看 | 蜜桃久久久亚洲精品成人 | 后入内射国产一区二区 | 99精品福利视频 | 乌克兰16~18sex | 97免费视频在线观看 | 高H高肉强J短篇NP | 伊人久久综合影院 | 亚洲午夜福利未满十八勿进 | 女厕所边摸边吃奶边做爽视频 | 国产三级在线精品男人的天堂 | 俺来也俺去也视频久久 | 亚洲国产韩国欧美在线不卡 | 亚洲日韩一区精品射精 | 人妻天天爽夜夜爽三区麻豆A片 | 超碰国产人人做人人爽 | 久久这里都是精品 | 色综合久久网女同蕾丝边 | 日韩国产精品欧美一区二区 | 亚洲成在人线视频 | 高清 仑乱 一级 a | 欧美亚洲综合另类无码 | 成人人观看的免费毛片 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品