驱动开发(一)——(单片机程序、Linux应用程序与驱动程序分析)
文章目录
- 前言
- 157准备工作
- 配置交叉编译链
- 编译内核
- 编译解压glibc
- 单片机程序
- 应用程序
- 驱动程序
- 三者的关系
前言
学习资料,跟的韦东山老师的视频,大家可以上百问网下载资料
百问网。
我使用的开发板是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程序,进而运行驱动程序,打开磁盘上的文件,将文件内容传递给应用程序,而我们驱动程序的工作就是,配置我们的磁盘控制寄存器,同时读取磁盘文件内容将数据返回给我们的应用程序
因此驱动程序 = 应用程序 + 单片机程序
可以这样简单初步的理解。
三者的关系
应用程序
:实现业务逻辑功能
单片机程序
:设置硬件寄存器,控制硬件资源
驱动程序
:作为应用程序和单片机程序的桥梁,隔离软件与硬件。让做应用的人不必太过关心硬件的配置,让硬件的控制能更好的服务于应用程序。
驱动开发(一)——(单片机程序、Linux应用程序与驱动程序分析)相关推荐
- Linux 网络设备驱动开发(一) —— linux内核网络分层结构
Linux内核对网络驱动程序使用统一的接口,并且对于网络设备采用面向对象的思想设计. Linux内核采用分层结构处理网络数据包.分层结构与网络协议的结构匹配,既能简化数据包处理流程,又便于扩展和维护. ...
- linux终端输出c语言程序,Linux终端程序用c语言实现改变输出的字的颜色
颜色代码: 格式: echo "\033[字背景颜色;字体颜色m字符串\033[0m" 例如: echo "\033[41;36m something here \033 ...
- 怎么用linux设计一个小程序,“Linux”小程序发布一个月后,我们发现了什么
原标题:"Linux"小程序发布一个月后,我们发现了什么 这一个月来,这个小程序得到了八千多人的使用,一百多位贡献者实际参与了翻译贡献,其中贡献最高的"Datura st ...
- linux摄像头内核驱动开发,FS_S5PC100平台上Linux Camera驱动开发详解(一)
说明: 理解摄像头驱动需要四个前提: 1)摄像头基本的工作原理和S5PC100集成的Camera控制器的工作原理 2)platform_device和platform_driver工作原理 3)Lin ...
- 嵌入式linux驱动开发实战教程,嵌入式Linux驱动开发实战视频教程
嵌入式Linux驱动开发实战教程(内核驱动.看门狗技术.触摸屏.视频采集系统) 适合人群:高级 课时数量:109课时 用到技术:嵌入式 Linux 涉及项目:驱动开发.看门狗技术.触摸屏.视频采集 咨 ...
- linux应用程序开发数据,《嵌入式linux应用程序开发详解》核心笔记
[linux快速入门] 自由软件(free software)中的 free 并不是指免费,而是指自由.它赋予使用者四种自由. · 自由之一:有使用软件的自由. · 自由之二:有研究该软件如何运作的自 ...
- linux驱动开发:触摸屏的认识(FT5x06 IC的分析)
我们板子上的触摸屏是电容屏,当然也有电阻屏.不过目前绝大多数是电容屏. 原理:按下某个位置,得到某个位置的特定电阻/电容值,电阻屏(可能通过好几个adc去捕获这些电阻值),因为平面上一个点至少需要a( ...
- 嵌入式Linux USB驱动开发之教你一步步编写USB驱动程序
2019独角兽企业重金招聘Python工程师标准>>> 编写与一个USB设备驱动程序的方法和其他总线驱动方式类似,驱动程序把驱动程序对象注册到USB子系统中,稍后再使用制造商和设备标 ...
- linux如何调试elf程序,Linux应用程序elf描述
玩Linux的人应该明白ELF文件是一种文件格式,就好比.txt,.doc等一样,只是这个文件是按照特定信息排列组成,同样在windows上也存在一种格式,它叫PE,老的叫dos.下面我就来看看ELF ...
- linux可疑程序,linux可疑程序追踪
今天的主角是旁边的服务器,学姐的Fedora.发生的情况和我的那台ubuntu类似.(看来是一起被黑了) 连接虽挡,进程犹在 其实昨天已经发现学姐的系统出问题了,采取的措施和我那台一样,iptable ...
最新文章
- 安装Anaconda创建虚拟环境以及在pycharm中使用虚拟环境
- MSDN Magazine推出Custom Report Item示例ProgressTracker CRI
- JSP关于用户安全退出的问题
- Vue生产环境调试的方法
- 一道六年级数学题,求阴影面积,那我只能用Python代码了
- sfc流程图怎么画_sfc第四次超级机器人大战流程图
- 从技术上解读大数据的应用现状和开源未来! | 技术头条
- 在bash中,如何检查字符串是否以某个值开头?
- 在苹果Mac中将 WEBP 图片转成 JPG、PNG 格式的 2 种方法
- Mysql5.7及以上版本的MySQL下载、安装及配置教程(附图)
- 事件同时发生的相对性——思想实验推导狭义相对论(三)
- 4、Android下实现Google街景
- 【数据分析与挖掘(二)】面试题汇总(附答案)
- python写excel宏_使用python执行excel的VBA(宏)
- Pytorch搭建常见分类网络模型------VGG、Googlenet、ResNet50 、MobileNetV2(4)
- Latex 定义definition
- 【C语言】求一个一元二次方程的根
- 自定义View,和Canvas(画布),Paint(画笔),Path(路径)的用法
- c语言字符串switch用法,C语言switch 语句的用法详解
- rbac权限管理初学