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文件,复制上一段程序,然后组修改

Paste_Image.png

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

Paste_Image.png

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

  • 选择Device Drivers --->
Paste_Image.png
  • 选择Character devices
Paste_Image.png
  • 选择My module sample,按空格键将M改为*号
Paste_Image.png

内核设备的编写

1.在用户自己创建的目录下:创建一个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

  • 运行结果

3.代码升级,在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

  • 运行结果
Paste_Image.png
Paste_Image.png
  1. 再升级版,两个模块的,在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

  • 运行结果
    1.先运行模块1
Paste_Image.png

2.再运行模块2


Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容