交叉开发——交叉编译环境准备1.串口工具用于充当开发板终端2.网络用于传输文件挂载 --- 确保开发板能ping通虚拟机ubuntu3.安装nfs并设置nfs服务目录mount -o nolock,nfsvers3 192.168.0.3:/home/linux/nfs /mnt4.在ubuntu的 /home/linux/nfs 中开发并编译程序在开发板的/mnt 目录下运行程序动态库移植1.使用arm-linux-gcc编译生成libtest.so2.编译生成可执行文件动态链接libtest.so3.arm端执行程序拷贝.so文件到开发板的/lib目录下库移植linux内核设备驱动开发boot rom(0地址) -- bootloader -- kernel -- rootfs1.boot rom 根据启动方式选择不同的存储设备启动bootloader2.bootloader 为 kernel 准备运行环境,引导kernel 启动3.kernel 启动到最后阶段,加载根文件系统bootloader:一个裸机程序,为内核启动准备环境,并引导内核启动1.初始化CPU(工作模式)2.初始化异常向量表3.初始化内存4.初始化堆栈5.初始化时钟6.关闭看门狗7.关Cache(数据Cache关闭, 指令Cache可以不关)8.关闭MMU9.初始化相关外设(串口/网口)10.集成相关外设11.搬移内核到内存, 向内核传参(根文件系统类型/位置/控制台)12.启动内核(PC指向内核首地址) --- 从此CPU控制权彻底移交给内核kernel:操作系统核心(一个复杂的软件)文件管理, 内存管理, 进程管理, 网络管理, 设备管理内核启动到最后阶段, 加载(挂载)根文件系统启动init进程 -服务程序 - shell - approotfs: 根文件系统(系统文件的集合)库文件系统程序/命令配置文件普通文件(txt. mp3. jpg)用户程序init进程linux启动SD卡启动系统上电之后, 先执行bootrom中的程序, 检测启动方式后, 将SD卡中的bootloader的前一部分拷贝到片上内存中, bootloader前半部分将内存初始化好, 将自己后半部分拷贝到内存中, bootloader将SD卡中的zlmage拷贝到内存的0x80800000地址处, 并向内核传参, 然后启动内核, 内核启动到最后阶段, 挂载SD卡中的根文件系统。tftp:bootloader通过tftp将ubuntu的tftp服务目录下的zlmage拷贝到内存的0x80800000地址处, 并向内核传参, 然后启动内核, 内核启动到最后阶段, 挂载ubuntu的nfs服务目录中的根文件系统uboot开源的(一个具体的bootloader)uboot命令:? / help 列出所有支持的命令printenv / print 打印环境变量setenv a 10000 设置环境变量saveenv 保存环境变量setenv a 删除环境变量(将环境变量的值设置为空)内核编译Kconfig 定义menuconfig中的配置选项make menuconfig 内核配置(编译选项) --- 配置结果保存在.config.configCONFIG_XXX yCONFIG_XXX1 nMakfile 使用.config中保存的变量obj-$(CONFIG_XXX) xxx.o编译准备设备驱动程序1.字符设备驱动 按字节流顺序访问(绝大多数设备都是字符设备)2.块设备驱动 数据可以随机访问(存储设备)3.网络设备驱动 集成复杂的协议栈(网卡设备) --- 按名字维护1. 执行 ctags -R 生成 tags索引文件 --- 包含当前目录即子目录中所有的符号2. vim打开目标文件 (必须和tags在同级目录下)3. ctrl ] 跟进4. ctrl o 回退 (小写O)5. vim -t demo_init(符号) 以搜索符号的方式打开字符设备驱动模板dev_t dev; struct file_operations fops { open read write release }; struct cdev cdev; demo_init() { //固定设备号 MKDEV(); cdev_init(); cdev_add(); register_chrdev_region(); //自动分配 alloc_chrdev_region(dev,0,1,DEV_NAME); cdev_init(); cdev_add(); class class_create(); device device_create(); } demo_exit() { //device_destroy(); //class_destroy(); unregister_chrdev_region(dev,1); cdev_del(cdev); } module_init(demo_init); module_exit(demo_exit);杂项(混杂)设备驱动: 主设备号为10struct file_operations fops { open read write release }; struct miscdevice misc { .minor name fops }; demo_init() { misc_register(); } demo_exit() { misc_deregister(); } module_init(demo_init); module_exit(demo_exit);ioremap(); 物理地址映射iounmap(); 解除映射copy_from_user(); 用户空间到内核空间的数据拷贝copy_to_user(); 内核空间到用户空间的数据拷贝
企业数字化 ERP 产品动态
相关推荐
PS怎么快速抠图人物?4种实用方法覆盖全场景需求 在电商主图制作、人像写真修图、商业海报设计等Photoshop日常工作中,人物抠图是从业者高频使用的基础操作。不同素材场景对抠图精度、操作效率的要求差异较大,选对适配的方法既能保证边缘质感,又能大幅压缩修图时长。本文分享4种实用的PS快速… · 2026/9/24 17:42:47
手机为什么用 MIPI,车载屏却常 LVDS?显示接口选型解析 手机、平板的屏幕大多采用 MIPI DSI,而车载中控屏常见 LVDS。两者并不是简单的“谁更先进”,而是接口特性与应用场景匹配的结果。
1. LVDS:为中长距离和复杂环境设计
LVDS(Low-Voltage Differential Signaling)用低压差… · 2026/9/24 17:42:47
大数据深度学习|计算机毕设项目|计算机毕设答辩|基于CNN的水稻病害检测 标题:基于CNN的水稻病害检测文档介绍:1.引言1.1 课题背景与意义水稻作为全球主要粮食作物之一,其生长过程中易受多种病害威胁,如稻瘟病、纹枯病等。传统病害检测依赖农业专家人工观察,存在效率低、成本高且主观性强的问… · 2026/9/24 17:42:47
华为OD机试真题 新系统 2026-09-09 JavaGoC【数列求值】 目录
题目
思路
Code
题目
题目内容:
有一个连续的数列,它的前 7 个数为 1,2,3,4,5,6,7。从第 8 个数开始,每个数的值等于它所在位置前面最近连续 7 个数中,最大的两个数之和减去最小的两个数之和。
例如,第 8 个数由前面的 1,2,3,4,5,6,7 计算得到,即 6+7-1-2=10… · 2026/9/25 19:38:51
ArcGIS JS 基础教程(38):三维要素聚合 FeatureReduction ArcGIS JS 基础教程(38):三维要素聚合 FeatureReduction零、写在前面一、功能介绍二、功能实现2.1 开启三维抽稀聚合2.2 动态开关聚合三、功能应用四、核心代码五、在线示例六、关键 API 说明七、系列导航零、写在前面 📌 本系列教… · 2026/9/25 19:38:45
基于Python数据筛选模块总结 1、需求
筛查范围:全部储能项目 筛查周期:近一个月 筛查策略:存在单体电压>=XXXXmV,且存在单体温度>=XXX℃,且电池簇总电压30s内降低10V 输出结果:设备号,时间,总电压,电流,SOC,最高最低电压,最高最低温度,单体电压,单体温度
2、整体思路 从influxdb获取… · 2026/9/25 19:38:45
FDE 到底是什么?一文讲清 AI 时代的 Forward Deployed Engineer FDE 到底是什么?一文讲清 AI 时代的 Forward Deployed Engineer一、FDE 的三个单词,分别意味着什么?二、真实招聘描述告诉了我们什么?三、为什么会调用模型 API,还不等于能完成 FDE 项目?1. 输出是否与当前… · 2026/9/25 19:38:08
新能源汽车预充电电路 新能源汽车预充电电路是高压系统上电(车辆启动)或充电(插枪)时的关键保护电路,其核心目的是限制高压上电瞬间的冲击电流,保护高压电气元件(如主继电器、母线电容)免受大电流冲击和电… · 2026/9/25 19:37:14
Windows下ipmitool实战指南:IPMI带外管理全链路解析 1. 这不是“装个软件”那么简单:ipmitool在Windows下的真实定位与价值重估 你搜到“Windows下安装ipmitool”,第一反应可能是——又一个命令行小工具?点几下鼠标、解压就完事?我干这行十多年,亲手部署过上千台服务器硬… · 2026/9/25 19:37:02
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37