#驱动开发

news2024/11/15 21:53:20
内核模块
字符设备驱动

中断、内核定时器

裸机开发和驱动开发的区别?

裸机开发

驱动开发(基于内核)

相同点

都能够控制硬件(本质:操作寄存器)

不同点

用C语言给对应的地址里面写值

按照一定的框架格式往地址里面写值

单独编译单独执行

依赖内核编译、执行

同时只能执行一份代码

同时执行多份代码

只需要一个main函数

依赖内核的框架来操作硬件

STM32启动流程详解(超全,startup_stm32xx.s分析)_stm32启动过程详解-CSDN博客文章浏览阅读3.8k次,点赞32次,收藏84次。启动模式只决定程序烧录的位置,加载完程序之后会有一个重映射(映射到0x00000000地址位置);真正产生复位信号的时候,CPU还是从开始位置执行。值得注意的是STM32上电复位以后,代码区都是从0x00000000开始的,三种启动模式只是将各自存储空间的地址映射到0x00000000中。_stm32启动过程详解https://blog.csdn.net/m0_56694518/article/details/135032170?spm=1001.2014.3001.5501

驱动里面操作LED灯的寄存器 

驱动模块是依赖内核框架执行代码

ARM裸机直接操作的是物理内存,直接拿到寄存器地址写值。

驱动是基于内核,操作的是虚拟内存,使用之前先映射实际物理内存。

Linux系统组成

硬件层:led 鼠标 键盘 lcd 触摸屏 摄像头 u盘 emmc 猫 路由器 dm9000

0-3G的用户空间是每个进程单独拥有0-3G的空间

系统调用(软中断swi)   应用层通过系统调用与底层交互,swi将应用层切换到内核层。

驱动代码就在内核空间(在3-4G内核空间, 共用空间)

注:1G的物理内存映射成0~4G的虚拟内存,每个进程都可以访问内核,0~3G是每个进程单独拥有的,3G~4G是所有的共有的。代码运行在物理内存上,向虚拟内存上面写值,其实是写在物理内存上面的

宏内核和微内核(了解)

宏内核:集中管理的架构,负责多种系统资源的调度和管理;

将进程、文件、网络、内存、设备等功能集成到一个内核中,具备直接操作硬件的能力。

优点:执行效率高,操作系统资源可以直接在内核中实现,减少了进程间通信带来的性能损失,提高了系统的执行速度。

缺点:内核的代码量非常大,不易拓展,且单个模块的崩溃可能会影响整个系统的运行。

eg:ubuntu、Android

微内核:更侧重于模块化和移植性,通过传递请求的方式实现不同模块之间的交互

将最基本的操作系统功能放到内核中,其他服务和程序在微内核之上构建,并在用户态下运行。(设计分界线不同)

优点:系统灵活性和可扩展性好,系统可靠性高

缺点:代码运行效率低->通过API接口让整个系统运行起来

eg:Window 、鸿蒙

驱动移植

步骤:

需要有对应的驱动代码(.c)

修改对应目录的Makefile - drivers-》char)-》obj-$(CONFIG_LED) +=led.o

修改对应目录里的Kconfig(tristate " ...... " )

make menuconfig-》配置自己的驱动为M(模块的)

make modules(在最顶层目录)

把编译产生的.ko结尾的驱动文件,放到nfs(/opt/6818/rootfs/rootfs)目录下使用

安装insmod led.ko

卸载rmmod led

静态编译:生成的执行文件不依赖于外部库文件,可以直接运行,且程序运行效率较高。

动态编译:可执行文件和库分开写,生成的可执行程序需要依赖于外部的库文件。

内部编译:在内核源码树中编译

外部编译:在内核源码树外编译

驱动模块

驱动的框架

入口(安装):资源申请

出口(卸载):资源释放

许可证:GPL(开源的---》Linux开源-----》GPL许可证)

Linux内核许可规则

Linux内核许可规则 — The Linux Kernel documentation

驱动程序编写

#include <linux/init.h>
#include <linux/module.h>

//申请资源
//static - 限定作用域,延长生命周期
//存储类型 数据类型 指定存放内存区域 函数名(形参)
static int __init hello_init(void)
{
    return 0;
}

//释放资源
static void __exit hello_exit(void)
{
}

module_init(hello_init);    //入口:申请资源   本质-回调一个自己写的函数
module_exit(hello_exit);    //出口:释放资源
MODULE_LICENSE("GPL");      //许可证:公共许可协议(开源协议)

ctags的安装和使用

方法1

1.ctags

ctags工具是将指定目录以及子目录添加索引文件,可以实现快速搜索文件内容(宏定义、取别名以及结构体)

2.ctags创建索引文件

安装ctags:

sudo apt-get install ctags

在/usr/include目录下执行命令:

sudo ctags -R

执行完毕之后,会生成一个tags的索引文件

3、默认只能在/usr/include使用,所以需要设置为全局

打开家目录下的.vimrc文件,然后添加一句话:

set tags+=/usr/include/tags

5.3 ctags工具的使用

追代码:

vim -t 结构体名/宏定义名/取别名

vi -t 结构体名/宏定义名/取别名

如果要查看所有定义的位置:在底行模式下输入

tselect 结构体名/宏定义名/取别名

继续追指定的内容:

将光标放在这个内容的任意位置,然后点击快捷键ctrl ]

返回上一次的文件:

ctrl t

例如:追一下sockaddr_in结构体,查看结构体成员

继续查看这个结构体中成员的类型

查看完毕后返回到最开始的结构体

方法2

把ctags_set文件夹拷贝到Ubuntu里

cd ctags_set

sudo chmod 774 ctags_set.sh

sudo ./ctags_set.sh

验证:在~目录下

vi -t sockaddr_in

生成tags 文件 :在相应目录下 ctags -R

在代码中追变量: ctrl + ]

返回代码中 : ctrl + t

mv tags /home/hq/kernel/kernel-3.4.39

可以不执行:

==================================

在内核源码目录下 执行

make tags

========================

cd ~

sudo vim .vimrc

在.vimrc 最后添加

set set tags+=内核源码绝对路径/tags

例如set tags+=/home/hq/kernel/kernel-3.4.39/tags

驱动Makefile编写

KERNELDIR = /home/hq/kernel/kernel-3.4.39	#开发板路径
#KERNELDIR = /lib/modules/$(shell uname -r)/build	#PC机

PWD = $(shell pwd)    #驱动文件的路径

all:
	make -C $(KERNELDIR) M=$(PWD) modules
	#基于内核框架将驱动代码编译生成驱动模块
	#需要在内核的顶层目录下执行 make modules
	#-C:指定到哪个路径下执行这个命令
	#M:赋值,要将哪个路径下的驱动文件编译生成驱动模块
    #注:进入内核目录下执行make modules这条命令,如果不指定 M=$(PWD) 会把内核目录下的.c文件编译生成.ko

.PHONY:clean
clean:
	make -C $(KERNELDIR) M=$(PWD) clean
	
obj-m += hello.o

Source Insight工具

软件安装

激活码:SI3US-719473-71478

使用(配置工程)

配置信息:*.c;*.h;*.S;*.lds;*defconfig;*Makefile;*.mak;*.dts;*.dtsi

软件使用

ctrl+/ 可以搜索变量及函数

按住ctrl左击鼠标可以追变量或者函数

打印函数

在Linux中可以使用

grep "printk" * -nR

搜索函数,搜到以后,在里面任意找到一个,看函数原形

	printk (打印级别 "内容");
	printk(KERN_ERR "Fail%d",a);
	printk(KERN_ERR "%s:%s:%d\n",__FILE__,__func__,__LINE__);//(驱动在哪一个文件,哪一个函数,哪一行)

内核打印级别

vi -t KERN_ERR(查看内核打印级别)//也可直接在SI中按住ctrl左击跳转进行查看

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

最高的 最低的

终端打印级别

#define console_loglevel (console_printk[0])    //终端的级别
#define default_message_loglevel (console_printk[1])//消息的默认级别
#define minimum_console_loglevel (console_printk[2])//终端的最大级别
#define default_console_loglevel (console_printk[3])//终端的最小级别

查看虚拟机终端级别

cat /proc/sys/kernel/printk

只有当消息的级别大于终端级别,消息才会被显示

打印函数代码

#include <linux/init.h>
#include <linux/module.h>
#include <linux/printk.h>

static int __init hello_init(void)
{
    printk("hello world\n");
    printk(KERN_CRIT "%s %s %d\n",__FILE__,__func__,__LINE__);
    printk(KERN_INFO "%s %s %d\n",__FILE__,__func__,__LINE__);
    return 0;
}

static void __exit hello_exit(void)
{
    printk("bai bai le nin lei\n");
    printk(KERN_CRIT "%s %s %d\n",__FILE__,__func__,__LINE__);
    printk(KERN_INFO "%s %s %d\n",__FILE__,__func__,__LINE__);
}

module_init(hello_init);    //入口:申请资源
module_exit(hello_exit);    //出口:释放资源
MODULE_LICENSE("GPL");      //许可证:公共许可协议(开源协议)

但对与咱们的这个Ubuntu被开发者修改过,所有消息不会主动回显

命令使用

sudo insmod hello.ko 安装驱动模块

sudo rmmod hello 卸载驱动模块

lsmod 查看模块

dmesg 查看消息

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

sudo dmesg -c 回显后清空

修改系统的默认级别

su root

echo 4 3 1 7 > /proc/sys/kernel/printk

虚拟机的默认情况:

修改开发板的默认级别

查看开发板的默认级别

cat /proc/sys/kernel/printk

如果想修改开发板对应的打印级别

vi etc/init.d/rcS

echo 5 5 1 7 > /proc/sys/kernel/printk

//当系统重新启动,rcS中的命令会全部重新执行一遍

rootfs/etc/init.d/rcS里面添加上以后再起板子,板子的级别就为如下:

etc/init.d/rcS:一些启动虚拟机需要启动的东西都可以放在这个文件中,启动系统时同时启动。

echo 5 5 1 7 > /proc/sys/kernel/printk

放到板子跟文件系统对应这个文件中。

安装驱动和卸载驱动时,消息会打印。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2087618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【DSP+FPGA】基于DSP+FPGA XC7K325T与TMS320C6678的通用信号处理平台

DSP FPGA 协同处理架构板载 1 个TMS320C6678 多核DSP处理节点板载 1 片 XC7K325T FPGA处理节点板载 1 个FMC 接口板载4路SFP光纤接口FPGA 与 DSP 之间采用高速Rapid IO互联 基于FPGA与DSP协同处理架构的通用高性能实时信号处理平台&#xff0c;该平台采用1片TI的KeyStone系列多…

CSS3 文本效果(text-shadow,box-shadow,white-space等)

一 text-shadow text-shadow 属性是 CSS3 中用于为文本添加阴影效果的工具。它可以增强文本的可读性和视觉吸引力&#xff0c;提供丰富的视觉效果 1 语法 text-shadow: offset-x offset-y blur-radius color;offset-x&#xff1a;阴影相对于文本的水平偏移量。可以是正值&am…

c/c++: function和procedure的区别

https://www.cs.nthu.edu.tw/~ychung/slides/CSC4180/Alfred%20V.%20Aho,%20Monica%20S.%20Lam,%20Ravi%20Sethi,%20Jeffrey%20D.%20Ullman-Compilers%20-%20Principles,%20Techniques,%20and%20Tools-Pearson_Addison%20Wesley%20(2006).pdf 函数与过程的区别&#xff0c;一个…

AI语音识别神器Openai Whisper对中文的支持如何?

文章目录 前言一、资料准备二、Whisper环境搭建第一步&#xff1a;安装whisper第二步&#xff1a;安装ffmpeg 三、Whisper测试总结其他相关 前言 语音识别一直以来都是人工智能领域中一个不容忽视的技术&#xff0c;随着大模型时代的到来&#xff0c;这项技术也发生了质的变化…

解决MAC电脑SVN Android studio不能提交.so文件相关

目录 前言 确认问题原因 修改 SVN 配置文件 验证配置是否生效 其他注意事项 总结 前言 在使用 macOS 进行开发时&#xff0c;可能会遇到通过 SVN 在 Android Studio 中无法提交 .so 文件的问题。这通常是由于 SVN 配置文件中的 global-ignores 设置导致的&#xff0c;…

比特币牛市将至背后

作者&#xff1a;Arthur Hayes 编译&#xff1a;Liam 「此处所表达的任何观点均为作者个人意见&#xff0c;不应作为投资决策依据&#xff0c;也不应被视为参与投资交易的推荐或建议。」 我打破常规&#xff0c;前往南半球滑雪两周&#xff0c;为北半球的暑假画上圆满的句号。我…

03. SpringBoot 项目创建

接下来我们将要完成一个基础的 Springboot 项目的创建&#xff0c;并且将项目上传到 Gitee 1. 查看官网&#xff0c;选择版本 学习任何一门技术&#xff0c;一定要学会从官网了解一手信息&#xff0c;无论是哪个博主的博客都是有时效性的&#xff0c;我们要掌握这样的习惯&…

Runtime Asset Database 运行时资产数据库

运行时资产数据库是一个库,旨在简化Unity应用程序中运行时保存和加载子系统的实现。此库复制并扩展了Unity编辑器中常见的预制件、预制件变体和资源的概念,使其在运行时比以往任何时候都更容易管理和操纵游戏资源,并在运行时动态实现与Unity编辑器类似的工作流。 Unity开发人…

晟鑫商会与家盛资本携手合作,共创金融科技新篇章

在数字化浪潮的推动下,金融科技正成为全球经济发展的新引擎。近日,晟鑫商会与家盛资本宣布达成战略合作伙伴关系,旨在通过创新合作,共同开拓市场新机遇,促进双方在数字经济领域的深入发展。两家机构的联合预示着在金融科技领域将开启一段新的旅程。 晟鑫商会,作为互联网商业合作…

做好价格监测这些点要注意

品牌在进行数据监测时&#xff0c;首要关注点在于数据本身的准确率与覆盖率&#xff0c;而在价格监测方面亦是如此。品牌需高度关注电商价格监测系统输出的价格、促销信息、销量等数据。一旦促销信息出现不准确的情况&#xff0c;到手价必然会受到影响&#xff0c;进而对后端治…

USB PHY——ULPI

ULPI协议的全称是UTMI Low Pin Interface。从名字上就可以看出ULPI是UTMI的Low Pin版本。 ULPI是在UTMI的基础上封装了一层。 ULPI需要读写寄存器&#xff0c;而UTMI只需直接拉高或拉低信号线。 从这张图可以看出 ULPI 是在 UTMI level3 再往上一层 外设参考设计

ssm面向企事业单位的项目申报小程序论文源码调试讲解

2 系统实现的技术支持 2.1微信开发者工具 在传统web浏览器中&#xff0c;在加载htm15页面时先加载视图层的html和css&#xff0c;后加载逻辑层的java script&#xff0c;然后返回数据并在浏览器中展示页面。而微信开发者工具的系统层是基于Native System的&#xff0c;视图层和…

COMP9315-week2-lecture1

COMP9315 19T2 Week 2 Lecture 1_哔哩哔哩_bilibili C:\python\COMP9315-master\19T2\Lectures\weel02.pdf COMP9315 24T1 - Course Notes (unsw.edu.au) 前面三分之一时间讲week1的练习题&#xff0c;是一个存储过程 COMP9315-master\19T2\Lecture Exercises\week01\ex05\…

AcWing859. Kruskal算法求最小生成树

一定要看这个链接的讲解视频&#xff1a;强烈推荐&#xff01;&#xff01;&#xff01;【图-最小生成树-Prim(普里姆)算法和Kruskal(克鲁斯卡尔)算法】 文章目录 1.题目2.Kruskal基本思想&#xff1a;3.逐行解释代码&#xff1a; 1.题目 2.Kruskal基本思想&#xff1a; Krus…

sql-labs46-50通关攻略

第46关 一.查询数据库 http://172.16.1.142/Less-46/?sort1%20and%20updatexml(1,concat(0x7e,(select%20database()),0x7e),1)--http://172.16.1.142/Less-46/?sort1%20and%20updatexml(1,concat(0x7e,(select%20database()),0x7e),1)-- 二.查表 http://172.16.1.142/Les…

Eureka:Spring Cloud中的服务注册与发现如何实现?

Eureka&#xff1a;Spring Cloud中的服务注册与发现如何实现&#xff1f; 1、什么是服务注册与发现&#xff1f;2、Eureka的工作原理3、Eureka的优势 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在微服务架构的浪潮中&#xff0c;服务注…

谷歌的 GameNGen:无需游戏引擎,人工智能模拟 “毁灭战士“,开辟新天地

谷歌公司的研究人员创建了一个神经网络&#xff0c;可以在不使用传统游戏引擎的情况下生成经典射击游戏《毁灭战士》的实时游戏&#xff0c;从而实现了人工智能领域的一个重要里程碑。这个名为 GameNGen 的系统标志着人工智能向前迈出了重要一步&#xff0c;它能在单芯片上以每…

ffmpeg教程及加速视频转码

ffmpeg教程及加速视频转码 1、ffmpeg简介&#xff1a; ffmpeg来自MPEG视频编码标准。 是一套可以用来记录&#xff0c;转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。 可以轻易的实现多种视频格式之间的相互转换。 2、基础知识&#xff1a; 容器、文件…

2d像素游戏基本架构

目录 2D像素游戏的基本架构通常包括以下几个关键部分 Unity和虚幻引擎在2D游戏开发中的性能比较 Unity的2D工具设计复杂的地图和场景 创建和管理地图资源&#xff1a; 使用TileMap工具&#xff1a; 构建复杂场景&#xff1a; 添加碰撞体和物理效果&#xff1a; 优化和…

密码访问单页自定义跳转页面源码

源码介绍 密码访问单页自定义跳转页面源码&#xff0c;密码访问单页自定义跳转页面&#xff0c;修改了的密码访问单页&#xff0c;添加了js自定义密码跳转页面。需要正确输入密码才能跳转目标网址。 源码截图 源码下载 密码访问单页自定义跳转页面源码