Linux驱动开发 1 单片机和linux程序的分层

Linux驱动开发快速入门学习
学习笔记

单片机和linux程序的分层

main()
{
    //初始化所有的外围设备 flash接口 和 系统时钟
    //这些硬件初始化,很多硬件厂商都帮你做好了。
    //不关心
    
    while(1)
    {
        。。。
        //我们要做的事情:根据业务逻辑去操作硬件。
        //通过HAL 库或者直接通过寄存器去控制寄存器。
    }
}

库函数
GPIO_ReadPin(GPIO_TypeDef *GPIOx, unit16 GPIO_Pin)
端口中的那一个引脚
端口:GPIOA
引脚:PA1
端口和已经的关联
是单片机内部(CPU单元)和外部IO的接口组,比如说PA端口,有8个引脚,PA0~PA7。
这些函数是芯片公司帮你做好的。

你可以使用库,也可以直接使用寄存器。
实际上芯片公司提供的库函数也是使用寄存器。


单片机中没有分应用程序和驱动程序

对资深工程可能有意的让程序分为两部分
1.app   (和硬件无关,业务逻辑)
2.drvier(和硬件有关)

但是他们之间没有绝对的界限。
分成两层是因为你的水平比较高。


Linux


main 函数
{
    //无法直接读写寄存器 即使你知道寄存器的地址,也是无法直接去读
    //为了安全 为了系统更加健壮
    //要想使用硬件,必须使用驱动程序|
                                    |
}                                   |
-------------------------------------|-----------------
硬件的操作:和MCU 一样,都是通过读写寄存器来操作硬件

应用层和驱动层之间是有严格的分界的

应用层无法直接读写寄存器
只有驱动层可以读写寄存器

原因:应用层和驱动层的权限不一样

单片机:MCU
MPU:能跑Linux的芯片我们一般称为MPU
MPU有一个很大的特点:MMU (内存管理单元)

mcu 里面有CPU GPIO RAM
CPU可以发出
1.地址
2.数据
直接到达设备(GPIO RAM)
也就是可以直接访问硬件
截图一

Linux系统中完全不一样

同样是CPU GPIO RAM

CPU发出的地址,到MMU,这个地址想去控制GPIO,
MMU 会判断是应用程序(用户态)还是内核(内核态)

当发现是用户态的时候,MMU 不允许。
截图2

MMU 带来了权限管理
必须调用驱动程序去访问硬件

小插曲
linux 无法读写寄存器的疑问
应用层可以通过mmap函数来访问寄存器?
mmap就是内存映射的意思。
fd  = open("/dev/fb0"); //驱动程序
add = mmap(  ,fd);映射一段空间。
是通过驱动程序的。

回到主题


应用程序和驱动程序 之间怎么调用

打开一个文件就相当于打开一个驱动程序

Linux引入新的概念
open read write


open怎么调用到系统内核的代码?
linux中应用程序无法直接调用系统内核函数,
那么open函数如何调用内核函数(drv_open)?

中断就是一种异常,open的时候,会执行汇编指令触发异常。
CPU就会进入到 swi异常处理函数(内核提供的)

截图3

read write也是一样的。也swi 指令。
如何区分想要执行open read write?

在执行swi之前,还会设置一个寄存器。
让某个寄存器的值来区分。

截图4

应用程序通过标准接口open read write 访问驱动层程序
这些函数是由库(glibc)来实现。
1.设置某个寄存器
2.通过汇编指令触发异常
 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值