驱动开发(一)——(单片机程序、Linux应用程序与驱动程序分析)


前言

学习资料,跟的韦东山老师的视频,大家可以上百问网下载资料
百问网

我使用的开发板是STM32MP157,关于157的开发板资料大家也可以在百问网进行下载。

157准备工作

配置交叉编译链

将文件拷贝到虚拟机指定目录,进行解压
在这里插入图片描述配置交叉编译脚本, toolchain.sh

#!/bin/bash
ARCH=arm
CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
PATH=/home/jacky/100ask_STM32MP157/Toolchain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin:$PATH

在这里插入图片描述验证编译链
在这里插入图片描述

编译内核

拷贝到指定目录后,进行解压tar -zxvf Linux-5.4.tar.gz
在这里插入图片描述配置文件在 arch/arm/configs目录下
设置配置文件:make 100ask_stm32mp157_pro_defconfig
在这里插入图片描述

编译uImage : make uImage LOADADDR=0xC2000040 -j4
在这里插入图片描述

编译设备树: make dtbs
在这里插入图片描述

编译内核: make modules -j4
在这里插入图片描述

安装内核模块到指定目录:make ARCH=arm INSTALL_MOD_PATH=/home/jacky\ /nfs_rootfs modules_install

在这里插入图片描述

删除链接目录,节约开发板空间: rm -rf source build
在这里插入图片描述更新开发板系统
nfs挂载:mount -t nfs -o nolock,vers=3 192.168.1.100:/home/book/nfs_rootfs /mnt
拷贝uImage: cp /mnt/zImage /boot
拷贝设备树:cp /mnt/*.dtb /boot
拷贝内核: cp /mnt/lib/modules /lib -rfd

编译解压glibc

官网
将源文件拷贝到指定目录,然后进行解压
tar -xvf glibc-2.34.tar.xz
在这里插入图片描述
注意:如果有查看源码需求的朋友,可以直接下载到Windows上用Source insight查看即可

单片机程序

相信学过单片机的同学,对单片的最直观了解就是总是在和寄存器(硬件)打交道

在我们编写单片机程序时,无论是简单的点灯,还是后面的控制模块,控制器等,其本质依旧是对寄存器值进行设置(或配置)。因此,我们的程序总是处于一种直接操作硬件的感觉

虽然在单片机高级编程中,我们提倡将应用程序与硬件程序进行分离,即当我们实现一个按键点灯的功能时,将应用逻辑封装为 key_is_down()函数和led_on()函数,这样的目的就是提高了代码的阅读性。但是我们脱离不了要在本文件中去实现key_is_down()和led_on()两个函数,无论是通过中断的方式,还是轮询去读取对应引脚寄存器的值,或者点灯去设置寄存器的值,依旧无法脱离要去直接操作寄存器的本质。

这就是单片机程序最直观的特点。

应用程序

对于应用程序,相信大家肯定对C语言是非常熟悉的。
那么何为应用程序呢?
举个最简单的例子,读取磁盘中的文件内容,并打印出来

char buffer[1024];
int fd=open("/xxx/xxx",O_RDWR);
if(fd<0){
	goto failed;
}
bzero(buffer,1024);
int ret=read(fd,buffer,1023);
if(ret<0){
	goto failed;
}
fprintf(stdout,"%s\n",buffer);
return 0;

这是一个非常简单的应用程序,我们打开一个文件,然后读取其内容,
在这个过程中,我们只需要在意的是我们应该打开那个文件,打开以后,将读取的内容存放到我们申请的内存空间,然后进行打印,即实现了我们的应用需求,但是至始至终,我们并不知道,我们如何操作磁盘的?磁盘上的内容如何传递给我们的?似乎我们从来都无法直接去操作寄存器或硬件?

没错,这正是在操作系统上做应用程序最显著的特点之一,我们不会去关注硬件是怎么搞的,我们更在意的是我们的应用功能需求是否实现。

那么为什么不让应用程序去操作硬件呢?
原因很简单,那我们还学什么驱动。开个玩笑!
原因是为了防止一些应用程序,出现不合乎规矩的逻辑,如果直接操作硬件会导致我们的硬件损坏或工作异常。比如,当我们在实现一个启动风扇转动的功能程序时,如果我们的应用程序可以直接操作硬件,岂不是我可以让风扇先顺时针转,然后立马逆时针转。可是一旦如此操作,风扇岂不是被你玩坏了。而我们写了驱动程序后,由驱动工程师涉及好了操作该硬件的方法后,我们的应用程序必须在驱动程序限制的范围内进行操作,比如,我的驱动程序设定了,必须在风扇停下来后才能修改旋转方向,这样不就可以保证风扇的正常运转了。这也就是实现应用与驱动分离的主要原因之一,还有一个原因就是,我觉得如果没有驱动,我们的应用程序岂不是会很冗余,很庞大,大家写的应用程序都要去先配置对应硬件的寄存器,那不是烦死了

因此,Linux应用程序最显著的特点就是,我不关心硬件,不关心寄存器如何配置,不关心底层原理图,不关心那个寄存器对应的物理地址,让写驱动的大佬们去弄吧。我只关心我拿到我的数据没,但是我需要在驱动程序的限定下完成我的应用功能需求。

驱动程序

对比了上面的单片机程序和应用程序,相应大家对驱动程序其作用已经有了初步的认识。
我们继续上面的功能,打开一个文件,并读取其内容并打印在屏幕上,因此这个过程我们就涉及到了磁盘的驱动程序。驱动程序的目的就是为了给应用程序提供一个接口(API),使得应用程序通过调用系统API能够调用到我们的磁盘驱动程序对应的API程序,进而运行驱动程序,打开磁盘上的文件,将文件内容传递给应用程序,而我们驱动程序的工作就是,配置我们的磁盘控制寄存器,同时读取磁盘文件内容将数据返回给我们的应用程序

因此驱动程序 = 应用程序 + 单片机程序可以这样简单初步的理解。

三者的关系

应用程序:实现业务逻辑功能
单片机程序:设置硬件寄存器,控制硬件资源
驱动程序:作为应用程序和单片机程序的桥梁,隔离软件与硬件。让做应用的人不必太过关心硬件的配置,让硬件的控制能更好的服务于应用程序。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jacky~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值