ARM驱动开发

  驱动

以来内核编译,依赖内核执行

 驱动可以同时执行多份代码

  没main

 驱动是依赖内核的框架和操作硬件的过程

一,Linux系统组成

app:                                                [0-3G]

---------------------------------系统调用(软中断)---------------------

kernel:                                         【3-4G】

5种功能:

进程管理:进程的创建、销毁、调度等功能

文件管理:通过文件系统ext2/ext3/ext4  yaff  jiffs等来组织管理文件

网络管理 :通过网络协议栈对数据进程封装和拆解的过程

内存管理 :通过内存管理器对用户空间和内核空间内存的申请和释放

设备管理:设备驱动的管理

字符设备驱动:

  1. 按照字节为单位进行访问,顺序访问
  2. 会创建设备文件,open read write close来访问

       块设备驱动:

  1. 按照块(512字节)(扇区)来访问,可以顺序访问,可以无序访问
  2. 会创建设备文件,open read write close来访问

       网卡设备驱动:按照网络数据包来收发的

二,宏内核、微内核

宏内核:将进程、网络、文件、设备、内存等功能集成到内核中 

优点:代码运行效率高 缺点:如果一个部分出错整个内核就崩溃了

eg: ubuntu Android

微内核:只将进程、内存机制集成到内核中,文件设备驱动等在操作系统之外运行

优点:稳定性强  缺点:效率低

eg:鸿蒙 window QNX

三,驱动模块

入口(安装):资源的申请

出口(卸载):资源的释放

许可证:GPL

#include 
#include                                                                           
static int __init  hello_init(void) 
//__init将hello_in it放到.init.text段中
{
	return 0;
} 
static void __exit hello_exit(void)
		//__exit将hello_exit放到.exit.text段中
{
}
module_init(hello_init);
//告诉内核驱动的入口地址
module_exit(hello_exit);
//告诉内核驱动的出口地址
MODULE_LICENSE("GPL");
//许可证

 

Makefile:

KERNELDIR:= /lib/modules/$(shell uname -r)/build/  

//内核的路径

#KERNELDIR:= /home/linux/kernel/kernel-3.4.39/

PWD:=$(shell pwd)

//驱动文件的路径

all:  //目标

make -C $(KERNELDIR) M=$(PWD) modules

//进入内核目录下执行make modules这条命令

//如果不指定 M=$(PWD) 会把内核目录中的.c文件编译生成.ko

//M=$(PWD) 向编译模块的路径

clean:

make -C $(KERNELDIR) M=$(PWD) clean

obj-m:=hello.o   //指定编译模块的名字

KERNELDIR:= /lib/modules/$(shell uname -r)/build/  
#KERNELDIR:= /home/linux/kernel/kernel-3.4.39/
PWD:=$(shell pwd)
all: 
make -C $(KERNELDIR) M=$(PWD) modules
clean:
make -C $(KERNELDIR) M=$(PWD) clean
obj-m:=hello.o 	

总结:

1、首先写个程序-》C语言程序-》.c

2、编译-》依靠内核编译( 开发板内核 和Ubuntu内核 (uname -r))

3、写Makefile-》找内核路径

4、当前文件的路径

5、all-》编译 make modules

  1. obj-m:=hello.o

四,内核的打印函数

printk(打印级别 “内容”)->和printf用法类似-》区别多了个打印级别

printk(KERN_ERR "yxc")

include/linux/printk.h

打印等级:

#define KERN_EMERG  "<0>"   /* system is unusable           */

#define KERN_ALERT  "<1>"   /* action must be taken immediately */

#define KERN_CRIT   "<2>"   /* critical conditions          */

#define KERN_ERR    "<3>"   /* error conditions         */

#define KERN_WARNING    "<4>"   /* warning conditions           */

#define KERN_NOTICE "<5>"   /* normal but significant condition */

#define KERN_INFO   "<6>"   /* informational            */

#define KERN_DEBUG  "<7>"   /* debug-level messages         */ 

0 ------ ------     7

最高的  最低的

 cat /proc/sys/kernel/printk(查看打印等级)

       4                        4                      1                  7

终端的级别     消息的默认级别   终端的最大级别  终端的最小级别

使用到的命令:

进入虚拟控制台  ctrl+alt+[F1-F6]

退出虚拟控制台  ctrl+alt+[F7]

sudo insmod hello.ko   安装驱动模块

sudo rmmod  hello      卸载驱动模块

lsmod                  查看模块  -》暂时没有使用

dmesg                  查看消息

sudo dmesg -C          直接清空消息不回显

sudo dmesg -c          回显后清空

驱动安装完成以后更改变量方法:

 lsmod查看驱动

找到路径:

/sys/module/驱动模块的名字/parameters$ 

/sys/module/hello/parameters$ 

进入su修改

su root

echo 123 > a

echo 10  > b

查看: cat a

你可能感兴趣的:(单片机和驱动开发,驱动开发,arm开发,开发语言,单片机,stm32)