ARM-第七次

### ARM驅(qū)動(dòng)

程序的分種

1.直接運(yùn)行在硬件上:裸機(jī)程序
2.只能運(yùn)行在對(duì)應(yīng)的操作系統(tǒng)上:應(yīng)用程序

操作系統(tǒng)

操作系統(tǒng)的定義

  • 給應(yīng)用程序提供運(yùn)行環(huán)境的裸機(jī)程序
  • 操作系統(tǒng)最底下是linux ,android是中間件,最上層是應(yīng)用

操作系統(tǒng)的分類(lèi)

1.任務(wù)管理(多任務(wù)支持)(最核心的模塊)
2.內(nèi)存管理(mm)
3.網(wǎng)絡(luò)管理(net)
4.文件管理(fs)
5.設(shè)備驅(qū)動(dòng)管理(drivers)
6.塊設(shè)備(block)
7.對(duì)CPU體系的支持(arch)
8.啟動(dòng)管理(init)

操作系統(tǒng)的分時(shí)

1.分時(shí):
2.實(shí)時(shí):響應(yīng)速度

  • 單內(nèi)核:linux(某個(gè)代碼出現(xiàn)問(wèn)題,則操作系統(tǒng)程序就沒(méi)法操作)
  • 微內(nèi)核:windows(某個(gè)代碼出現(xiàn)問(wèn)題,并不會(huì)影響操作系統(tǒng))

UNIX

UNIX家族OS的共同特點(diǎn)

1.很簡(jiǎn)潔,僅幾百個(gè)系統(tǒng)調(diào)用
2.所有東西都被當(dāng)做文件對(duì)待
3.C語(yǔ)言編寫(xiě)內(nèi)核好喝系統(tǒng)軟件工具,強(qiáng)大的移植力
4.高效地創(chuàng)建進(jìn)程,獨(dú)特的fork()
5.提供一套非常簡(jiǎn)單又很穩(wěn)定的進(jìn)程間通信元語(yǔ)
6.以文本形式存儲(chǔ)配置數(shù)據(jù)

內(nèi)核編程特點(diǎn)

1.無(wú)lib,無(wú)任何第三方庫(kù),不能包含任何第三方頭文件
2.GNU C而非ANSI C
3.沒(méi)有內(nèi)存保護(hù)機(jī)制
4.不要輕易在內(nèi)核中使福浮點(diǎn)數(shù)
5.容積小而固定的棧
6.同步和并發(fā)
7.可移植性的重要性

  • 注意點(diǎn):異常服務(wù)程序不屬于任何一個(gè)任務(wù),不是任務(wù)所以沒(méi)有任何一個(gè)狀態(tài).

算法的特征

1.可行性
2.有窮性

設(shè)備操作過(guò)程

1.設(shè)備管理(代碼)
2.任務(wù)管理
3.文件管理
4.內(nèi)存管理

進(jìn)程與線程

睡眠(任務(wù)進(jìn)行睡眠是為了等待資源的就緒)

  • 深度睡眠:只有任務(wù)就位才能喚醒
  • 淺度睡眠:當(dāng)信號(hào)到來(lái)就能喚醒

僵尸進(jìn)程

  • 一個(gè)進(jìn)程fork了一個(gè)子進(jìn)程,父進(jìn)程結(jié)束了,就剩下了子進(jìn)程,這樣的子進(jìn)程就是僵尸進(jìn)程
  • 解決僵尸進(jìn)程:一個(gè)進(jìn)程fork一個(gè)子進(jìn)程,子進(jìn)程再fork一個(gè)孫子進(jìn)程,將子進(jìn)程結(jié)束,則孫子進(jìn)程脫離父進(jìn)程,成獨(dú)立的進(jìn)程.最后,孫子進(jìn)程也稱(chēng)為孤兒進(jìn)程,會(huì)被祖宗進(jìn)程清理掉

內(nèi)核線程

  • pid=0的進(jìn)程相當(dāng)于內(nèi)核,pid=1的進(jìn)程為祖宗進(jìn)程

內(nèi)核空間

1.內(nèi)核獨(dú)立于普通應(yīng)用程序,它處于系統(tǒng)態(tài)
2.擁有受保護(hù)的內(nèi)存空間和訪問(wèn)硬件設(shè)備的所有權(quán)限
3.這種處于系統(tǒng)態(tài)被保護(hù)起來(lái)的內(nèi)存空間,統(tǒng)稱(chēng)為內(nèi)核空間
4.如果想要使用,則必須要用接口將內(nèi)存空間映射到用戶(hù)空間下,才能使用,不能直接運(yùn)用

處理器在任何指定時(shí)間點(diǎn)上的活動(dòng)概況為如下:

1.運(yùn)用于用戶(hù)空間,執(zhí)行用戶(hù)進(jìn)程(可睡眠)
2.運(yùn)行于內(nèi)核空間,處于用戶(hù)進(jìn)程上下文,代表每個(gè)特定的進(jìn)程執(zhí)行(可睡眠)
3.運(yùn)行于內(nèi)核空間,

Linux內(nèi)核編碼風(fēng)格

1.接近K&RC風(fēng)格(K和R這兩個(gè)人創(chuàng)建了C語(yǔ)言)
2.縮進(jìn)
3.switch與case同列
4.空格
(1)空格放在關(guān)鍵字周?chē)?br> (2)函數(shù)名和圓括號(hào)之間無(wú)空格
(3)函數(shù)參數(shù)前后無(wú)空格
(4)char p,p1;//表示p與p1是char類(lèi)型的
(5)char* p,p1;//表示p與p1都是char*類(lèi)型的
5.花括號(hào)
(1)函數(shù)體采用同列
(2)右花括號(hào)可以不單獨(dú)占一行,與后續(xù)關(guān)鍵字同行
6.命名規(guī)范

        (1)不允許駝峰命名法

7.函數(shù)
(1)函數(shù)代碼長(zhǎng)度不應(yīng)該超過(guò)兩屏
(2)局部變量不應(yīng)該超過(guò)10個(gè)
(3)允許使用inline
8.注釋
(1)應(yīng)該描述代碼要做什么和為什么要做

        (2)注釋不應(yīng)該包含誰(shuí)寫(xiě)了哪個(gè)函數(shù),

9.Typedef(給已有的數(shù)據(jù)類(lèi)型起別名)
(1)內(nèi)核開(kāi)發(fā)者們強(qiáng)烈反對(duì)使用typedef
10.盡量多使用現(xiàn)成的東西,例如:鏈表
11.在源碼中減少代碼量
12.結(jié)構(gòu)體初始化
(1)C99風(fēng)格初始化
(2)
struct foo my_foo={ .a = INITIAL_A, .b =INITIAL_B

塊設(shè)備

1.塊設(shè)備:讀數(shù)據(jù)是按照一塊一塊的讀,一塊是520k

字符設(shè)備的編寫(xiě)

1.進(jìn)入linux-2.6.32.2/drivers/char
2.mini2440_hello_module.c復(fù)制成myhello.c
3.修改Kconfig文件,復(fù)制上一段程序,然后組修改

Paste_Image.png

4.修改Makefile文件,復(fù)制mini2440_hello_module那一行之后,進(jìn)行修改

Paste_Image.png

5.然后保存退出
6.編譯:make zImage
7.進(jìn)入config界面:make menuconfig

  • 選擇Device Drivers --->
Paste_Image.png
  • 選擇Character devices
Paste_Image.png
  • 選擇My module sample,按空格鍵將M改為*號(hào)
Paste_Image.png

內(nèi)核設(shè)備的編寫(xiě)

1.在用戶(hù)自己創(chuàng)建的目錄下:創(chuàng)建一個(gè)hello.c與Makefile的文件
2.在hello.c中

#include <linux/kernel.h>
#include <linux/module.h>

static int __init mini2440_hello_module_init(void)
{
    printk("Hello,Min2440 module is installed !\n");
    return 0;
}
static void __exit mini2440_hello_module_cleanup(void)
{
    printk("Good_bye,mini2440 module was removed!\n");
}
module_init(mini2440_hello_module_init);
module_exit(mini2440_hello_module_cleanup);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Jiang xiu bi");
MODULE_DESCRIPTION("This is example module!!");
MODULE_VERSION("V1.0.0");

  • 在Makefile中
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /home/jxb/1612/1/sq1612/linux-2.6.32.2
PWD :=$(shell pwd)
modules:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.symvers *.order
.PHONLY:modules modules_install clean
else
obj-m :=hello.o
#obj-m :=hello2.o
endif

  • 運(yùn)行結(jié)果

3.代碼升級(jí),在hello.c中

#include <linux/kernel.h>
#include <linux/module.h>

//#define __init
//#define __exit
static int howmany=1;
static char * name="Jiang xiu bi";

static int __init mini2440_hello_module_init(void)
{
    printk("Hello,Min2440 module is installed !\n");
    printk("I am %s!\n",name);
    printk("I have %d mini2440 board!\n",howmany);
    return 0;
}
static void __exit mini2440_hello_module_cleanup(void)
{
    printk("Good_bye,mini2440 module was removed!\n");
}
module_init(mini2440_hello_module_init);
module_exit(mini2440_hello_module_cleanup);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Jiang xiu bi");
MODULE_DESCRIPTION("This is example module!!");
MODULE_VERSION("V1.0.0");

module_param(howmany,int,S_IRUGO);
module_param(name,charp,S_IRUGO);
EXPORT_SYMBOL(howmany);
EXPORT_SYMBOL(name);

  • 在Makefile中
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /home/jxb/1612/1/sq1612/linux-2.6.32.2
PWD :=$(shell pwd)
modules:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.symvers *.order
.PHONLY:modules modules_install clean
else
obj-m :=hello.o
#obj-m :=hello2.o
endif

  • 運(yùn)行結(jié)果
Paste_Image.png
Paste_Image.png
  1. 再升級(jí)版,兩個(gè)模塊的,在hello.c中
#include <linux/kernel.h>
#include <linux/module.h>

//#define __init
//#define __exit
static int howmany=1;
static char * name="Jiang xiu bi";

static int __init mini2440_hello_module_init(void)
{
    printk("Hello,Min2440 module is installed !\n");
    printk("I am %s!\n",name);
    printk("I have %d mini2440 board!\n",howmany);
    return 0;
}
static void __exit mini2440_hello_module_cleanup(void)
{
    printk("Good_bye,mini2440 module was removed!\n");
}
module_init(mini2440_hello_module_init);
module_exit(mini2440_hello_module_cleanup);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Jiang xiu bi");
MODULE_DESCRIPTION("This is example module!!");
MODULE_VERSION("V1.0.0");

module_param(howmany,int,S_IRUGO);
module_param(name,charp,S_IRUGO);
EXPORT_SYMBOL(howmany);
EXPORT_SYMBOL(name);

  • 在hello2.c中
#include <linux/kernel.h>
#include <linux/module.h>

//#define __init
//#define __
extern int howmany;
extern char * name;

static int __init mini2440_hello_module_init(void)
{
    printk("Hello,Min2440 module is installed !\n");
    printk("I am %s!\n",name);
    printk("I have %d mini2440 board!\n",howmany);
    return 0;
}
static void __exit mini2440_hello_module_cleanup(void)
{
    printk("Good_bye,mini2440 module was removed!\n");
}
module_init(mini2440_hello_module_init);
module_exit(mini2440_hello_module_cleanup);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Jiang xiu bi");
MODULE_DESCRIPTION("This is example module!!");
MODULE_VERSION("V1.0.0");

  • 在Makefile中
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /home/jxb/1612/1/sq1612/linux-2.6.32.2
PWD :=$(shell pwd)
modules:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.symvers *.order
.PHONLY:modules modules_install clean
else
obj-m :=hello.o
obj-m :=hello2.o
endif

  • 運(yùn)行結(jié)果
    1.先運(yùn)行模塊1
Paste_Image.png

2.再運(yùn)行模塊2


Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容