2440栈的实现类型、b系列指令、汇编掉用c、c调用汇编、切换工作模式、初始化异常向量表、中断处理、

embedded/2024/9/23 11:21:28/

我要成为嵌入式高手之4月11日51ARM第六天!!
————————————————————————————

b指令

标签:表示这条指令的名称,可跳转至标签

b指令:相当于goto,可随意跳转

如:finish为标签,b finish跳转至该位置

finish
    b finish   

bl指令:跳转之后将跳转前的位置存储到 lr(链接寄存器) 寄存器中

bx指令:将某个寄存器的保存的地址写入 pc 寄存器 

练习:用汇编写出1~100的累加和

	area reset, code, readonlycode32entrymov r0, #0mov r1, #0loopadd r1, r1, r0add r0, #1cmp r0, #100ble loopfinishb finishend

2440栈的实现类型 

        2440实现保护和恢复现场使用的栈是数组栈,即用一段连续的内存空间为栈提供空间。从数组栈的具体实现来看入栈的方式有四种做法:

  1. 空增:先写入数据,再让栈指针自增;
  2. 空减:先写入数据,再让栈指针自减;
  3. 满增:先让栈指针自增,再写入数据;
  4. 满减:先让栈指针自减,再写入数据。

        arm体系采用的方案是满减,但是在进行操作之前,我们必须告诉2440栈底的位置,这里我们把栈底设置为0x40001000,从地址0x40000000开始的0x1000这段内存空间对应的是2440内部的一段ram,总共4k。实际能够使用的内存空间为[0x40000000~0x40000FFF],

设置栈底指针寄存器: ldr sp =0x40001000

入栈保护指令stmfd(STMDB)

STMFD<c> <Rn>{!}, <registers>

其中Rn表示栈底指针寄存器,< registers >表示需要入栈保护的寄存器,!表示入栈之后sp自动自减。如:stmfd sp!, {r0, r1, r2, r3-r12, lr}
 

出栈恢复指令ldmfd(LDM/LDMIA/)

LDMFD<c> <Rn>{!}, <registers>

中Rn表示栈底指针寄存器,< registers >表示需要入栈保护的寄存器,!表示出栈之后sp自动自增。如:ldmfd sp!, {r0, r1, r2, r3-r12, lr}

汇编程序中调用c程序函数

步骤:

1、先用 import 声明c函数

        如:    import c_add

2、入栈保护{r0 - r12}

3、若是函数参数小于4个时,通过 r0 ~ r3 寄存器进行传参

4、函数调用完的返回值结果通过 r0 寄存器返回

5、若参数个数大于4个,从第五个开始要通过栈进行参数传参

6、出栈恢复{r0 - r12}

	import c_addstmfd sp!, {r0-r12}mov r0, #1mov r1, #2 mov r2, #3mov r3, #4 mov r4, #5stmfd sp!, {r4}bl c_addldmfd sp!, {r4}ldmfd sp!, {r0-r12

c程序中掉用汇编函数

1、import main

2、b main

3、export 汇编函数名

4、在main中声明汇编函数

5、在汇编函数结尾bx lr

如何切换工作模式

1、把r0中低5位清零

2、把r0中低五位设置为10000(user模式)

3、用msr指令将r0的值写入cpsr寄存器

	ldr sp, =0x40001000bic r0, r0, #0x1Forr r0, r0, #0x10msr cpsr_c, r0

为什么此处sp变为0?

答:此时的sp为sp_svc,不是user模式下的sp,故需要设置sp_user,且要从栈顶往后走1k

	ldr sp, =0x40001000bic r0, r0, #0x1Forr r0, r0, #0x10msr cpsr_c, r0ldr sp, =0x40001000sub sp, sp, #1024

cpsr中指令

msr指令:写入cpsr

mrs指令:读取cpsr中数据

启动代码

异常向量表

初始化代码:

	preserve8area reset, code, readonlycode32entry;用8个代码占用异常向量表的八个格式b startnopnopnopnopnopnopnopstartldr sp, =0x40001000;状态切换到user模式下mrs r0, cpsrbic r0, #0x1Forr r0, #0x10msr cpsr_c, r0ldr sp, =0x40001000sub sp, sp, #1024import mainb mainfinishb finishend

中断处理

中断类型:

软件中断SWI

SWI指令:发出一个软件中断,用法:SWI  #立即数

                  作用:产生一个软件中断

                  流程 :产生一个异常,进入svc模式;查询异常向量表(找软件中断0x08)

	;用8个代码占用异常向量表的八个格式b startnopb do_swinopnopnopnopnopstart;设置的是svc下的栈指针寄存器ldr sp, =0x40001000;状态切换到user模式下mrs r0, cpsrbic r0, #0x1Forr r0, #0x10msr cpsr_c, r0ldr sp, =0x40001000sub sp, sp, #1024import mainb maindo_swiimport swi_handlestmfd sp!, {r1-r12, lr}bl swi_handleldmfd sp!, {r1-r12, pc}^;^含义:不但要恢复现场,并且要恢复之前的工作模式export asm_swi
asm_swiswi #10bx lr;在写完函数之后都应该加上bx lr:将lr写入pc中

IRQ快速中断

初始化IRQ模式栈指针寄存器

	preserve8area reset, code, readonlycode32entry;用8个代码占用异常向量表的八个格式b startnopb do_swinopnopnopb do_interruptnopstart;设置的是svc下的栈指针寄存器ldr sp, =0x40001000;状态切换到user模式下mrs r0, cpsrbic r0, #0x1Forr r0, #0x12;切换到IRQ模式bic r0, r0, #(1 << 7);将中断允许清零,意为允许中断msr cpsr_c, r0;初始化的是IRQ模式下的栈指针寄存器ldr sp, =0x40001000sub sp, sp, #1024mrs r0, cpsrbic r0, #0x1Forr r0, #0x10msr cpsr_c, r0ldr sp, =0x40001000sub sp, sp, #2048import mainb maindo_interruptimport interrupt_handlesub lr, lr, #4;查询中断类型表得出快速中断需要lr寄存器的值-4stmfd sp!, {r1-r12, lr}bl interrupt_handleldmfd sp!, {r1-r12, pc}^do_swiimport swi_handlestmfd sp!, {r1-r12, lr}bl swi_handleldmfd sp!, {r1-r12, pc}^;^含义:不但要恢复现场,并且要恢复之前的工作模式export asm_swi
asm_swiswi #10bx lr;在写完函数之后都应该加上bx lr:将lr写入pc中	finishb finishend

MINI2440

将软件写入MINI2440,需要修改的操作

若将软件下载进板子成功,会出现如此字样

调试结果与软件调试结果应一致


http://www.ppmy.cn/embedded/7284.html

相关文章

Python相关性分析

分析连续变量之间线性相关程度的强弱&#xff0c;并用适当的统计指标表示出来的过程称为相关分析。 可以直接绘制散点图&#xff0c;或者绘制散点图矩阵&#xff0c;或者计算相关系数来进行相关分析。 相关系数的计算如下所示&#xff1a; 示例数据&#xff1a; 计算百合酱蒸…

堆的概念、堆的向下调整算法、堆的向上调整算法、堆的基本功能实现

目录 堆的介绍 堆的概念 堆的性质 堆的结构 堆的向下调整算法 基本思想&#xff08;以建小堆为例&#xff09; 代码 堆的向上调整算法 基本思想&#xff08;以建小堆为例&#xff09; 代码 堆功能的实现 堆的初始化 HeapInit 销毁堆 HeapDestroy 打印堆 HeapPrint …

【从浅学到熟知Linux】基础IO第四弹=>动静态库(含第三方动静态的使用、自制动静态库、关于动静态库加载调用原理)

&#x1f3e0;关于专栏&#xff1a;Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程等内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 静态库静态库的介绍及使用方法自制静态库使用第三方提供的静态库 动态库动态库的介绍及使用方法自制动态库…

排序 “贰” 之选择排序

目录 ​编辑 1. 选择排序基本思想 2. 直接选择排序 2.1 实现步骤 2.2 代码示例 2.3 直接选择排序的特性总结 3. 堆排序 3.1 实现步骤 3.2 代码示例 3.3 堆排序的特性总结 1. 选择排序基本思想 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个…

智慧煤矿/智慧矿区视频汇聚存储与安全风险智能分析平台建设思路

一、建设背景 目前我国非常重视煤矿安全生产&#xff0c;并投入大量资金用于煤矿安全综合远程监控系统的研发。视频监控系统作为实现煤矿智能化无人开采的关键系统与煤矿安全生产的多系统协同分析与处理的关键信息源&#xff0c;在智慧矿山管控平台的建设中发挥着重要的作用。…

SpringBoot多数据源基于mybatis插件(三)

SpringBoot多数据源基于mybatis插件&#xff08;三&#xff09; 1.主要思路2.具体实现 1.主要思路 MyBatis的插件机制允许你在MyBatis的四大对象&#xff08;Executor、StatementHandler、ParameterHandler和ResultSetHandler&#xff09;的方法执行前后进行拦截&#xff0c;并…

使用 Cucumber框架进行BDD测试的一些项目

BehatMage 项目地址: https://github.com/MageTest/BehatMage 不过该项目在GitHub中有超过10年没有更新了。 项目介绍&#xff1a; BehatMage项目介绍 BehatMage是一个基于Behat的Magento测试框架&#xff0c;用于自动化测试Magento电子商务平台的功能和性能。Behat是一个行…

T3BI T3BI RS-232通讯操作指南与培训PPT课件

T3BI T3BI RS-232通讯操作指南与培训PPT课件