Linux kernel
在研究linux過程中,會常常看到變數或函式前會加上static進行修飾,然而什麼時候應該要用到static?
若想要變數或函式只能在一個.c檔內部使用,就可以在變數或函式前加上static,以防止外部程式碼修改之。
例:
test.c
static int i = 0;
static void function(int parameter){….}
相反地,若變數或函式需要到外部使用時,可在.h檔案裡加上extern。
例:
test.c
int i = 0;
void function(int parameter){….}
test.h
extern int i;
extern void function(int );
因為linux內核的程式龐大,對於C語言中的變數與函數都是所有人可以看見的,若在標頭檔.h宣告成extern則所有人皆可以訪問。因此,一旦變數或函數名稱相同,編譯器就會報錯。所以,若變數或函數不需被外部使用,建議皆加上static,限制其只能在.c檔內部裡被看見及使用。往後在宣告變數或函數名稱以及查找變數或函數被誰調用時也更佳容易,大幅降低各個程式相互影響。因此在寫驅動程序時,為了要符合驅動程序的模塊化設計思想,務必養成在變數及函式前加上static修飾的好習慣!
若在函數裡使用static定義變數,則該變數只在第一次進入函式時,賦予定義值,之後進入函式則不在賦予變數數值,且變數值會被保留。
void function(void)
{
static int i = 0;
printf("function execution time: %d\n", i++);
}
int main(void)
{
function();
function();
function();
return 0;
}
結果為
function execution time: 1
function execution time: 2
function execution time: 3
本文以Beaglebone版子為例,linux 4.19.142 系統移植請參閱 beaglebone black wireless開發板系統移植 spidev驅動、spidev_test測試,則可參閱如何使用linux內核提供SPI設備驅動Spidev 確定驅動檔案 為了找到內核與SPI相關的程式碼,利用以下步驟 1. 進入kernal資料夾,使用make menuconfig 選擇Device Drivers
Feb 9, 2021在單晶片中常常需要操作硬體寄存器,也就是對寄存器的地址進行讀取或寫入等操作,因此要如何定義已知寄存器的位址以方便程序員操作呢? 一般變數宣告 int a = 5; // 變數a會由編譯器自行產生地址,其內容為5 int *b; 若要指定指標的位置,則int *b = 0x20000000; 但此時編譯器會編譯錯誤,錯誤類型為型態錯誤。 因此需將整數強制轉成指標 int *b = (int *)0x20000000;
Feb 8, 2021Linux系統中有許多輸入設備:鍵盤、滑鼠、觸摸屏幕…等,而若是針對每一個輸入設備撰寫相對應的驅動程序,則應用層就必須知道每個設備節點的名稱,根據不同的設備開啟不同的設備節點,只要其中一個設備修改,就必須修改應用層,對整個系統產生不小的影響。 因此Linux系統發展出一套能夠兼容所有輸入設備的系統:輸入子系統(Input subsystem),將所有輸入設備進行統一管理,抽象出三部分:軟件處理、硬件處理、連接軟件與硬件處理。由此框架得知,若新增一輸入設備,程序員只需要根據輸入子系統的框架撰寫硬件處理驅動即可,應用程序仍可以依照輸入子系統定義的API去操作硬件。 Linux 4.19.x 內核解析 drivers/input/input.c: 1. 入口函數:input_init 2. 註冊 加載evdev.c時入口函數會註冊handler,加載gpio_keys.c入口函數會註冊device
Feb 7, 2021本文以Beaglebone版子為例,linux 4.19.142 系統移植請參閱 beaglebone black wireless開發板系統移植 Spidev驅動代碼移植 1. 檢查kernal是否有build spidev驅動 進入beaglebone版子kernal目錄 cd bb-kernal/KERNAL 選擇spidev驅動 make menuconfig
Feb 7, 2021or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up