嵌入式 - ARM3

一、arm启动C语言

1. 配置异常向量表

2. 实现了软件中断的部分

注:

        ldmfd sp!, {r0-r12, lr}                ==                 ldmfd sp!, {r0-r12, pc}^   
bx lr     
       

左半部分:
繁琐易理解的返回方式:
先弹出所有通用寄存器和lr        =>        再用bx lr指令返回

右半部分:
高效简洁的返回方式:
一句指令实现回复所有通用寄存器(r0-r12),将保存的lr直接弹入pc实现返回跳转(pc),恢复了中断发生时的处理器状态(^ 实现 程序状态寄存器cpsr 的恢复)

软件中断需要:
主函数中调用软中断 => 触发函数接口 => 执行软中断处理 => 返回主函数 

3. 配置start与main.c的链接

异常向量表设置0x00 为复位,直接进入start部分

分段解析

1. 初始化supervisor模式栈

ldr sp, =0x40001000			// 初始化栈指针,复位后默认为supervisor模式

        在进入主函数操作前,需要对当前默认的supervisor模式设置一个有效的栈空间,确保能够进行函数调用和临时数据存储
通过ldr命令将预先分配的地址(0x40001000)存入到栈指针

2. 声明主函数

import main					// 声明主函数

        告知汇编器,符号main是在C语言文件中定义的,定义后可以调用

3. 切换至user模式

1. mrs,msr

手册496

	mrs r0, cpsr				// 将当前状态寄存器备份到r0中msr cpsr_c, r0              // 改写后的值写回cpsr的控制域,完成模式切换

mrs指令将整个cpsr的值备份到r0中

        MRS{cond} <Rd>, <PSR>

        mrs <目标寄存器>, <CPSR / SPSR>

msr指令将修改后的值写回cpsr,完成CPU切换到user模式

        MSR{cond} <PSR>_<fields>, <Rm>

       msr  <CPSR / SPSR>_修改的部分, 源寄存器
<fields>:c:控制域,低8位包含模式位和中断使能位
x:扩展域
s:状态域,条件标志位NZCV
f:标志域,条件标志位NZCV

2. 工作模式配置
bic r0, r0, #(0x1F << 0)    // 更改arm工作模式,手册Label - ARM processor // 低五位清零,准备更改模式
orr r0, r0, #(0x10 << 0)    // 更改工作模式为10000,为user模式

arm工作模式:手册Label - ARM processor

3. 响应中断配置
bic r0, r0, #(1 << 7)

清除I位,确保在user模式下​开启IRQ中断​,否则user模式无法响应中断

4. 初始化user模式下的栈指针

ldr sp, =0x40001000			// 初始化user模式下的栈指针
sub sp, sp, #1024			// 与spv模式的栈相隔一段距离

        为即将运行的主函数设置独立的栈空间
先与superviosr模式设置成同一个地址,在此基础上位移一段字节防止相互覆盖

5. 跳转并调用执行main函数

b main						// 执行主函数

4. 配置main.c

1. 主函数内容

        目前只实现完成软中断的跳转

2. 软中断处理

        可通过 .s 的软中断跳转到软中断处理函数部分并成功返回

3. 函数声明

        除了主函数与软中断处理函数的声明外,还需声明在 .s 文件中的软中断触发响应部分

5. 魔术棒设置

Target:设置ROM1地址
Linker:勾选使用设置的地址 “Use Memory Layout from Target Dialog”
Debug :取消勾选 “run to main()” ,使运行时从.s开始

二、安装环境

1. visual studio code

ARM插件:Chinese(Simplified)
Arm Assembly

C语言插件:Back & Forth
C / C++
C / C++ Extension Pack
C / C++ Themes
CMake
CMake Tools
highlight - words
Makefile Tools

2. Ubuntu下的编译器

确认版本   arm-linux-gnueabihf-gcc -v

3. filezilla上传文件

上传步骤:文件 => 站点管理器 => 新站点

右侧win本地站点,左侧Ubuntu远程站点,选择对应文件夹,右键点击上传文件夹上传

复习

1、arm汇编调用c语言函数以及c语言函数调用汇编编写的函数,函数的参数和返回值如何处理?

1. 汇编调用C语言

       1. 参数:
前四个参数通过寄存器r0,r1, r2,r3传递
后续参数通过栈传递,通过压栈出栈实现传参
2. 返回值:
通过寄存器r0返回

2. C语言调用汇编

        1. 参数
调用规则与 汇编调用C语言一致

        2. 返回值
汇编函数直接读取寄存器或栈位置
需保存被调用的寄存器(r0-r12,lr)否则会破坏原状态

2、arm内核中有几种异常,分别是什么,会使内核切换到那种工作模式

异常中断含义工作模式
reset复位中断supervisor
undefined未定义指令undifined
sortware软件中断supervisor
prefetch指令预取中止abort
data数据访问中止abort
IRQ外部普通中断请求IRQ
FIQ外部快速中断请求FIQ

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

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

相关文章

如何通过标签和分类提升知识复用效率

通过标签和分类提升知识复用效率&#xff0c;其核心在于构建一个结构化与灵活性兼备的知识组织体系。这需要将分类的“确定性”与标签的“多维性”进行有效结合&#xff0c;为知识的存储与检索建立清晰的“骨架”和丰富的“神经网络”。具体实践中&#xff0c;要求我们进行顶层…

ZYNQ PS读写PL BRAM

一、实验室任务 本章的实验任务是 PS 将数据写入BRAM&#xff0c;然后从 BRAM 中读出数据&#xff0c;并通过串口打印出来&#xff1b;与此同时&#xff0c;PL 从通过自定义ip核从BRAM中同样读出数据&#xff0c;并通过ILA 来观察读出的数据与串口打印的数据是否一致。这里是通…

LinuxC++项目开发日志——高并发内存池(5-page cache框架开发)

PageCachepage cache 设计逻辑一、PageCache 的核心定位&#xff1a;理解它与 CentralCache 的本质区别二、PageCache 的内存分配流程&#xff1a;从 “精确匹配” 到 “拆分适配”三、PageCache 的内存释放流程&#xff1a;合并小 Span&#xff0c;解决内存碎片问题page cache…

Matplotlib:绘制你的第一张折线图与散点图

Matplotlib入门&#xff1a;绘制你的第一张折线图与散点图导语 欢迎来到 Matplotlib 的世界&#xff01;对于任何使用 Python 进行数据分析或机器学习的人来说&#xff0c;数据可视化都是一项至关重要的技能。Matplotlib 是 Python 中最流行、最基础的可视化库&#xff0c;它功…

MySQL保姆级安装教程

MySQL 安装详细文档&#xff0c;适用于 Windows、macOS 和 Linux 系统&#xff0c;包含了从下载到验证安装的完整步骤&#xff1a; 一、Windows 系统安装 MySQL 1. 下载 MySQL 安装包 访问 MySQL 官方下载页&#xff1a;https://dev.mysql.com/downloads/installer/选择 “MySQ…

重塑你的大脑:从理解突触到掌控人生

重塑你的大脑&#xff1a;从理解突触到掌控人生你是否曾对自己的某些行为感到无力&#xff1f;明知应该早睡&#xff0c;却总忍不住刷手机&#xff1b;下定决心要锻炼&#xff0c;却常常半途而废。这些困扰我们的习惯&#xff0c;并非简单的意志力问题&#xff0c;其根源深深植…

《C++进阶之STL》【哈希表】

【哈希表】目录前言------------概念介绍------------1. 什么是哈希&#xff1f;------------核心术语------------一、哈希函数1. 哈希函数的核心特点是什么&#xff1f;2. 哈希函数的设计目标是什么&#xff1f;3. 常见的哈希函数有哪些&#xff1f;直接定址法除法散列法乘法…

机器学习-模型验证

验证泛化误差 在一个数据集上估计误差&#xff0c;数据集只能使用一次验证数据集&#xff1a;可以被使用多次 基本是训练数据集中的一部分 当使用“test”时&#xff0c;大多数时候指的是验证数据集 生成验证数据集方法 1、数据随机分入训练集或验证集 总是随机选n%的数据作为验…

Qt中自定义控件的三种实现方式

Qt中自定义控件的三种实现方式 在 Qt 应用开发中&#xff0c;标准控件往往无法满足所有需求。自定义控件允许开发者创建具有特定功能和外观的控件&#xff0c;提高代码复用性和界面一致性。Qt 提供了多种方式来开发自定义控件&#xff0c;从简单的组合现有控件到完全自定义绘制…

少儿舞蹈小程序(14)在线预约

目录1 创建数据模型2 搭建预约按钮3 搭建表单4 搭建管理功能整体效果总结目前我们的首页已经开发完毕了&#xff0c;包含轮播图、机构介绍、校区展示、作品与活动展示功能。家长在小程序了解了机构的基本情况之后&#xff0c;下一步就是参加试听&#xff0c;在线下真实体验一下…

TDengine 数据写入详细用户手册

TDengine 数据写入用户手册 概述 TDengine 提供了多种灵活的数据写入方式&#xff0c;以满足不同应用场景的需求。本手册将以智能电表场景为例&#xff0c;向初学者详细介绍各种数据写入方法的使用。 智能电表场景设定 假设我们需要为智能电表系统建立数据库&#xff1a; …

PTA 天梯赛 7-43:字符串关键字的散列映射

【题目来源】 https://pintia.cn/problem-sets/15/exam/problems/type/7?problemSetProblemId890 【题目描述】 给定一系列由大写英文字母组成的字符串关键字和素数 P&#xff0c;用移位法定义的散列函数 H(Key) 将关键字 Key 中的最后 3 个字符映射为整数&#xff0c;每个字…

Python核心技术开发指南(065)——with语句

版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl with语句定义 with语句是Python中用于简化资源管理的语法结构,通过上下文管理器(实现__enter__()和__exit__()方法的对象)确保资源在使用完毕后被正确释放,无论代码块是否发生异常。其核心作…

从基础到高级:一文快速认识MySQL UPDATE 语句

在数据库日常运维与开发中&#xff0c;数据更新是与数据查询同等重要的核心操作。MySQL 的 UPDATE 语句凭借其灵活的语法结构和强大的功能&#xff0c;能够满足从简单字段修改到复杂关联表更新的各类需求。然而&#xff0c;若使用不当&#xff0c;不仅可能导致数据一致性问题&a…

材料基因组计划(MGI)入门:高通量计算与数据管理最佳实践

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;注册即送-H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 摘要 材料基因组计划&#xff08;Materials Genome Ini…

Vision Transformer (ViT) :Transformer在computer vision领域的应用(一)

在图像领域,CNN卷积神经网络结构已经成为了标配,所有的模型都是基于CNN来构造的。 而在NLP领域,自从Transformer横空出世之后,基本上也统治了NLP的各个领域。 基于Transformer的强大,一些论文的工作都是将Transformer也应用到CV领域,在这篇论文:AN IMAGE IS WORTH 16X1…

自动驾驶中的传感器技术45——Radar(6)

本文详细介绍4D雷达相关解决方案&#xff0c;4D雷达关键词&#xff1a;4D Imaging Radar 1、4D雷达特点 图1 4D雷达 vs 3D雷达图2 4D雷达虚拟通道数量不断增加图3 4D雷达 vs 3D雷达 vs 摄像头和激光雷达图4 毫米波雷达在不同驾驶等级下的应用需求Ref&#xff1a;https://pdf.d…

浏览器调试工具详解

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

代码审计-PHP专题原生开发SQL注入1day分析构造正则搜索语句执行监控功能定位

挖掘技巧&#xff1a; -语句监控-数据库SQL监控排查可利用语句定向分析 -功能追踪-功能点文件SQL执行代码函数调用链追踪 -正则搜索-(update|select|insert|delete|).*?where.* 如何快速的在多个文件代码里面找脆弱&#xff1a; 1、看文件路径 2、看代码里面的变量&#…

Linux中:调试器gdb/cgdb的使用

引言在追寻光的路上不断前行&#xff0c;详细介绍Linux下gdb/cgdb的使用。一、准备• 程序的发布方式有两种&#xff0c;默认是 debug 模式和 release 模式。Linux gcc/g编译出来的二进制程序默认是release模式• 要使用gdb调试&#xff0c;必须在源代码生成⼆进制程序的时候加…