Linux环境下ARM开发

目录

  • 前言
  • ARM启动及开发基础
    • 1.Cortex-A架构
    • 2.启动方式
    • 3.汇编基础
    • 4.Makefile语法基础
    • 5.Makefile补充
    • 6.编译下载
  • 结语

前言

  主要介绍基于linux开发环境下,如何开发ARM A7


ARM启动及开发基础

1.Cortex-A架构

1)Cortex-A7运行模式

模式说明
User(USR)用户模式,非特权模式,大部分程序运行的时候就处于此模式。
FIQ快速中断模式,进入FIQ中断异常
IRQ一般中断模式。
Supervisor(SVC)超级管理员模式,特权模式,供操作系统使用。
Monitor(MON)监视模式?这个模式用于安全扩展模式。
Abort(ABT)数据访问终止模式,用于虚拟存储以及存储保护。
Hyp(HYP)超级监视模式?用于虚拟化扩展。
Undef(UND)未定义指令终止模式。
System(SYS)系统模式,用于运行特权级的操作系统任务

2)寄存器组
①包含低寄存器组(R0-R7)、高寄存器组(R8-R5)、堆栈指针SP、链接寄存器LR、程序计数器PC、当前程序状态寄存器CPRS、备份程序状态寄存器SPSR
②除了FIQ模式,其他工作模式共用通用寄存器。SPSR 的作用是当发生异常时备份 CPSR 的状态,也就是说 SPSR 保存的是执行异常处理函数前的 CPSR 的值。CPRS寄存器的M[4:0]为处理器模式控制位。
在这里插入图片描述

2.启动方式

1)启动方式选择
在这里插入图片描述
当mode选择10即内部boot模式时,CFG引脚设置
在这里插入图片描述

2)镜像组成
①Image Vector Table简称IVT,IVT里面包含了一系列的地址信息,这些地址信息在ROM 中按照固定的地址存放着。
在这里插入图片描述

②Boot data,启动数据,包含了镜像要拷贝到哪个地址,拷贝的大小是多少等等
③Device configuration data,简称 DCD,设备配置信息,重点是 DDR3 的初始化配置
④用户代码可执行文件,比如 led.bin
imxdownload 所生成的 load.imx 就是在 led.bin 前面加上 IVT+Boot data+DCD。内部 BootROM 会将 load.imx 拷贝到 DDR 中,用户代码是要一定要从 0X87800000 这个地方开始的,因为链接地址为 0X87800000,load.imx 在用户代码前面又有 (4-1)3KByte 的 IVT+Boot Data+DCD 数据,因此 load.imx 在 DDR 中的起始地址就是 0X87800000-3072=0X877FF400。

3.汇编基础

1)label:instruction @ comment
2)函数名:
函数体
返回语句
3)伪操作

指令功能
.byte定义单字节数据,比如.byte 0x12。
.short定义双字节数据,比如.short 0x1234。
.long定义一个 4 字节数据,比如.long 0x12345678。
.equ赋值语句,格式为:.equ 变量名,表达式,比如.equ num, 0x12,表示 num=0x12。
.align数据字节对齐,比如:.align 4 表示 4 字节对齐。
.end表示源文件结束。
.global定义一个全局符号,格式为:.global symbol,比如:.global _start。

4)存储区访问指令
在这里插入图片描述
5)跳转指令
在这里插入图片描述

6)数据传输指令
在这里插入图片描述

7)逻辑运算指令
在这里插入图片描述

8)压栈和出栈指令
在这里插入图片描述

9)算术运算指令
在这里插入图片描述

4.Makefile语法基础

1)目标与依赖
[目标]:[依赖]
[命令]

2)伪目标(不期待生成目标文件)
.PHONY:[依赖]

3)使用变量
①“=”:延迟赋值,该变量只有在调用的时候,才会被赋值
②“:=”:直接赋值,延迟赋值相反,使用直接赋值的话,变量的值定义时就已经确定了。
③“?=”:若变量值为空,则进行赋值,通常用于设置默认值
④“+=”:追加赋值,可以往变量后面增加新的内容
⑤ $(变量名):调用变量

4)改造规则
①%是通配符功能类似于*
② $@代表目标
③ $<代表第一个依赖文件
④ $^表示所有的依赖文件

5)使用分支

ifeq(arg1, arg2)       #若arg1与arg2值相同则为真
分支1
else
分支2
endif

6)使用函数
格式: ( 函数名参数 ) 或者 (函数名 参数)或者 (函数名参数)或者{函数名 参数}
① $ (notdir 文件名):去除文件路径中的目录部分
② $(wildcard 匹配规则):用于获取文件列表,并使用空格分隔开
③ $(patsubst 匹配规则, 替换规则, 输入的字符串):当输入的字符串符合匹配规则,那么使 用替换规则来替换字符串
④ $(foreach < var>, < list >,< text>):是把参数< list>中的单词逐一取出来放到参数< var>中,然后再执行< text >所包含的表达式。< text>所返回的每个字符串所组成的整个字符串将会是函数 foreach 函数的返回值

5.Makefile补充

1)调用数学库用“-L”指定库所在的目录

LIBPATH := -lgcc -L /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/lib/gcc/arm-linux-gnueabihf/4.9.4

2)-Wall选项意思是编译后显示所有警告
3)-nostdlib 不连接系统标准启动文件和标准库文件.只把指定的文件传递给连接器
4)加入选项“-fno-builtin”表示不使用内建函数
5)添加了选项“-Wa,-mimplicit-it=thumb”,避免报错thumb(拇指?) 条件指令应该在IT(?)块中

$(CC) -Wall -Wa,-mimplicit-it=thumb -nostdlib -fno-builtin -c -O2 $(INCLUDE) -o $@ $<

4)加入了“-march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard”指令,这些指令用于
指定编译浮点运算的时候使用硬件 FPU

 $(CC) -Wall -march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard -Wa,-mimplicit-it=thumb -nostdlib -fno-builtin -c -O2 $(INCLUDE) -o $@ $<

6.编译下载

1)arm-linux-gnueabihf-gcc编译文件

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

其中“-g”选项是产生调试信息,GDB 能够使用这些调试信息进行代码调试。“-c”选项是编译源文件,但是不链接。“-o”选项是指定编译产生的文件名字
2)arm-linux-gnueabihf-ld 链接文件

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

-Ttext 就是指定链接地址,“-o”选项指定链接生成的 elf 文件名
3)arm-linux-gnueabihf-objcopy 格式转换

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

“-O”选项指定以什么格式输出,后面的“binary”表示以二进制格式输出,选项“-S”表示不要复制源文件中的重定位信息和符号信息,“-g”表示不复制源文件中的调试信息,最终生成led.bin文件
4)arm-linux-gnueabihf-objdump 反汇编

arm-linux-gnueabihf-objdump -D led.elf > led.dis

“-D”选项表示反汇编所有的段
5)给予烧写软件imxdownload 可执行权限:chmod 777 imxdownload
6)确定要烧写的 SD 卡:ls /dev/sd* (或者lsblk)-> 看分区找到对应卡
7)向SD卡烧写bin文件:./imxdownload led.bin /dev/sdb


结语

有关linux系统移植,见以下文章
https://blog.csdn.net/weixin_44567668/article/details/128507480

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

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

相关文章

Neo4j 数据库管理 数据备份与恢复(头歌)

文章目录 第1关&#xff1a;数据备份与恢复任务描述相关知识数据备份数据导入 编程要求测试说明答案测试前准备Cypher 代码数据备份与导入 第1关&#xff1a;数据备份与恢复 任务描述 本关任务&#xff1a;熟练掌握数据备份与恢复。 相关知识 为了完成本关任务&#xff0c;…

你好!插值查找【JAVA】

1.初次相识 插值查找&#xff08;interpolation search&#xff09;是一种根据待查找关键字在有序数组中的大致位置决定查找范围的查找算法。插值查找与二分查找类似&#xff0c;区别在于插值查找对于待查找关键字在数组中的位置进行估计&#xff0c;从而更精准地定位到待查找关…

Git and solve the problem denied to xx

创建仓库 配置Git git config user.name git config user.email git config MINGW64 /e/GithubCode $ git config --global user.name "name"MINGW64 /e/GithubCode $ git config --global user.email "mailxx.com" 生产ssh ssh-keygen -t rsa -C “xx…

220V转12V60MA红外雷达降压芯片:节能、高效、多功能的解决方案

220V转12V60MA红外雷达降压芯片&#xff1a;节能、高效、多功能的解决方案 在我国&#xff0c;红外雷达技术已广泛应用于各种小型家用电器中&#xff0c;如遥控器、智能家居等。为了满足这些设备对电源电压的需求&#xff0c;推出了一款220V转12V60MA红外雷达降压芯片&#xf…

Java开发分析 JProfiler 14中文 for Mac

JProfiler Mac版新增功能 已添加用于传出请求 的HTTP探测。同步和异步调用都是测量的。支持的HTTP客户端是&#xff1a; java.net.URLConnection中 Java HTTP客户端&#xff08;Java 11&#xff09; Apache HttpClient 4.x Apache Async HttpClient 4.x OkHttp 3.9 Jersey&am…

conda 安装指定Version的指定Build

入下图&#xff0c;我想装cudnn的7.6.5的指定Build版本cuda10.0_0 应该使用如下命令&#xff1a; mamba install cudnn7.6.5cuda10.0_0 没有mamba用conda install也可以

Nacos 注册中心下载到搭建详细步骤【微服务】

文章目录 一、下载与安装二、Nacos 服务注册1. 引入依赖2. 修改配置文件3. 开启 Nacos 注解4. 启动项目 三、Nacos 服务集群1. 模拟多实例部署2. 配置集群属性3. 服务权重配置 四、Nacos 环境隔离五、Nacos 注册中心原理1. Nacos 与 Eureka 比较2. 配置非临时实例 一、下载与安…

【工具分享】| 阅读论文神器 使用技巧 AI润色 AI翻译

文章目录 1 使用技巧1.1 功能一 即时翻译1.2 功能二 文献跳转1.3 功能三 多设备阅读1.4 功能四 小组讨论笔记共享1.5 功能五 个人文献管理 2 其他功能 超级喜欢Readpaper这一款论文阅读软件&#xff0c;吹爆他哈哈 为什么&#xff1f; 当然是他可以解决我们传统阅读论文的种种…

“掌握速卖通平台接口:电商开发的技术巅峰“

一、概述 速卖通平台接口是全球速卖通提供的一套API接口&#xff0c;旨在为开发者提供与速卖通平台进行数据交互的能力。通过使用速卖通平台接口&#xff0c;开发者可以快速构建自己的电商应用程序&#xff0c;并实现与速卖通平台的数据共享和交易流程。本文将详细介绍速卖通平…

springboot+jsp+java房屋销售出租赁网站的ssm设计与实现7xcvq

三、研究方案&#xff08;主要研究内容、目标、研究方法等&#xff09; 主要研究内容 房屋租售网站采用的开发框架为springboot框架&#xff0c;也就是Spring mvc、Spring、MyBatis这三个框架&#xff0c;页面设计用的是jsp技术作为动态页面文件设计&#xff0c;jsp文件里可以对…

借助 DPM 代码扫描的力量解锁医疗设备的可追溯性

在当今的医疗保健系统中&#xff0c;医疗设备的可追溯性变得比以往任何时候都更加重要。为了增强现代医疗保健领域的可追溯性和安全性&#xff0c;UDI 条形码充当唯一设备标识的标准&#xff0c;为医疗设备提供唯一标识符。 DataMatrix 代码&#xff08;或直接零件标记代码&am…

腾讯云避坑——无法远程root登录

因为各种原因&#xff0c;最近需要使用腾讯云来代替阿里云。 但在ubuntu18/20的服务器中&#xff0c;我使用另一个电脑试图用scp命令来拷贝服务器中的一些文件&#xff0c;命令为: scp root服务器ip:文件目录 本地目录但一直显示密码错误。 原因是腾讯云ubuntu系统在创建时并不…