Linux开发追踪(IMX6ULL篇_第一部分)

前言

参数:cortex-A7  698Mhz   flash  8GB    RAM  512M DDR3

2个100M网口  单核

初期:

一、安装完虚拟机之后,第一步先设置文件之间可以相互拷贝复制,以及通过CRT连接到虚拟机等

折磨死人了啊啊啊啊啊啊

1、关于SSH怎么安装指令都有,然后启动SSH服务就行,查看等

入坑点:1.window下一定要看有没有网络适配器VM8这样的,并且和主机,以及虚拟机三者在同一网络下,如果没有适配器,卸载重装,删除注册表

2.NAT无法连接,必须桥接模式,然后查看ip地址必须是同一网段内的

3.设置网络编辑器

4.一定虚拟机和window下相互ping通才行,然后CRT登录Ubuntu的ip地址,以及用户名就行了

二、第二个折磨死人的就是SAMBA,虚拟机映射到window了

参考:第四课:安装samba映射网络磁盘到本地_云服务器samba如何映射到本地-CSDN博客

其中静态路由,最后启用工作站那么起始都不需要,

配置文件可以这样写:无论是ubuntu的登录名还是文件名都是dzc   

创建添加的samba的用户名也是dzc密码1,这个就是最后有个网络凭证需要登录的用户名和密码

还有一点,一定要使用桥接的方式,两者之间也要ping通

防火墙要关掉,实在不行可以卸载重装

还有一种方式就是使用仅主机模式,适用于同一台电脑主机和虚拟机共享连接

第一步选择VM1的主机模式

然后配置虚拟网络编辑器

主机虚拟网卡配置

最后看主机和虚拟机之间能不能相互ping通,然后就可以登录SECURE CRT 和SMBA了。

三、取任一个ubuntu软件,第一步是交叉编译工具安装

第二步创建文件夹   拷贝过去之后,解压文件   tar -xvf 

sudo cp gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz /usr/local/arm/ -f

添加环境变量:

export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin

设置完之后重启生效,检查版本号

第二步是安装VSCODE :建议下载最新版

插件安装

找到设置,字体,中文,不要使能预览

下面的USB是串口,要用跳线帽修改

不建议使用引脚复用,会增加设备树,很麻烦。

中期:准备上手

汇编学习:

.text  代码段

.data 初始化的数据段

.bss 未初始化的数据段

.rodata  只读数据段

__start:  默认标号入口

汇编也可以写函数

常用的汇编指令:

MOV指令:把一个寄存器拷贝到另一个寄存器中,或者将一个立即数传递到寄存器中,后面传递到前面。

MVO RO,R1

MRS指令:用于将特殊寄存器如CPSR,传递到普通的寄存器中,MRS R0,CPSR

MSR指令:用于将普通寄存器传递到特殊寄存器中,MSR CPSR, R0

BX是返回指令

存储器访问指令:LDR 指令,从存储器加载数据到Rx中,LDR也可以把立即数加载到Rx中,LDR加载立即数的时候要用 = 不是 # 

常用的就是读取CPU的寄存器值  LDR R0, = 0X0209C004    LDR R1, [R0]

STR 指令,就是将数据写入存储器中,比如LDR R0, 0X0209C004  LDR R1, = 0X20000002

STR R1, [R0]  把R1的值写入到R0所保存的地址中

压栈和出栈指令:

PUSH {R0~R3, R12} @将 R0~R3 和 R12 压栈
PUSH {LR}
 

出栈顺序

POP {LR}
POP {R0~R3,R12}
 

跳转指令:

如B,BL,BX,BLX等

直接向PC寄存器写入数据

算数运算命令:

逻辑运算命令:

熟悉数据手册和寄存器

1、先看原理图找到对应使用的GPIO以及功能,然后手册中在IOMUXC_SW_MUX_XX中先找到当前引脚,比如GPIO1_IO3,这个是他的复用寄存器,然后找到地址20E_0068h,寄存器表可以看出只有低5位有效,复用为普通的gpio的话就配置成0101,也就是0x05,(如果想配置成其他IIC或者USB功能配成其他数字)。/

2、然后要使能时钟,找到时钟标题,CCM,找到CCGR0-CCGR6,一般都是要全部使能就行,找到这7个寄存器组的地址,然后分别使能为0xFFFFFFFF。

比如地址是20C_4068h   通过STR 写入0xFFFFFFFF,其他6个寄存器也一样

3、然后是电气寄存器,在手册中找IOMUXC_SW_PAD_XX,由低位到高位依次是:

SRE:压摆率    默认为低,当需要高速IO时候,置1

DSE:设置IO的驱动能力   0表示输出驱动关闭,为1看手册,分母越大驱动能力越强

SPEED:设置IO速度,00 50M  01 100M  11 200M

ODE:开路输出    0关闭开漏,  1打开开漏

PKE,上下拉保持      0  上拉保持    1关闭上下拉

PUE设置状态保持, 0 保持  1上啦

PUS设置上下拉电阻, 00 100K    11 22K

HYS:用不到,使能迟滞比较器

4、这几个寄存器都找到之后,记录地址,后面写汇编初始化要用,然后就是配置GPIO功能,

找到Purpose Input/Output (GPIO)  GPIO的寄存器组  看标题  找到GPIO data register

注意:GPIO只是IO众多复用的一个小配置,当你选择把IO配置成GPIO后还需要,另外配置GPIO的一些功能,DR、 GDIR、 PSR、 ICR1、 ICR2、 EDGE_SEL、 IMR 和 ISR这八种寄存器

其中,一共5组,这里用GPIO1  设置GPIO1_DR

数据寄存器DR  比如要设置 GPIO1_IO00 输出高电平,那么就应该设置 GPIO1.DR=1

如果是输入,那么就是读取电平状态

GDIR:设置IO的输入还是输出  输入0  输出1

PSR:功能和输入状态下的 DR 寄存器一样

ICR1和ICR2这两个寄存器,都是中断控制寄存器, ICR1用于配置低16个GPIO, ICR2 用于配置高 16 个 GPIO

IMR用来控制GPIO的中断禁止和使能,使能1,禁止0

ISR:中断状态寄存器,只要某个GPIO中断发生,ISR相应位就是1,处理完中断要清楚

EDGE_SEL 寄存器,这是边沿选择寄存器,会覆盖ICR1和ICR2,无论设置多少都是双边沿触发

这里控制LED,只需要设置DR和GDIR就行了。

LED实验:引脚是IO3 GPIO1

对于Linux也就是cortex-A系列的开发,基本都要先写汇编代码,初始化外设部分

部分需要汇编初始化DDR,然后把指针SP指向DDR。

 如何查看对应的引脚和寄存器配置,Linux的引脚和电气属性是单独两个寄存器

引脚看这几位就行

开发步骤:(如上)

先写汇编程序:示例如下

.global _start @LED IO  GPIO1—3
_start:@先初始化时钟ldr r0, = 0x020c4068 @ccgr0ldr r1, = 0xffffffffstr r1, [r0] @数据写入ldr r0, = 0x020c406C @CCM_CCGR1str r1, [r0]ldr r0, = 0x020c4070 @CCM_CCGR2str r1, [r0]ldr r0, = 0x020c4074 @CCM_CCGR3str r1, [r0]ldr r0, = 0x020c4078 @CCM_CCGR4str r1, [r0]ldr r0, = 0x020c407C @CCM_CCGR5str r1, [r0]ldr r0, = 0x020c4080 @CCM_CCGR6str r1, [r0]@配置复用寄存器属性ldr r0, = 0x020E0068 ldr r1, = 0x05str r1, [r0]@配置电气属性 
/*bit0 压摆率
bit5:3  110 R0/6 驱动能力
bit7:6  10 100M
bit11   0  关闭
bit12   1 时能 pull
bit13
bit15:14 00 100k 下拉
bit16*/ldr r0, = 0x020E02F4ldr r1, = 0x10b0str r1, [r0]@设置gpio功能
/*找到gpio的基地址
bit 0 就是 io0     bit1就是io1  bit2就是io2   bit3就是io3
gpio1_dr 209_C000
gpio1_gdir  209_C004
gpio1_psr  209_C008
*/ldr r0, = 0x0209C004 @设置GDIR为输出ldr r1, = 0x8str r1, [r0]/*打开LED*/ldr r0, = 0x0209C000 @设置dr为输出ldr r1, = 0x0str r1, [r0]loop:b loop

然后写驱动编译程序:

把.c.s文件变成.o文件,先把汇编 变成目标文件

arm-linux-gnueabihf-gcc -g -c led.s -o led.o

将所有的.o文件链接为elf格式的可执行文件,本实验链接的起始地址是 0x87800000     (就是代码运行的起始地址)可以指向内部的RAM也可以指向外部的DDR核心板中,

arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf

将elf文件转为bin文件,在32中,是可以直接把flash中的代码拷贝到RAM中运行的,cortex-A的不能直接拷贝,需要把bin文件拷贝到SD卡中,然后放到设备的flash中运行。

arm-linux-gnueabihf-objcopy -O binary -g -S led.elf  led.bin

将elf文件转为汇编,反汇编,这样RAM就可以识别了,RAM只认那15个寄存器

程序烧录部分

32可以直接把代码烧录到内部flash中,cortex没有内部flash,需要借助SD卡,EMMC,NAND,NOR,SPI flash等方式启动,

1.需要把SD卡挂载到虚拟机中

2. 把F:\百度网盘下载\资料2\【正点原子】阿尔法Linux开发板(A盘)-基础资料\05、开发工具\02、Ubuntu下裸机烧写软件 路径下的  imxdownload文件拷贝到 编译文件夹中,给权限

然后执行命令格式  ls /dev/sd* -l  查看硬盘路径    插拔确认SD卡路径

如果发现U盘或SD卡始终连接不到虚拟机,可以试着修改.vmx文件的

执行操作后,会把bin文件生成为load.imx文件

拨码开关设置为SD卡启动,重启,点亮LED

编写makefile部分

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

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

相关文章

【萌笔趣棋】网页五子棋项目测试报告

目录 一.项目介绍 (一)项目简介 (二)功能介绍 (三)页面展示 1.注册页面 2.登录页面 3.游戏大厅页面 4.游戏房间页面(对战) 二.功能测试 (一)出现的…

知识图谱增强的大型语言模型编辑

https://arxiv.org/pdf/2402.13593 摘要 大型语言模型(LLM)是推进自然语言处理(NLP)任务的关键,但其效率受到不准确和过时知识的阻碍。模型编辑是解决这些挑战的一个有前途的解决方案。然而,现有的编辑方法…

数据库,Spring Boot,数据源

您是对的,我之前的回答解释了Spring Boot在操作MySQL时不一定需要显式配置指定的数据源类型,因为它有自动配置机制,但没有直接点明在自动配置情况下“数据源是什么”。 在Spring Boot自动配置机制下,这个“数据源”指的是一个连接…

数据结构测试模拟题(3)

1、两个有序链表序列的合并 #include<bits/stdc.h> using namespace std;struct node{int num;node* next; };// 创建链表 node* CreatList(){int x;node *head new node(); // 创建头节点head->next NULL;node *tail head; // 尾指针初始指向头节点while…

LabVIEW Val (Sgnl) 属性

在 LabVIEW 事件驱动架构中&#xff0c;Val (Sgnl) 属性&#xff08;Value (Signaling)&#xff09;是实现编程触发与用户交互行为一致性的关键技术。与普通 Value 属性不同&#xff0c;Val (Sgnl) 在修改控件值的同时强制生成值改变事件&#xff0c;确保程序逻辑与 UI 交互保持…

04.MySQL数据类型详解

MySQL数据类型详解 文章目录 MySQL数据类型数据类型分类数值类型 tinyint类型bit类型float类型decimal类型 字符串类型 char类型varchar类型char和varchar比较 时间日期类型enum和set类型数据类型选择的进阶技巧常见误区与解决方案性能优化与最佳实践 MySQL数据类型 数据类型…

Spring AI 之对话记忆(Chat Memory)

大型语言模型&#xff08;LLMs&#xff09;是无状态的&#xff0c;这意味着它们不会保留关于之前交互的信息。当想在多次交互中保持上下文或状态时&#xff0c;这可能会成为一个限制。为了解决这一问题&#xff0c;Spring AI 提供了对话记忆功能&#xff0c;允许你在与大型语言…

Hölder Statistical Pseudo Divergence Proper Hölder Divergence

目录 Hlder Statistical Pseudo DivergenceProper Hlder Divergence Hlder Statistical Pseudo Divergence Hlder Statistical Pseudo Divergence是一种度量两个概率分布 p p p 和 q q q差异的方法&#xff0c;它基于Hlder不等式。定义如下&#xff1a; D α H ( p : q ) 1 …

时序数据库IoTDB基于云原生的创新与实践

概述 Apache IoTDB 是一款独立自研的物联网时序数据库&#xff0c;作为 Apache 基金会的顶级项目&#xff0c;它融合了产学研的优势&#xff0c;拥有深厚的科研基底。IoTDB 采用了端边云协同的架构&#xff0c;专为物联网设计&#xff0c;致力于提供极致的性能。 数据模型 I…

git 如何解决分支合并冲突(VS code可视化解决+gitLab网页解决)

1、定义&#xff1a;两个分支修改了同一文件的同一行代码&#xff0c;无法自动决定如何合并代码&#xff0c;需要人工干预的情况。&#xff08;假设A提交了文件a,此时B在未拉取代码的情况下&#xff0c;直接提交是会报错的&#xff0c;此时需要拉取之后再提交才会成功&#xff…

系统架构设计师(一):计算机系统基础知识

系统架构设计师&#xff08;一&#xff09;&#xff1a;计算机系统基础知识 引言计算机系统概述计算机硬件处理器处理器指令集常见处理器 存储器总线总线性能指标总线分类按照总线在计算机中所处的位置划分按照连接方式分类按照功能分类 接口接口分类 计算机软件文件系统文件类…

聊一聊接口测试中缓存处理策略

目录 一、强制绕过缓存 添加时间戳参数 修改请求头 二、主动清除缓存 清除本地缓存 清除服务端缓存&#xff08;需权限&#xff09; 清除CDN缓存 三、测试缓存逻辑 首次请求获取数据 记录响应头中的缓存标识​​​​​ 验证缓存生效 测试缓存过期​​​​​​​ 四…

机器学习算法-逻辑回归

今天我们用 「预测考试是否及格」 的例子来讲解逻辑回归&#xff0c;从原理到实现一步步拆解&#xff0c;保证零基础也能懂&#xff01; &#x1f3af; 例子背景 假设你是班主任&#xff0c;要根据学生的「学习时间」预测「是否及格」&#xff0c;手上有以下数据&#xff1a;…

【论文解读】CVPR2023 PoseFormerV2:3D人体姿态估计(附论文地址)

论文链接&#xff1a;https://arxiv.org/pdf/2303.17472 源码链接&#xff1a;https://github.com/QitaoZhao/PoseFormerV2 Abstract 本文提出了 PoseFormerV2&#xff0c;通过探索频率域来提高 3D 人体姿态估计的效率和鲁棒性。PoseFormerV2 利用离散余弦变换&#xff08;DC…

DRW - 加密市场预测

1.数据集描述 在本次比赛中&#xff0c;数据集包含加密市场的分钟级历史数据。您的挑战是预测未来的加密货币市场价格走势。这是一项kaggle社区预测竞赛&#xff0c;您可以以 CSV 文件的形式或通过 Kaggle Notebooks 提交您的预测。有关使用 Kaggle Notebooks 的更多详细信息&a…

嵌入式Linux系统中的启动分区架构

在嵌入式Linux系统架构中,Linux内核、设备树(Device Tree)与引导配置文件构成了系统启动的基础核心。如何安全、高效地管理这些关键文件,直接影响到系统的稳定性与可维护性。近年来,越来越多的嵌入式Linux开发者选择将启动相关文件从传统的“混合存放”方式,转向采用独立…

用户资产化视角下开源AI智能名片链动2+1模式S2B2C商城小程序的应用研究

摘要&#xff1a;在数字化时代&#xff0c;平台流量用户尚未完全转化为企业的数字资产&#xff0c;唯有将其沉淀至私域流量池并实现可控、随时触达&#xff0c;方能成为企业重要的数字资产。本文从用户资产化视角出发&#xff0c;探讨开源AI智能名片链动21模式S2B2C商城小程序在…

Spring是如何实现属性占位符解析

Spring属性占位符解析 核心实现思路1️⃣ 定义占位符处理器类2️⃣ 处理 BeanDefinition 中的属性3️⃣ 替换具体的占位符4️⃣ 加载配置文件5️⃣ Getter / Setter 方法 源码见&#xff1a;mini-spring 在使用 Spring 框架开发过程中&#xff0c;为了实现配置的灵活性&#xf…

【大模型面试每日一题】Day 31:LoRA微调方法中低秩矩阵的秩r如何选取?

【大模型面试每日一题】Day 31&#xff1a;LoRA微调方法中低秩矩阵的秩r如何选取&#xff1f; &#x1f4cc; 题目重现 &#x1f31f;&#x1f31f; 面试官:LoRA微调方法中低秩矩阵的秩r如何选取&#xff1f;&#xff1a; #mermaid-svg-g5hxSxV8epzWyP98 {font-family:"…

字节golang后端二面

前端接口使用restful格式&#xff0c;post与get的区别是什么&#xff1f; HTTP网络返回的状态码有哪些&#xff1f; go语言切片与数组的区别是什么&#xff1f; MySQL实现并发安全避免两个事务同时对一个记录写操作的手段有哪些&#xff1f; 如何实现业务的幂等性&#xff08;在…