OK6410系列之01 模組程式設計

2021-06-01 04:55:01 字數 2922 閱讀 5133

一、實驗環境

開發機環境

作業系統:ubuntu 9.10

交叉編譯環境:arm-linux-gcc 4.2.2 ,安裝位置 /usr/local/arm/4.3.2/

6410板子核心原始碼路徑:/work/linux-2.6.36.2-v1.05/     

目標板環境:ok6410-a     linux2.6.36

二、實驗原理

模組時在核心空間執行的,模組中不能使用glibc庫中的函式。

模組可以動態的裝載到核心中。

三、實驗步驟

注意:最好使用root使用者進行以下實驗,否則需要利用sudo

1、驗證交叉編譯工具配置正確。安裝交叉編譯器的步驟見《ok6410-a開發板linux2.6.36使用者手冊.pdf》5-5小節。

#arm-linux-gcc  -v

輸入命令後,如果顯示以上資訊,則表示開發環境正確。否則需要將arm-linux-gcc所在的路徑加入到path中。方法如下:

# vi /etc/profile

view plain

copy to clipboard

print?

path=/usr/local/arm/4.3.2/bin:$path  

export path  

輸入以下命令使配置生效。

#source  /etc/profile

2、編寫模組原始檔

#vi  test.c

view plain

copy to clipboard

print?

#include 

#include 

#include 

static int __init hello_init(void)  

static void __exit hello_exit(void)  

module_init(hello_init);  

module_exit(hello_exit);  

module_license("dual bsd/gpl");  

**解釋:

static int __init hello_init(void)

static void __exit hello_exit(void)

– static宣告,因為這種函式在特定檔案之外沒有其它意義

– __init標記

表明該函式只在初始化期間使用。

模組裝載後,將該函式占用的記憶體空間釋放

– __exit標記

該**僅用於模組解除安裝。

printk 核心函式,列印資訊,類似於使用者空間glibc庫中的printf,注意在核心中不能使用glibc庫中的函式。

module_init(hello_init);

module_exit(hello_exit);

–巨集:module_init/module_exit

–宣告模組初始化及清除函式所在的位置

–裝載和解除安裝模組時,核心可以自動找到相應的函式

3、編寫makefile檔案

#vi  makefile

view plain

copy to clipboard

print?

obj-m := test.o  

kdir :=/work/linux-2.6.36.2-v1.05/  

all:  

make -c $(kdir) m=$(shell pwd) modules  

clean:  

make -c $(kdir) m=$(shell pwd) clean  

注意:

4、編譯模組

在work/lab/test01/目錄下輸入make命令。

#make

成功後會生成 test.ko檔案。這個就是我們需要的模組檔案,其他的都是中間的臨時檔案。

檢視一下test.ko檔案資訊,可以看出是基於arm平台的目標檔案。

#file test.ko

可能出錯原因

注意:由於編譯模組時需要使用核心中的一些依賴檔案,因此需要確保在核心原始碼中那些檔案存在。

如果上面的編譯有錯誤,我們需要在核心原始碼根目錄下(/work/linux-2.6.36.2-v1.05/)執行以下命令

#make oldconfig && make prepare && make scripts

5、測試模組

在開發板上進行模組的裝載與解除安裝操作。

(1)裝載模組

# insmod  /lib/modules/2.6.36.2/test.ko

(2)檢視模組列表

#lsmod

(3)解除安裝模組

#rmmod test

執行結果如下圖:

總結

OK6410之開發環境的搭建

這幾天搭建ok6410開發環境可是耗費心智。在這裡我不得不說一下飛凌公司,有些東西不知他們有沒認真測試過,反正是問題一大堆,論壇上的回答大多有沒有建設性,我並不是想批評誰,只是希望你們能為我這樣的菜鳥稍微找一下想,方便大家,就是方便自己。希望貴公司能聽聽我的心聲。好有了支援tftp的uboot這下可...

OK6410之蜂鳴器buzzer字元驅動

夕陽的謝幕,隨之而出的明月,雖然剛剛回過家,但是還是想念,想念大海,想念媽媽燒的菜,也許真的是乙個人久了吧。雙休日,連個說話的人都沒有,只是自己乙個人,悶悶地看著書,寫著blog,天氣太熱,也懶得出去逛。收拾收拾心情,開始繼續ok6410吧。昨天把led燈實現了,今天就玩個蜂鳴器吧,然後那些小的,簡...

linux之GPIO的使用 OK6410

s3c6410的 gpio 引腳相對來說比較多,而且大部分引腳都具有多重複用功能,如何在 linux 上用最簡單的方式來控制 gpio 這需要我們好好研究一下底層的 了,其實方法有很多種,鑑於在作業系統端控制 gpio 並不像控制傳統的微控制器那樣。這裡我將提及一種方法來講述,這種方法也是我至今看到...