在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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 硬件抽象層,絕對的嵌入式開發的利器。

審核編輯:湯梓紅

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

    關注

    5122

    文章

    19423

    瀏覽量

    312759
  • Linux
    +關注

    關注

    87

    文章

    11414

    瀏覽量

    212248
  • SPI
    SPI
    +關注

    關注

    17

    文章

    1748

    瀏覽量

    93949
  • C語言
    +關注

    關注

    180

    文章

    7626

    瀏覽量

    139571
  • 開源
    +關注

    關注

    3

    文章

    3528

    瀏覽量

    43262

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

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

收藏 0人收藏

    評論

    相關推薦

    C語言實現圣誕樹!

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

    C語言標準的基本使用

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

    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 ?3575次閱讀
    <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 ?1288次閱讀
    基于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 ?8589次閱讀
    <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 ?3084次閱讀

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

    些措施來解決和防止其發生。本文將詳細介紹C語言訪問權限沖突異常的原因以及解決方法。
    的頭像 發表于 01-12 16:03 ?6757次閱讀
    主站蜘蛛池模板: 狼色视频在线观免费观看 | 成年女人在线观看 | 国产精品一级香蕉一区 | bt天堂网在线www资源 | 情久久| 停停五月天 | 国内一级野外a一级毛片 | 天天擦天天干 | 男女艹逼软件 | 伊人涩| 国产日本在线观看 | 俄罗斯一级特黄黄大片 | 国产精品成人一区二区 | 一级毛片免费全部播放完整 | 又黄又爽又猛大片录像 | 国产精品va在线观看不 | 久草资源网 | 午夜免费视频观看 | 国产在线视频www色 国产在线视频欧美亚综合 国产在线视频网站 | 靠比久久| 免费色片网站 | 久久99久久精品97久久综合 | 人人干干 | 日本人的色道免费网站 | 午夜免费影院 | 天天操夜夜添 | 色手机在线| 午夜视频免费 | www亚洲成人 | 色婷婷久久久swag精品 | 日韩毛片免费看 | 一国产大片在线观看 | 俺来色 | 台湾av | 国产亚洲美女精品久久久久狼 | 色噜噜狠狠狠狠色综合久 | 国产一区二区三区美女在线观看 | 天堂资源在线官网资源 | 亚欧洲乱码专区视频 | 国产精品亚洲四区在线观看 | 黄视频网站免费观看 |

    電子發燒友

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

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