ARM-第七次

### ARM驱动

程序的分种

1.直接运行在硬件上:裸机程序
2.只能运行在对应的操作系统上:应用程序

操作系统

操作系统的定义

  • 给应用程序提供运行环境的裸机程序
  • 操作系统最底下是linux ,android是中间件,最上层是应用

操作系统的分类

1.任务管理(多任务支持)(最核心的模块)
2.内存管理(mm)
3.网络管理(net)
4.文件管理(fs)
5.设备驱动管理(drivers)
6.块设备(block)
7.对CPU体系的支持(arch)
8.启动管理(init)

操作系统的分时

1.分时:
2.实时:响应速度

  • 单内核:linux(某个代码出现问题,则操作系统程序就没法操作)
  • 微内核:windows(某个代码出现问题,并不会影响操作系统)

UNIX

UNIX家族OS的共同特点

1.很简洁,仅几百个系统调用
2.所有东西都被当做文件对待
3.C语言编写内核好喝系统软件工具,强大的移植力
4.高效地创建进程,独特的fork()
5.提供一套非常简单又很稳定的进程间通信元语
6.以文本形式存储配置数据

内核编程特点

1.无lib,无任何第三方库,不能包含任何第三方头文件
2.GNU C而非ANSI C
3.没有内存保护机制
4.不要轻易在内核中使福浮点数
5.容积小而固定的栈
6.同步和并发
7.可移植性的重要性

  • 注意点:异常服务程序不属于任何一个任务,不是任务所以没有任何一个状态.

算法的特征

1.可行性
2.有穷性

设备操作过程

1.设备管理(代码)
2.任务管理
3.文件管理
4.内存管理

进程与线程

睡眠(任务进行睡眠是为了等待资源的就绪)

  • 深度睡眠:只有任务就位才能唤醒
  • 浅度睡眠:当信号到来就能唤醒

僵尸进程

  • 一个进程fork了一个子进程,父进程结束了,就剩下了子进程,这样的子进程就是僵尸进程
  • 解决僵尸进程:一个进程fork一个子进程,子进程再fork一个孙子进程,将子进程结束,则孙子进程脱离父进程,成独立的进程.最后,孙子进程也称为孤儿进程,会被祖宗进程清理掉

内核线程

  • pid=0的进程相当于内核,pid=1的进程为祖宗进程

内核空间

1.内核独立于普通应用程序,它处于系统态
2.拥有受保护的内存空间和访问硬件设备的所有权限
3.这种处于系统态被保护起来的内存空间,统称为内核空间
4.如果想要使用,则必须要用接口将内存空间映射到用户空间下,才能使用,不能直接运用

处理器在任何指定时间点上的活动概况为如下:

1.运用于用户空间,执行用户进程(可睡眠)
2.运行于内核空间,处于用户进程上下文,代表每个特定的进程执行(可睡眠)
3.运行于内核空间,

Linux内核编码风格

1.接近K&RC风格(K和R这两个人创建了C语言)
2.缩进
3.switch与case同列
4.空格
(1)空格放在关键字周围
(2)函数名和圆括号之间无空格
(3)函数参数前后无空格
(4)char p,p1;//表示p与p1是char类型的
(5)char* p,p1;//表示p与p1都是char*类型的
5.花括号
(1)函数体采用同列
(2)右花括号可以不单独占一行,与后续关键字同行
6.命名规范

        (1)不允许驼峰命名法

7.函数
(1)函数代码长度不应该超过两屏
(2)局部变量不应该超过10个
(3)允许使用inline
8.注释
(1)应该描述代码要做什么和为什么要做

        (2)注释不应该包含谁写了哪个函数,

9.Typedef(给已有的数据类型起别名)
(1)内核开发者们强烈反对使用typedef
10.尽量多使用现成的东西,例如:链表
11.在源码中减少代码量
12.结构体初始化
(1)C99风格初始化
(2)
struct foo my_foo={ .a = INITIAL_A, .b =INITIAL_B

块设备

1.块设备:读数据是按照一块一块的读,一块是520k

字符设备的编写

1.进入linux-2.6.32.2/drivers/char
2.mini2440_hello_module.c复制成myhello.c
3.修改Kconfig文件,复制上一段程序,然后组修改

ARM-第七次_第1张图片
Paste_Image.png

4.修改Makefile文件,复制mini2440_hello_module那一行之后,进行修改

ARM-第七次_第2张图片
Paste_Image.png

5.然后保存退出
6.编译:make zImage
7.进入config界面:make menuconfig

  • 选择Device Drivers --->
ARM-第七次_第3张图片
Paste_Image.png
  • 选择Character devices
ARM-第七次_第4张图片
Paste_Image.png
  • 选择My module sample,按空格键将M改为*号
ARM-第七次_第5张图片
Paste_Image.png

内核设备的编写

1.在用户自己创建的目录下:创建一个hello.c与Makefile的文件
2.在hello.c中

#include 
#include 

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

  • 运行结果
ARM-第七次_第6张图片

3.代码升级,在hello.c中

#include 
#include 

//#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

  • 运行结果
ARM-第七次_第7张图片
Paste_Image.png
Paste_Image.png
  1. 再升级版,两个模块的,在hello.c中
#include 
#include 

//#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 
#include 

//#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

  • 运行结果
    1.先运行模块1
ARM-第七次_第8张图片
Paste_Image.png

2.再运行模块2


ARM-第七次_第9张图片
Paste_Image.png

你可能感兴趣的:(ARM-第七次)