【應用開發一】LED開發

文章目錄

  • 1應用層控制外設的兩種方式
  • 2 sysfs和/sys關系
  • 3 LED控制方式
    • 3.1 基本情況
    • 3.2 LED屬性文件介紹
    • 3.3 命令行屬性測試
    • 3.4 led程序
    • 3.5 開發板上測試

1應用層控制外設的兩種方式

  1. 使用設備文件控制
    在Linux系統下,一切皆是文件。應用層控制底層硬件同樣也是通過文件IO的方式。設備文件可以理解為硬件層向應用層提供的接口。應用層通過對設備文件IO的操作來操控硬件設備。設備文件通常在/dev/目錄下,所以/dev目錄下的文件成為設備節點。
  2. 使用sysfs文件系統
    還有一種方式是通過sysfs文件系統控制。sysfs文件系統是基于內存的文件系統,也是一種虛擬文件系統,他的作用是將內核信息已文件形式提供給應用層使用。他的主要功能是對系統設備進行管理,產生一個包含所有硬件層次的試圖。
    sysfs提供可一種機制,可以顯示的描述內核對象、對象屬性以及對象間關系,用來導出內核對象的數據、屬性到用戶空間,以文件目錄結構的形式為用戶空間提供對這些數據、屬性的訪問支持。內核對象、對象屬性以及對象間關系在用戶空間sysfs中的表現如下表:
    內核中的組成要素sysfs中的表現
    內核對象(硬件設備)目錄
    對象屬性(設備屬性)文件
    對象關系鏈接文件
  3. 總結
    應用層對底層硬件控制的兩種方式:
    • /dev/目錄下的設備文件(設備節點)
    • /sys/目錄下設備的屬性文件
      具體使用哪種方式需要根據不同功能類型設備進行選擇,有些設備只能通過設備節點進行操控,而有些文件只能通過sysfs方式進行操控。通常情況下,一般簡單的設備會是用sysfs方式操作,例如led、GPIO等。對于復雜的文件,例如LCD、觸摸屏、攝像頭等,需要使用設備節點操作。

2 sysfs和/sys關系

sysfs文件系統掛載在/sys 目錄下。sysfs文件系統中的目錄包括block、bus、dev、devices、firmware、fs、kernel、modules、power等,每個目錄下有許多文件或者子目錄,對于這些目錄的說’‘明如下所示(/sys目錄下內容):
在這里插入圖片描述

  1. devices
    系統中所有設備存放目錄,sysfs管理設備的最重要的目錄結構。
    在這里插入圖片描述

  2. block
    塊設備的存放目錄,過時的接口,該目錄下的文件通常是連接到’/sys/devices’目錄下的文件。
    在這里插入圖片描述

  3. bus
    所有設備按總線類型分類放置的目錄結構,'/sys/devices’目錄下的每種設備都是掛載在某種總線下的,例如i2c總線,同樣,該目錄下的文件也是鏈接到’sys/devices’目錄下的。
    在這里插入圖片描述

  4. class
    所有設備按照其功能分類放置的目錄結構,例如led設備。'/sys/class/input’目錄存放著所有輸入類設備。
    在這里插入圖片描述

  5. dev
    按照設備號的方式放置目錄結構,該目錄下有很多以主設備號:次設備號命令的文件,這些文件都是鏈接文件,連接到’/sys/devices’目錄下。
    在這里插入圖片描述

  6. firmware
    描述內核中的固件
    在這里插入圖片描述

  7. fs
    描述系統中所有文件系統,包括文件系統本身和按文件系統分類存放的已掛載點。
    在這里插入圖片描述

  8. kernel
    內核中所有的可調參的位置
    在這里插入圖片描述

  9. module
    系統中所有模塊信息
    在這里插入圖片描述

  10. power
    系統中電源選項,有一些屬性可以用于控制整個系統的電源狀態
    在這里插入圖片描述

系統中所有設備都會在/sys/devices中體現出來,是sysfs文件系統最重要的目錄結構。

3 LED控制方式

3.1 基本情況

硬件情況:使用底板上的DS0 led(用戶可以控制的唯一LED)
開發板啟動方式:emmc啟動
mmc中的系統:正點原子的系統
交叉編譯器:arm-linux-guneabihf-

控制方式:sysfs文件系統
控制目錄:/sys/class/led

3.2 LED屬性文件介紹

進入到/sys/class/led目錄下,該目錄中存放著所有的LED設備,目錄如下圖所示:
在這里插入圖片描述

可以看到該目錄中有一個sys-led的文件夾,這個就是底板上LED的設備文件,該目錄下文件如下圖所示:
在這里插入圖片描述

這里主要關注brightness、max_brightness以及trigger三個文件,這三個都是LED的屬性文件。

  • brightness:亮度
    可讀可寫,設置led的亮度等級,
    0:滅
    正整數:pwm控制的led:值越大,led越亮
    GPIO控制的led:亮
  • max_brightness:最大亮度等級
    只讀文件
  • trigger:觸發模式
    可讀可寫,設置當前LED觸發模式,讀表示獲取當前觸發模式,寫表示設置當前觸發模式。
    觸發模式:方括號[ ]括起來的表示當前觸發模式
    • none:無觸發
    • mmc0:對mmc0設備讀寫時led會閃爍
    • timer:有一定規律的亮滅,定時器控制
    • heartbeat:心跳呼吸模式

通常系統啟動之后,都會將板子上的一顆led設置為heartbeat觸發模式,表示系統正在正常運行。

3.3 命令行屬性測試

通過echo命令進行LED控制

echo timer > trigger		// 將led觸發模式設置為定時觸發
echo none > trigger			// 將led觸發模式設置為無觸發模式
echo 1 > brightness			// 點亮led

3.4 led程序

gitee:LED

#include "stdio.h"
#include "stdlib.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "unistd.h"
#include "string.h"#define LED_TRIGGER     "/sys/class/leds/sys-led/trigger"
#define LED_BRIGHTNESS  "/sys/class/leds/sys-led/brightness"#define USAGE()   fprintf(stderr, "usage:\n"  \"   %s<on|off>\n"   \"   %s<trigger><type>\n", argv[0],argv[0])int main(int argc, char *argv[])
{int fd_trigger, fd_brightness;/* 判斷輸入參數個數 */if( argc < 2 ) {USAGE();exit(-1);}/* 打開文件 */fd_trigger = open(LED_TRIGGER, O_RDWR);if (fd_trigger < 0 ) {perror("open trigger error");exit(-1);}fd_brightness = open(LED_BRIGHTNESS, O_RDWR);if (fd_brightness < 0 ) {perror("open brightness error");exit(-1);}/* 判斷輸入參數 */if ( !strcmp(argv[1],"on") ) {write(fd_trigger, "none", 4);write(fd_brightness, "1", 1);} else if ( !strcmp(argv[1], "off") ) {write(fd_trigger, "none", 4);write(fd_brightness, "0", 1);} else if ( !strcmp(argv[1], "trigger")) {if ( argc != 3 ) {USAGE();exit(-1);}if ( write(fd_trigger, argv[2], strlen(argv[2]) ) < 0 ) {perror("set trigger faile");}} else {USAGE();}close(fd_trigger);close(fd_brightness);exit(0);
}

因為是運行在I.MX6ULL平臺上,所以要是用交叉編譯器編譯,makefile文件內容如下:

TARGET ?= led				# 目標文件
CROSS_COMPILE ?= arm-linux-gnueabihf-		# 交叉編譯器CC = $(CROSS_COMPILE)gcc		
LD = $(CROSS_COMPILE)ld		src = led.c		# 源碼文件$(TARGET):$(src)$(CC) -o $@ $<.PHONY: clean			# 偽目標# 清除工程
clean:rm -rf *.o $(TARGET)

3.5 開發板上測試

將編譯好的二進制文件使用scp命令發送到開發板上。在開發板中執行下面命令,觀察led變化。二進制文件一定要有可執行權限。

./led on					// 亮
./led off					// 滅
./led trigger heartbeat 	// 呼吸模式	

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35048.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35048.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35048.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何在 Linux 上安裝 Docker Desktop

如何在 Linux 上安裝 Docker Desktop Docker 是一個用于開發、部署和運行應用程序的開放平臺。Docker Desktop 是 Docker 在 macOS 和 Windows 上的官方客戶端&#xff0c;現在也支持 Linux 系統。本文將詳細介紹如何在 Linux 上安裝 Docker Desktop。 系統要求 在開始安裝之…

第100+12步 ChatGPT學習:R實現KNN分類

基于R 4.2.2版本演示 一、寫在前面 有不少大佬問做機器學習分類能不能用R語言&#xff0c;不想學Python咯。 答曰&#xff1a;可&#xff01;用GPT或者Kimi轉一下就得了唄。 加上最近也沒啥內容寫了&#xff0c;就幫各位搬運一下吧。 二、R代碼實現KNN分類 &#xff08;1&a…

【Docker】Consul 和API

目錄 一、Consul 1. 拉取鏡像 2. 啟動第一個consul服務&#xff1a;consul1 3. 查看consul service1 的ip地址 4. 啟動第二個consul服務&#xff1a;consul2&#xff0c; 并加入consul1&#xff08;使用join命令&#xff09; 5. 啟動第三個consul服務&#xff1a;consul3&…

攻擊者開始使用 XLL 文件進行攻擊

近期&#xff0c;研究人員發現使用惡意 Microsoft Excel 加載項&#xff08;XLL&#xff09;文件發起攻擊的行動有所增加&#xff0c;這項技術的 MITRE ATT&CK 技術項編號為 T1137.006。 這些加載項都是為了使用戶能夠利用高性能函數&#xff0c;為 Excel 工作表提供 API …

【SQL Server數據庫】關系模式與關系代數

目錄 一、請用關系代數完成下列查詢 1. 求 供應工程J1 零件P1的供應商號碼SNO&#xff1b; 2. 求 供應工程J1 零件&#xff08;P&#xff09;為紅色 的供應商號碼SNO&#xff1b; 3. 求 沒有使用 天津供應商&#xff08;P&#xff09;生產的紅色零件&#xff08;S&#xff0…

【雜記-淺談OSPF協議之RouterDeadInterval死區間隔】

OSPF協議之RouterDeadInterval死區間隔 一、RouterDeadInterval概述二、設置RouterDeadInterval三、RouterDeadInterval的重要性 一、RouterDeadInterval概述 RouterDeadInterval&#xff0c;即路由器死區間隔&#xff0c;它涉及到路由器如何在廣播網絡上發現和維護鄰居關系。…

pycharm中的使用技巧

1、更改主題&#xff1a;找到設置&#xff0c;然后更改主題 點擊選擇自己喜歡的主題&#xff0c;然后就可以更改主題了 2、設置字體的快捷鍵 找到設置&#xff0c;如下&#xff1a; 找到increase&#xff0c;如下&#xff1a; 右鍵選擇&#xff0c;增加字體快捷鍵 按住ctrl滑輪…

Excel 查找后隱去右邊列

Excel 有幾列數字 ABC11002042002202100102326027010841199100512100100 當給定參數時&#xff0c;請從每行找到該參數&#xff0c;隱去右邊的列。如果某行不含該參數&#xff0c;則隱去整行。當參數是 100 時&#xff0c;結果如下&#xff1a; ABC710082021009119910010121…

shell之免交互

免交互 交互&#xff1a;發出指令控制指令的運行&#xff0c;程序再接收到指令的效果做出對應的反應。 免交互&#xff1a;間接的&#xff0c;通過第三方的方式把指令傳送給程序&#xff0c;不用直接的下達指令 Hhere Document 免交互 這是命令行格式&#xff0c;也可以寫在腳本…

QTableWidget的使用

使用QTableWidget&#xff0c;初始化數據、設置列頭及格式&#xff0c;設置行數&#xff0c;設置每個單元格的編輯&#xff0c;間隔行底色變換、行選擇 &#xff0c;模式&#xff0c;單元格選擇模式、插入行 、追加行、刪除行&#xff0c;單元格加圖標&#xff0c;單元格顯示ch…

Android Gradle開發與應用

Android Gradle 開發是指在 Android 應用開發中使用 Gradle 作為構建工具的過程。Gradle 是一個基于 Groovy 的自動化構建工具&#xff0c;它允許開發者定義靈活的構建邏輯&#xff0c;并且能夠很好地與 Android Studio 集成。以下是一些關于 Android Gradle 開發與應用的基本概…

替換特殊符號

content content.replaceAll("[\\x00-\\x09\\x11\\x12\\x14-\\x1F\\x7F]", ""); 打印特殊符號&#xff1a; String s new String( Character.toChars(0)); System.out.println((char)0); 2024-06-20 17:21:26.155 ERROR 5584 --- [6884333_inbound] c.…

好記性不如爛筆頭(三)——文件保存后打開呈現亂碼問題

現象 請隨博主進行下列操作&#xff0c;神奇的事情會發生—— 1、新建記事本&#xff0c;里面輸入“同”字&#xff0c;保存為ANSI格式 2、再次打開會發現&#xff0c;“同”已經變成了亂碼 3、類似的字還有很多&#xff0c;例如“同學”的“學”。而有些字則不會出現這種情況…

3_電機的發展及學習方法

一、電機組成及發展 1、什么是勵磁&#xff1f; 在電磁學中&#xff0c;勵磁是通過電流產生磁場的過程。 發電機或電動機由在磁場中旋轉的轉子組成。磁場可以由 永磁體或勵磁線圈產生。對于帶有勵磁線圈的機器&#xff0c;電流必須在線圈中流動才能產生&#xff08;激發&#x…

香港服務器托管對外貿行業必要性和優勢

在當今全球化的經濟環境下&#xff0c;外貿企業面臨著前所未有的機遇與挑戰。其中&#xff0c;服務器托管的選擇對于外貿企業的運營效率和市場拓展具有舉足輕重的作用。香港服務器&#xff0c;憑借其獨特的地理位置、優質的網絡環境和卓越的服務性能&#xff0c;一直是外貿企業…

“Hello, World” 的歷史

“Hello, World!” —— 初學者進入編程世界的第一步 由布萊恩柯林漢 撰寫的“Hello, world”程序 (1978年) 布萊恩W.克尼漢&#xff08;Brian W. Kernighan&#xff09;—— Unix 和 C 語言背后的巨人 布萊恩W.克尼漢 布萊恩W.克尼漢在 1942 年出生在加拿大多倫多&#xff…

OS中斷機制-嵌套和競爭

對于FreeRTOS最好不去用中斷嵌套,中斷嵌套會增加堆棧空間的使用,因為每個中斷服務程序都需要保存和恢復寄存器狀態,這可能會耗盡有限的堆棧空間,從而導致系統故障。以及中斷嵌套時,不同的中斷服務程序可能會競爭訪問共享資源,從而增加死鎖的風險。這可能會導致系統出現故…

Verilog進行結構描述(structural modeling)(一):基本概念

目錄 1.結構描述(structural modeling)的內容&#xff1a;2.實例 微信公眾號獲取更多FPGA相關源碼&#xff1a; 1.結構描述(structural modeling)的內容&#xff1a; 用門來描述器件的功能基于基本元件和底層模塊例化語句最接近實際的硬件結構主要使用元件的定義、使用聲明以…

Flink——最流批的大數據框架(流批一體)

Apache Flink基礎教程 資料來源&#xff1a;Apache Flink Tutorial (tutorialspoint.com) Apache Flink是Apache Hadoop的開源本地分析數據庫。它由Cloudera、MapR、Oracle和Amazon等供應商提供。本教程中提供的示例是使用Cloudera Apache Flink開發的。 本教程是為那些想要學…

fork 是一個創建新進程的系統調用

在計算機科學中&#xff0c;fork 是一個創建新進程的系統調用。具體來說&#xff0c;fork 調用會創建一個與當前進程幾乎完全相同的副本&#xff0c;包括父進程的內存布局、環境變量、打開的文件描述符等。這個新的進程被稱為子進程&#xff0c;而原始進程被稱為父進程。 以下…