Linux字元裝置知識點 嵌入式學習

2021-08-26 19:34:06 字數 3066 閱讀 4464

依舊不喜歡用作業本做嵌入式的學習筆記,倒是用電腦寫起來有點感覺。

1、cdev結構體

struct cdev

2、分配和釋放裝置號

int register_chrev_region(dev_t from, unsigned count, const char *name);   /*分配指定的裝置號*/

int alloc_chrdev_region(dev_t *dev,unsigned baseminor, unsigned count, const char *name); /*由系統分配乙個動態裝置號*/

void unregister_chrdev_region(dev_t from, unsigned count); /*釋放裝置號*/

3、 file_operations 結構體 cdev常用

struct file_operations

4、中斷遮蔽

local_irq_diable() /*遮蔽中斷*/

critical section /*臨界區*/

local_irq_enable() /*開中斷*/

由於linux的非同步i/o、程序排程等很多重要操作都依賴於中斷,中斷對於核心的執行非常重要,

在遮蔽中斷期間所有的中斷都無法得到處理,因此長時間遮蔽只能中斷是很危險的,這就要求遮蔽

了中斷之後,當前的核心執行路徑應當盡快地執行完臨界區的**。它適宜和自旋鎖聯合使用。

5、整型原子操作

void atomic_set(atomic_t *v, int i); /*設定原子變數的值為i*/

atomic_t v = aromic_init(0); /*定義原子變數v 並初始化為0*/

atomic_read(atomic_t *v); /*返回原子變數的值*/

void atomic_add(int i, atomic_t *v); //原子變數加i

void atomic_dec(int i, atomic_t *v); //原子變數減i

void atomic_inc(atomic_t *v); //原子變數增加1

void atomic_dec(atomic_t *v); //原子變數減少1

操作測試

int atomic_inc_and_test(atomic_t *v);

int atomic_dec_and_test(atomic_t *v);

int atomic_sub_and_test(int i, atomic_t *v);

6、位原子操作

void set_bit(nr, void *addr); //設定位

void clear_bit(nr, void *addr); //清除位

void change_bit(nv, void *addr); //改變位

test_bit(nr, void *addr); //測試位

7、自旋鎖 : 自旋鎖(spin lock)是一種典型的對臨界資源進行互斥訪問的手段。

spinlock_t lock;  //定義自旋鎖

spin_lock_init(lock); //初始化自旋鎖

spin_lock(lock); //獲得自旋鎖,能夠獲得鎖,則馬上返回,否則自旋等待持有者釋放鎖

spin_trylock(lock); // 獲得自旋鎖,能夠獲得鎖,返回為真,否則立即返回為假,不自旋等待

spin_unlock(lock) //釋放自旋鎖

/*自旋鎖一般使用方式*/

spinlock_t lock;

spin_lock_init(&lock);

spin_lock (&lock); /*獲取自旋鎖,保護臨界區*/

. . . . /*臨界區*/

spin_unlock (&lock); //解鎖

儘管用了自旋鎖可以保證臨界區不受別的cpu和本cpu內的搶占程序打擾,但是得到鎖的**路徑

在執行臨界區的時候,還可能收到中斷的底半部的影響。

1) 自旋鎖實際上是乙個忙等待

2)自旋鎖可能導致系統死鎖

3)自旋鎖鎖定器件不能呼叫可能引起程序排程的函式,如copy_from_user(), copy_to_user(), kmalloc(), msleep()等。

7.1、讀寫自旋鎖 : 自旋鎖的衍生鎖讀寫自旋鎖(rwlock)可允許讀的併發。

7.2、順序鎖 : 是對讀寫鎖的一種優化,讀執行單元絕對不會被寫執行單元阻塞。

7.3、讀-拷貝-更新 rcu (read copy update)

8、訊號量

struct semaphore sem;  //定義訊號量

void sema_init(struct semaphore *sem, int val); //初始化訊號量

void down(struct semaphore * sem); //獲得訊號量,會導致睡眠,因此不能在中斷上下文使用

int down_interruptible(struct semaphore *sem);//進入睡眠的程序可以被訊號打斷,而down()不會

int trylock(struct semaphore *sem); //嘗試獲得sem,如果獲得立刻返回0,否則返回非0,不導致睡眠,

可以在中斷的上下文使用

void up(struct semaphore * sem); //釋放訊號量

/*訊號量的一般使用*/

declare_mutex(mount_sem); //定義並初始化訊號量的巨集定義

down(&mount_sem); //獲取訊號量,保護臨界區

. . . .. .

critical section //臨界區

. . . . .

up(&mount_sem); //釋放訊號量

嵌入式Linux開發知識點

1.阻塞和非阻塞的區別 阻塞的定義 對於read,block指當串列埠輸入緩衝區沒有資料的時候,read函式將會阻塞在這裡,移植到串列埠輸入緩衝區中有資料可讀取,read讀到了需要的位元組數之後,返回值為讀到的位元組數 對於write,block指當串列埠輸出緩衝區滿,或剩下的空間小於將要寫入的位元...

嵌入式小知識點

1 stm32的boot0和boot1管腳 在每個stm32的晶元上都有兩個管腳boot0和boot1,這兩個管腳在晶元復位時的電平狀態決定了晶元復位後從哪個區域開始執行程式,見下表 boot1 x boot0 0 從使用者快閃儲存器啟動,這是正常的工作模式。boot1 0 boot0 1 從系統儲...

嵌入式開發必備知識點

一.c語言 結構體struct 聯合union 指標巨集定義 預編譯 動態記憶體分配 malloc和calloc函式申請記憶體空間 delete 記憶體洩漏 變數的生命週期 static關鍵字 函式指標 鍊錶 雙向鍊錶 佇列 fifo 樹二.51微控制器 定時器 計數器原理 什麼暫存器 外部中斷 串...