持續更新中...
很多想從事嵌入式Linux開發的老鐵問一口君,有沒有快速提升自己程式設計水平的小例子?
一口君根據自己多年工作經驗,整理了一些基於Linux的c語言的非常實用的小例子,
這些例子在嵌入式開發工作中,或多或少都會用到。
看看你們會做多少?
一、基礎C語言
1. 排序演算法
給指定陣列排序,可以是任意一種排序演算法,比如氣泡排序
函式定義如下,
bubble_sort(char dest[],char src[],int len)
2. 將一個unsigned char array[]陣列元素實現bit位逆序
比如:array[0] = 0x17(0001 0111),轉換後array[0] = 0xe8(1110 1000)
函式定義如下:
int reverse(unsigned char dest[],unsigned char src[],int len)
3. 將一個unsigned int array[]陣列元素實現位元組序轉換
比如array[0] = 0x12345678 ,轉換後array[0] = 0x78563412
函式定義如下:
myhtol(int dest[],int src[],int len)
4. 將一個unsigned char array[]陣列,每一個位元組,轉換為二進位制,每一個bit佔一個位元組,將結果儲存到新的陣列中,同時也可以實現將這新的陣列還原
比如array[0] = 0x17 (0001 0111) array[1] = 0x32 (0011 0010)
新的陣列dest[0] ~dest15] 為 0 ,0,0,1,0,1,1,1, 0,0,1,1,1,0,0,1,0
函式定義如下:
位元組陣列轉為bit陣列
int Hex2bit(unsigned char dest[],unsigned char src[],int len)
返回值為新的bit陣列的有效元素個數
bit陣列還原為Byte陣列
int bit2Hex(unsigned char dest[],unsigned char src[],int len)
返回值為還原後的Byte陣列的有效元素個數
5. 幀格式轉換
將一個char陣列,所有的7e 轉成 7d 5e ,7d轉成7d 5d,並能還原
二、Linux系統程式設計
1. 檔案I/O(open、read、write、lseek)
1) 開啟一個檔案,如果不存在則建立
2)複製檔案為指定檔名
3)讀取指定檔案,每隔2個位元組,提取2個位元組,並將結果儲存到指定檔案
4)修改某個檔案指定行的內容,將當前日期更新到指定位置
#define VERSION "2024-6-21"
2. 串列埠
1)以制定的配置開啟指定串列埠,從串列埠讀取一定長度的資料,並將該資料直接從串列埠寫回
《【粉絲問答8】用C語言在Linux下實現CC2530上位機-1》
2)從串列埠資料中解析出有效資料(有點難)
假定需要從串列埠接收到的資料幀格式如下:
7e xx xx xx xx xx xx xx 7e
7e中間位有效資料區,要求能夠從串列埠資料中提取出有效資料
注意:從串列埠讀取的資料並不是規則的,7e可能在一組資料開頭、中間、結尾,並且一對7e可能不在同一次讀取到的幀資料中。
《7E頭解析的那些事兒(幀格式分析例項) 》
3. 程序
1)建立子程序,並分別在建立前後開啟同一個檔案,分析父子程序同時操作該檔案之間的影響。
2)編寫一個守護程序
3)透過管道(無名管道和有名管道),實現程序間通訊
4. 執行緒
1) 建立2個執行緒,一個執行緒向全域性陣列寫資料(陣列儘量大一些),一個執行緒列印該全域性陣列,分析結果
2)互斥鎖使用
建立2個執行緒,透過互斥鎖實現互斥訪問某個指定串列埠
3) 條件變數
建立2個執行緒,執行緒2的執行必須是執行緒1在完成某個動作之後(比如sleep5秒之後)才可以執行。
5. 訊號
給訊號SIGINT註冊指定回撥函式,
三、網路
1. 編寫1個C/S架構的udp/tcp併發伺服器
伺服器收到任意客戶端資料,都直接回傳給該客戶端
2. 基於socket(tcp/udp)實現網路檔案傳輸
3. 基於socket(tcp/udp)實現一個建議信令傳輸協議
typedef struct _protocol_s{
int cmd;
…………
char data[10];
}PROTOCOL_S;
4. 讀取當前系統所有網口的資訊(name、ip)
cat /proc/net/dev
5. 修改網路卡ip地址
不許用system()
四、驅動
1. 字元裝置
編寫一個最簡單的字元裝置驅動和應用程式,包含:read/write/ioctl,
《一文帶你掌握Linux字元裝置架構》
2. 透過等待佇列實現讀阻塞
《手把手教Linux驅動9-等待佇列waitq 》
3. 編寫一箇中斷處理函式,包含裝置樹
4. 實現1箇中斷底半部(workqueue)
5. 基於核心定時器timer_list,實現定時1s執行某個函式
《【粉絲問答20】核心定時器使用及其他時間操作》
6. 使用核心訊號量
五、工具篇
1. 版本管理
git
cmder
2. 安卓裝置
adb、scrcpy
《詳解如何將 Android 手機投屏在 Ubuntu 上》
3. 文字
source insight、vim、16進位制分析工具、beyond compare
4. 畫圖工具
viso、edraw、
5. 串列埠工具
xshell、secure CRT、XCOM
6. 網路
- 工具
wireshark,netassit,tcpdump
- 命令
iperf、ping、tftp、ftp、ifcpnfig、ipconfig
7. 檔案傳輸
- 通常開發板和windows傳輸檔案
tftp、adb、rz、sz
- windows之間傳輸檔案
飛秋、ftp、windows檔案共享
8. 音訊
aplay、arecord、ffplay
camera
v4l2-ctl、media-ctl -p、ffplay
9. i2c
i2cdetect、i2cdump、i2cget、i2cset、i2ctransfer
10. 儀器
邏輯分析儀、示波器、穩壓電源、頻譜儀、萬用表
電烙鐵