版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、S3C6410ARM程序(chngx)使用(shyng)物理地址操作寄存器Linux驅動(q dn)經(jīng)過MMU轉換后的虛擬地址調試手段:主要用串口打印調試手段:主要用printk輸入:在終端向串口輸入字符應用程序輸入:用write/read/ioctl內(nèi)核驅動的注冊/注第1頁/共35頁第一頁,共35頁。Gcc的用法(yn f)Andrew Huang 第2頁/共35頁第二頁,共35頁。宏里的# #表示(biosh)源碼里字符強制轉成字符串 int xy , #xy -xy#define PRINT_INT(e) printf(%s=%dn,#e,e) /# 表示(biosh)源碼里字符強制轉成
2、字符串void test_sharp() int x=3,y=4; PRINT_INT(100); PRINT_INT(100+200); PRINT_INT(x); PRINT_INT(x+y); PRINT_INT(x+y/100-20); 第3頁/共35頁第三頁,共35頁。宏里面(lmin)的# #用來(yn li)做符號表的鏈接,一般用來(yn li)在宏里動態(tài)定義變量和函數(shù)#define NEW_VAR(prex) int sym_#prexvoid test_2sharp() NEW_VAR(123); /int sym_123; NEW_VAR(abc); /int sym_ab
3、c; NEW_VAR(_89); / int sym_89; /NEW_VAR(123); /? sym_123 = 1000; PRINT_INT(sym_123); sym_abc = 2000; PRINT_INT(sym_abc); sym_89 = 3000; PRINT_INT(sym_89); 第4頁/共35頁第四頁,共35頁。標準(biozhn)C的結構初始化 缺點 1.中間錯一個,后面全錯 2.如果成員(chngyun)較多,必須全部初始化struct str char * var1; int var2; int var3;struct str mystr = 1000,15
4、00,2000; /標準(biozhn)C的結構初始化第5頁/共35頁第五頁,共35頁。GCC的結構(jigu)初始化 gcc可以(ky)使用 .成員名 = 值 來初始化. 優(yōu)點1,沒有前后順序 優(yōu)點2,不須要全部初始化const struct file_operations atalk_seq_arp_fops = .owner= THIS_MODULE,.open = aarp_seq_open,.read = seq_read,.llseek = seq_lseek,.release= seq_release_private,;第6頁/共35頁第六頁,共35頁。Gcc字節(jié)對齊(du q)
5、相關 在應用程序使用 _attribute_(packed) 取消字節(jié)對齊 = _attribute_(aligned(1);, 在內(nèi)核(ni h)里可以調整對齊字節(jié)數(shù) _attribute_(aligned(n);, n為2的次方數(shù),第7頁/共35頁第七頁,共35頁。struct str2 char b; int a;struct str3 char b; int a; _attribute_(packed); struct str4 char b; int a; _attribute_(aligned(2);第8頁/共35頁第八頁,共35頁。_section() _section(.ini
6、t.text)表示強制所放.init.text段而非缺省.text段當中(dngzhng) 以下把testSec函數(shù)鏈接到.init.text段中 可以readelf -a mymod.ko mymod.txtvoid _section(.init.text) testSec(void) printk(KERN_INFO this is %sn,_FUNCTION_); 第9頁/共35頁第九頁,共35頁。moduleAndrew Huang 第10頁/共35頁第十頁,共35頁。最簡單動態(tài)(dngti)模塊框架 只需要用 module_init()注冊(zhc)模塊初始化函數(shù) module_ex
7、it(),注冊(zhc)模塊注銷函數(shù)第11頁/共35頁第十一頁,共35頁。static int _init mymod_init(void) #定義模塊初始化函數(shù)return 0;static void _exit mymod_exit(void) # 定義模塊退出(tuch)函數(shù)return ;module_init(mymod_init);module_exit(mymod_exit);MODULE_LICENSE(LGPL); #linux 2.6后必須有,否則不編譯第12頁/共35頁第十二頁,共35頁。關于(guny)module_init/linux/init.h#ifndef MO
8、DULE /表示靜態(tài)(jngti)鏈接#define module_init(x)_initcall(x);#define module_exit(x)_exitcall(x);#else /如果是動態(tài)模塊 /* Each module must use one module_init(). */#define module_init(initfn)static inline initcall_t _inittest(void) return initfn; int init_module(void) _attribute_(alias(#initfn);/* This is only req
9、uired if you want to be unloadable. */#define module_exit(exitfn)static inline exitcall_t _exittest(void) return exitfn; void cleanup_module(void) _attribute_(alias(#exitfn);#endif第13頁/共35頁第十三頁,共35頁。獨立(dl)模塊Makefile# If KERNELRELEASE is defined, weve been invoked from the# kernel build system and ca
10、n use its language.ifneq ($(KERNELRELEASE),)obj-m := mymod.o # Otherwise we were called directly from the command# line; invoke the kernel build system.elseKERNELDIR ?= /home/hxy/ut6410/linux-2.6.28_smdk6410PWD := $(shell pwd) default:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesclean:rm -rf .*.cmd *.o *
11、.mod.c *.ko .tmp_versionsendif 組成(z chn)這個模塊的.o編譯(biny)目錄下內(nèi)核目錄第14頁/共35頁第十四頁,共35頁。模塊目錄make內(nèi)核目錄$(MAKE) -C $(KERNELDIR) M=$(PWD) modules$(CC)-o $(M)$(LD) -o $(M)obj-m :=xxxx第15頁/共35頁第十五頁,共35頁。$(MAKE) -C $(KERNELDIR) M=$(PWD) modules用make是使用內(nèi)核的Makefile,并且創(chuàng)建(chungjin)環(huán)境變量M,它的等于當前目錄,并第一個執(zhí)行modules這個規(guī)則第16頁/
12、共35頁第十六頁,共35頁。 在模塊(m kui)目錄下執(zhí)行makerootlocalhost 01# makemake -C /home/hxy/ut6410/linux-2.6.28_smdk6410 M=/home/hxy/ut6410/rootfs/test/01_mod/01 modulesmake1: Entering directory /home/hxy/ut6410/linux-2.6.28_smdk6410 CC M /home/hxy/ut6410/rootfs/test/01_mod/01/mymod.o Building modules, stage 2. MODPO
13、ST 1 modules CC /home/hxy/ut6410/rootfs/test/01_mod/01/mymod.mod.o LD M /home/hxy/ut6410/rootfs/test/01_mod/01/mymod.komake1: Leaving directory /home/hxy/ut6410/linux-2.6.28_smdk6410file mymod.komymod.ko: ELF 32-bit LSB relocatable, ARM, version 1 (SYSV), not stripped第17頁/共35頁第十七頁,共35頁。測試(csh)模塊root
14、urbetter 04# insmod mymod.kohello,this is my first driversizeof(struct str1)=8sizeof(struct str2)=5sizeof(struct str3)=16offsetof(struct str1,b)=4offsetof(struct str2,b)=1offsetof(struct str3,b)=4 this is testSecrooturbetter 04# rmmod mymodmymod exitrmmod: module mymod not foundrooturbetter 04#第18頁/
15、共35頁第十八頁,共35頁。不能移出模塊(m kui)的bug rmmod mymod rmmod: chdir(2.6.28.6): No such file or directory 錯誤原因(yunyn) rmmod會先要找目錄/lib/modules/. 其中是 uname -r 的值 所以解決辦法是在根文件系統(tǒng)建立這個目錄第19頁/共35頁第十九頁,共35頁。 這rmmod找不到,但是(dnsh)不影響rmmod,主要是rmmod在lib/modules/目錄下找不到對應.korooturbetter 04# rmmod mymodmymod exitrmmod: module my
16、mod not found第20頁/共35頁第二十頁,共35頁。增加(zngji)調試輸出 在內(nèi)核的輸出用不是printf,而是printk. printf使用標準C庫,讓代碼增加很多 printf在并發(fā)輸出容易發(fā)生混亂. printk沒有上述缺點,專門針對內(nèi)核優(yōu)化。 printk輸出一個內(nèi)存環(huán)形隊列(duli)。它可以由dmesg反復查看這個隊列(duli). dmesg 查看自啟動以來所有printk的信息 dmesg | tail #查看最后十行輸出第21頁/共35頁第二十一頁,共35頁。printk輸出(shch)格式 基本跟printf一樣,可以接可變參數(shù),但多一個輸出級別 prin
17、tk(hello);輸出級別為3的信息 printk(KERN_INFO Process accounting resumedn);/用宏輸出,增加(zngji)可讀性 printk(KERN_INFO Converted Value: %03dn, adc_value); printk(hellon); /表示用缺省級別第22頁/共35頁第二十二頁,共35頁。#defineKERN_EMERG/* system is unusable*/#define KERN_ALERT/* action must be taken immediately */#defineKERN_CRIT/* cri
18、tical conditions*/#defineKERN_ERR/* error conditions*/#define KERN_WARNING/* warning conditions*/#defineKERN_NOTICE/* normal but significant condition*/#defineKERN_INFO/* informational*/#define KERN_DEBUG/* debug-level messages*/第23頁/共35頁第二十三頁,共35頁。printk測試(csh)rooturbetter 02# insmod mymod.kohello,
19、this is my first driver,size 8rooturbetter 02# dmesg | tail bootserver=192.168.1.154, rootserver=192.168.1.154, rootpath=Looking up port of RPC 100003/2 on 192.168.1.154Looking up port of RPC 100005/1 on 192.168.1.154VFS: Mounted root (nfs filesystem).Freeing init memory: 148Kyaffs: dev is 32505859
20、name is mtdblock3yaffs: passed flags yaffs: Attempting MTD mount on 31.3, mtdblock3yaffs_read_super: isCheckpointed 0hello,this is my first driver,size 8第24頁/共35頁第二十四頁,共35頁。關于(guny)在驅動里的IO地址 ARM程序(chngx)一般用物理地址。 LINUX已經(jīng)打開MMU,所以必須要虛擬地址。 使用虛擬地址方法: 使用LINUX預先定義的好虛擬地址宏 #define S3C64XX_GPFCON(S3C64XX_GPF_
21、BASE + 0 x00) 使用ioremap臨時動態(tài)申請一個頁來映射第25頁/共35頁第二十五頁,共35頁。關I/O地址(dzh)讀寫 CPU關于I/O地址(外設寄存器)的訪問有兩種模式: 一種端口映射,以X86為代表,它的I/O地址與內(nèi)存是分離的,必須用專門(zhunmn)匯編來訪問 另外一種內(nèi)存映射,以ARM為代表,的I/O地址與內(nèi)存是統(tǒng)一編址.這種編程只需要用指針來操作.第26頁/共35頁第二十六頁,共35頁。Linux的I/O讀寫 它建議writel/readl/writew/readw/writeb/readw來操作I/O地址,這樣是可以多個(du )CPU下的移植的工作量最小。#
22、define readsb(p,d,l)_raw_readsb(_mem_pci(p),d,l)#define readsw(p,d,l)_raw_readsw(_mem_pci(p),d,l)#define readsl(p,d,l)_raw_readsl(_mem_pci(p),d,l)#define writeb(v,c)_raw_writeb(v,_mem_pci(c)#define writew(v,c)_raw_writew(_force _u16) cpu_to_le16(v),_mem_pci(c)#define writel(v,c)_raw_writel(_force _u32) cpu_to_le32(v),_mem_pci(c)第27頁/共35頁第二十七頁,共35頁。 *(volatile unsigned char *)(a) = (v) 1.為什么定義(dngy)unsigned ? 2. volatile是什么用處? 3. *(volatile unsigned char
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 非接觸性標測系統(tǒng)引導下的房顫射頻消融術
- 2025年苯噻草胺合作協(xié)議書
- 全日制研究生定向培養(yǎng)協(xié)議書(2篇)
- 管理體系工作參考計劃范文5篇
- 攤位租賃市場租賃協(xié)議
- 旅游接待用車租賃合同
- 財產(chǎn)租賃合同樣書
- 2025年機械自動采樣設備項目發(fā)展計劃
- 八年級語文上冊第五單元寫作說明事物要抓住特征教案新人教版1
- 2024年玉米種植、收購、加工一體化服務合同3篇
- 澳大利亞HIH保險公司破產(chǎn)案例
- 三級配電箱巡檢記錄
- 《全國統(tǒng)一安裝工程預算定額》工程量計算規(guī)則
- 試論plié的力量特征及其在芭蕾舞技術技巧中的運用
- 政府采購評審專家考試題庫與答案(完整版)
- 國內(nèi)省及地市級名稱及郵編
- 2023年上海市旅行社責任保險統(tǒng)保保險方案
- 2023-2024學年山東省威海市小學數(shù)學三年級下冊期末評估試卷
- GB/T 1096-2003普通型平鍵
- 新版2023設計收費標準
- GA/T 798-2008排油煙氣防火止回閥
評論
0/150
提交評論