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

文章目录单片机程序应用程序驱动程序三者的关系
前言
学习资料,跟的韦东山老师的视频,大家可以上百问网下载资料
百问网 。
我使用的开发板是,关于157的开发板资料大家也可以在百问网进行下载 。
157准备工作 配置交叉编译链
将文件拷贝到虚拟机指定目录,进行解压
配置交叉编译脚本, .sh
#!/bin/bashARCH=armCROSS_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/目录下
设置配置文件:make
编译 : make= -j4
编译设备树: make dtbs
编译内核: make-j4
安装内核模块到指定目录:make ARCH=arm =/home/jacky\ /
删除链接目录,节约开发板空间: rm -rfbuild
更新开发板系统
nfs挂载:mount -t nfs -o ,vers=3 192.168.1.100:/home/book/ /mnt
拷贝: cp /mnt/ /boot
拷贝设备树:cp /mnt/*.dtb /boot
拷贝内核: cp /mnt/lib/ /lib -rfd
编译解压glibc
官网
将源文件拷贝到指定目录,然后进行解压
tar -xvf glibc-2.34.tar.xz
注意:如果有查看源码需求的朋友,可以直接下载到上用 查看即可
单片机程序
相信学过单片机的同学,对单片的最直观了解就是总是在和寄存器(硬件)打交道 。
在我们编写单片机程序时,无论是简单的点灯,还是后面的控制模块,控制器等,其本质依旧是对寄存器值进行设置(或配置) 。因此,我们的程序总是处于一种直接操作硬件的感觉 。
虽然在单片机高级编程中,我们提倡将应用程序与硬件程序进行分离,即当我们实现一个按键点灯的功能时,将应用逻辑封装为 ()函数和()函数,这样的目的就是提高了代码的阅读性 。但是我们脱离不了要在本文件中去实现()和()两个函数,无论是通过中断的方式,还是轮询去读取对应引脚寄存器的值,或者点灯去设置寄存器的值,依旧无法脱离要去直接操作寄存器的本质 。
这就是单片机程序最直观的特点 。
应用程序
对于应用程序,相信大家肯定对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应用程序与驱动程序分析)】在这个过程中,我们只需要在意的是我们应该打开那个文件,打开以后,将读取的内容存放到我们申请的内存空间,然后进行打印,即实现了我们的应用需求,但是至始至终,我们并不知道,我们如何操作磁盘的?磁盘上的内容如何传递给我们的?似乎我们从来都无法直接去操作寄存器或硬件?