当前位置: 首页 > news >正文

2. 驱动开发--驱动开发环境搭建

文章目录

  • 前言
  • 一、Linux中配置编译环境
    • 1.1 linux下安装软件的方法
    • 1.2 交叉编译工具链的安装
      • 1.2.1 测试是否安装成功
    • 1.3 设置环境变量
      • 1.3.1 将工具链导出到环境变量
    • 1.4 为工具链创建arm-linux-xxx符号链接
  • 二、 搭建运行开发环境
    • 2.1 tftp网络方式加载内核和设备树文件
    • 2.2 nfs网络方式加载rootfs
  • 参考资料

前言

搭建驱动开发的环境,便于调试。文章记录了本人的项目实践和朱有鹏老师的课程知识汇总。

一、Linux中配置编译环境

1.1 linux下安装软件的方法

(1)在线安装。譬如ubuntu中使用apt-get install vim来安装vim软件。
(2)自己下载安装包来安装。缺陷: 不知道下载的安装包和系统是否匹配。
(3)源代码安装。
总结:安装交叉编译工具链(arm-linux-gcc)实际采用第二种安装方式。

1.2 交叉编译工具链的安装

打开虚拟机,在/usr/local/下创建/usr/local/arm文件夹
先将安装包从Windows中弄到linux中去。可以用共享文件夹,也可以用Samba,也可以用cuteftp。

解压:tar -jxvf arm-2009q3.tar.bz2

应用程序在解压出来的文件中,安装在/usr/local/arm/arm-2009q3/bin目录下。

注:linux中的目录管理方法。技术角度来讲,linux中所有目录性质都是一样的,所以技术角度来讲我们把软件安装到哪里都行。但是如果胡乱放置,将来程序可能不好找。所以久而久之就总结了一个文件放置的一般定义,譬如说,/bin目录放置一些系统自带的用户使用的应用程序,/sbin目录下存放的是系统自带的系统管理方面的应用程序

那我们装软件放在哪里?
一般都在/usr目录下。我们安装arm-linux-gcc,就在/usr/local/底下创建一个arm文件夹,然后装到里面。

1.2.1 测试是否安装成功

切换到真正的应用程序的安装目录下(即/usr/local/arm/arm-2009q3/bin), 去执行arm-linux-gcc -v

执行方法:./arm-none-linux-gnueabi-gcc -v

执行后可以得到一长串输出,其中有**“gcc version 4.4.1”**字样,即表示安装成功。

arm-none-linux-gnueabi-gcc No such file or directory这个错误的分析思路:正常来说只有某个被编译的文件不存在才会报这个错误,但如果确少某个必要的包,也会出现这个问题,而且根本不知道从哪里查问题。
真正原因: 这个gcc可执行文件是32位的版本,而在64位系统上需要安装32位兼容包才可以运行正常。
解决办法:
安装ia32-libs (sudo apt-get install lib32z1
但是此时只能在应用程序目录下执行应用程序或者在别处执行时需要写入完整的应用程序路径/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-gcc-v比较繁琐,所以下面引入环境变量。

1.3 设置环境变量

环境变量就是操作系统的全局变量。每一个环境变量对操作系统来说都是唯一的,名字和所代表的意义都是唯一的。linux系统可以有很多个环境变量。其中有一部分是linux系统自带的,还有一些是我们自己来扩充的。我们这里涉及到的一个环境变量是PATH。PATH这个环境变量是系统自带的,它的含义就是系统在查找可执行程序时会搜索的路径范围。(此时在任意路径直接执行arm-none-linux-gnueabi-gcc -v都可以了)

输出linux系统环境变量: echo $PATH

1.3.1 将工具链导出到环境变量

在终端中输入

export PATH=/usr/local/arm/arm-2009q3/bin:$PATH

但是此时只要关掉这个终端再另外打开一个立马就不行了。原因是我们本次终端中执行时的操作只是针对本终端,以后再打开的终端并未被执行过这个命令所以没导出。
解决方案:

在~/.bashrc中,在最下面添加环境变量
export PATH=/usr/local/arm/arm-2009q3/bin:$PATH
更新~/.bashrc文件, source   ~/.bashrc

1.4 为工具链创建arm-linux-xxx符号链接

终端中输入: ln arm-none-linux-gnueabi-addr2line -s arm-linux-addr2line,即可通过arm-linux-addr2line访问ln arm-none-linux-gnueabi-addr2line

二、 搭建运行开发环境

2.1 tftp网络方式加载内核和设备树文件

  1. 将uImage和dtb文件放入到ubuntu中的/tftpboot
  2. 在开发板中设置uboot参数,使其能够去加载内核(根据自己实际的IP进行配置),或直接把配置过nfs服务的内核,经过编译得到的zImage烧录到开发板。
set ipaddr 192.168.1.10
set serverip 192.168.1.141
set bootcmd tftp 0x41000000 uImage \; tftp 0x42000000 exynos4412-fs4412.dtb \; bootm 0x41000000 - 0x42000000
save或saveenv

2.2 nfs网络方式加载rootfs

  1. 需要一个根文件系统目录–rootfs.tar.xz,需要解压到ubuntu

sudo tar -zxvf rootfs.tar.xz -C /x210_porting/rootfs

  1. 配置nfs服务器(需要安装),让/x210_porting/rootfs可以被挂载
sudo vim /etc/exports
/x210_porting/rootfs                *(subtree_check,rw,no_root_squash,async)
sudo service nfs-kernel-server restart  //重启nfs服务器,或sudo /etc/init.d/nfs-kernel-server restart

  测试是否挂载成功

sudo mount -t nfs localhost:/x210_porting/rootfs /mnt

  1. 设置bootargs使开发板从nfs去挂载rootfs(内核配置记得打开使能nfs形式的rootfs)。在开发板中去指定内核要挂载/opt/…/rootfs–切换到开发操作。
setenv bootargs root=/dev/nfs nfsroot=192.168.1.141:/x210_porting/rootfs/rootfs ip=192.168.1.10:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off  init=/linuxrc     console=ttySAC2,115200 
save
reset 	//重启开发板

  解释:

    bootargs 是uboot传递给内核到启动参数,是一个字符串console=xxx: 告诉内核启动时候到调试信息是从哪个设备输出init=xxx:  告诉内核linux到第一个用户进程是什么root=xxx : 告诉内核根文件系统在哪里root=/dev/nfs 表示根文件系统在网路远端nfsroot=ip:pathip=xxx :告诉内核开机的时候内核的ip地址是多少(静态分配ip)
  1. 修改Makefile中的KERN_DIR使其指向自己建立的内核源码树,并将自己编译好的驱动.ko文件放入nfs共享目录下去
    在这里插入图片描述
    4、开发板启动后使用insmod、rmmod、lsmod等去进行模块实验
    在这里插入图片描述
    至此,我们具备了开发驱动的基础,我们将在之后一步步去探究驱动开发的奥秘。

参考资料

HQ驱动开发环境搭建-上
驱动开发环境搭建-下
华为云

相关文章:

2. 驱动开发--驱动开发环境搭建

文章目录前言一、Linux中配置编译环境1.1 linux下安装软件的方法1.2 交叉编译工具链的安装1.2.1 测试是否安装成功1.3 设置环境变量1.3.1 将工具链导出到环境变量1.4 为工具链创建arm-linux-xxx符号链接二、 搭建运行开发环境2.1 tftp网络方式加载内核和设备树文件2.2 nfs网络方…...

《数据库系统概论》学习笔记——第四章 数据库安全

教材为数据库系统概论第五版(王珊) 这一章简单记一下那几条sql的用法和两种存取控制和审计(今年期末考了)吧,不知道有啥好考的 数据库安全性 问题的提出 数据库的一大特点是数据可以共享数据共享必然带来数据库的安全…...

山洪径流过程模拟及洪水危险性评价

目录 1.洪水淹没危险性评价方法及技术讲解 2.GIS水文信息提取与分析(基于ArcGIS软件) 3.洪水淹没模拟水文分析:洪峰流量估算 4.洪水淹没模拟水力学分析:Hec-RAS实例操作 GIS水文分析(ArcHydro、Spatial Anlysist等模块)是流域…...

LeetCode HOT100 (23、32、33)

目录 23、合并K个升序链表 32、最长有效括号 33、搜索旋转排序数组 23、合并K个升序链表 思路:采用顺序合并的方法,用一个变量 ans 来维护以及合并的链表,第 i 次循i 个链表和 ans合并,答案保存到 ans中。 代码: …...

电力监控仪表主要分类

电力监控仪表是电工仪表行业的一个新兴、细分行业,类别属于安装式数字仪表,从模拟指针式仪表和电量变送器演变而来。随着计算机技术的发展,电力监控仪表已应用到电力系统的发、输、变、配、用的各个环节,实现对电网电参量的测量、…...

山野户外定位依赖GPS或者卫星电话就能完成么?

每当有驴友失联的新闻报道,很多的户外“老鸟”和“菜鸟”都在讲:为什么不带卫星电话,不带GPS……云云!提一个小小的问题:如果你拿着卫星电话、GPS或者其他即时通信的其他设备,你就能准定位你所处的位置么&a…...

SAP 应收应付重组配置

应收应付重组是为了使资产负债表真实的反映资产及负债的真实情况,需要对应收、应付账款的余额时行实际调整。即将“应收账款”的贷方余额和“应付账款”的借方余额分别调整至“预收账款”与“预付账款”账户中。 应收应付重组SAP系统是按照公司代码、客户/供应商、…...

算法练习(八)计数质数(素数)

1、问题描述&#xff1a; 给定整数 n &#xff0c;返回 所有小于非负整数 n 的质数的数量 。 2、示例如下&#xff1a; 3、代码如下&#xff1a; 第一种&#xff1a;比较暴力的算法 class Solution {public int countPrimes(int n) {int count1;if(n<2) return 0;for(in…...

用反射模拟IOC模拟getBean

IOC就是spring的核心思想之一&#xff1a;控制反转。这里不再赘述&#xff0c;看我的文章即可了解&#xff1a;spring基础思想IOC其次就是java的反射&#xff0c;反射机制是spring的重要实现核心&#xff0c;今天我看spring的三级缓存解决循坏引用的问题时&#xff0c;发现一个…...

【Ap AutoSAR入门与实战开发02】-【Ap_s2s模块01】: s2s的背景

总目录链接==>> AutoSAR入门和实战系列总目录 文章目录 1 s2s的背景?2 AUTOSAR 方法应支持车辆的无缝开发2.1 面向服务的ECU的解读2.2 面向信号的ECU的解读2.3 通过网关ECU实现转换1 s2s的背景? Cp AutoSAR基于传统的can,lin,flexray总线的通信,一般是面向信号设…...

C语言数据结构(3)----无头单向非循环链表

目录 1. 链表的概念及结构 2. 链表的分类 3. 无头单向非循环链表的实现(下面称为单链表) 3.1 SListNode* BuySListNode(SLTDateType x) 的实现 3.2 void SListPrint(SListNode* plist) 的实现 3.3 void SListPushBack(SListNode** pplist, SLTDateType x) 的实现 3.4 voi…...

Android 实现菜单拖拽排序

效果图简介本文主角是ItemTouchHelper。它是RecyclerView对于item交互处理的一个「辅助类」&#xff0c;主要用于拖拽以及滑动处理。以接口实现的方式&#xff0c;达到配置简单、逻辑解耦、职责分明的效果&#xff0c;并且支持所有的布局方式。功能拆解功能实现4.1、实现接口自…...

通过window.open打开新的页面并修改样式添加内容

const img new Image(); img.src res; //res是图片的路径地址 const newWin window.open(, _blank); newWin.document.write(img.outerHTML); // newWin.document.body.style.background #000; newWin.document.body.style.textAlign center; newWin.document.body.oncl…...

Java中 Synchronized 的用法

《编程思想之多线程与多进程(1)——以操作系统的角度述说线程与进程》一文详细讲述了线程、进程的关系及在操作系统中的表现&#xff0c;这是多线程学习必须了解的基础。本文将接着讲一下Java线程同步中的一个重要的概念synchronized. synchronized是Java中的关键字&#xff0c…...

Rust语言的基本介绍

rust缘起和目标 rust的英文是锈菌&#xff0c;是一种真菌&#xff0c;这种真菌的生命力非常顽强&#xff0c;其 在生命周期内可以产生多达5种孢子类型&#xff0c;这5种生命形态还可以相互转 化。“Rust”也有“铁锈”的意思&#xff0c;暗合“裸金属”之意&#xff0c;代表了R…...

新冠小阳人症状记录

原想挺过春节后再养&#xff0c;发现事与愿违。生理期期间抵抗力下降&#xff0c;所以在生理期第二天就有些症状了。可能是生理期前一天出去采购食物染上&#xff0c;也可能是合租夫妻染上。anyway&#xff0c;记录下自己的症状与相应有效的偏方&#xff1a; 第一天&#xff1a…...

SQL零基础入门学习(十四)

上篇&#xff1a;SQL零基础入门学习&#xff08;十三&#xff09; SQL NULL 值 NULL 值代表遗漏的未知数据。 默认地&#xff0c;表的列可以存放 NULL 值。 如果表中的某个列是可选的&#xff0c;那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该…...

Excel工作表不能移动或复制?看看是不是这两个原因

Excel工作表不能移动或复制&#xff1f;今天来看看如何解决。 大家都知道&#xff0c;Excel表格分为工作簿和工作表&#xff0c;工作簿就是整个Excel文件&#xff1b;工作簿里面&#xff0c;也就是Excel表可以有多个工作表。 而各个工作表之间是可以相互移动或复制的&#xf…...

利用递归实现括号匹配

案例引入以下则是各个字符串经过括号处理之后的结果&#xff1a;12((21))(12-->12(21)1232((((2121)212(21)-->32(2121)212(21)ABDF((SA)SA)SA(SA)SA(((-->ABDF((SA)SA)SA(SA)SA算法思路&#xff1a;这个问题的解决方法就是将字符按顺序逐一加入到新的string容器store…...

14.线程数量怎么制定?

什么是CPU 密集型任务和耗时 IO 型任务 &#xff1f; CPU 密集型任务 CPU 密集型任务&#xff0c;比如加密、解密、压缩、计算等一系列需要大量耗费 CPU 资源的任务。 耗时 IO 型任务 数据库、文件的读写&#xff0c;网络通信等任务&#xff0c;这种任务的特点是并不会特别消耗…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日&#xff0c;在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上&#xff0c;可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞&#xff0c;强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...