【裸机开发】中断系统(二)—— Reset 中断服务函数(汇编实现)

这篇具有很好参考价值的文章主要介绍了【裸机开发】中断系统(二)—— Reset 中断服务函数(汇编实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、Reset 中断服务函数的实现步骤

二、汇编实现 Reset 中断服务函数

1、禁止/打开全局中断

2、设置SP指针

3、清除 .bss 段

4、完整 Reset 中断服务函数


一、Reset 中断服务函数的实现步骤

实现 Reset 中断服务函数的基本步骤如下:

  • 设置各个模式下的SP指针。当中断发生后,会进入到对应的工作模式下,每个工作模式下要运行程序,肯定要用到栈,因此我们需要初始化不同模式下的栈指针。
  • 清除 bss 段。
  • 跳转到 main 函数。

有的时候我们为了防止执行中断服务函数的时候,不会被其他更高优先级的中断打断,我们可以在最开始禁止全局中断(禁止 IRQ、FIQ中断),然后在末尾打开全局中断。

  • 禁止全局中断
  • 设置各个模式下的SP指针
  • 清除 bss 段
  • 打开全局中断
  • 跳转到 main 函数

二、汇编实现 Reset 中断服务函数

1、禁止/打开全局中断

这里我们可以操作 CPSR 寄存器来实现,但汇编给我们提供了简单快捷的指令来禁用/打开全局中断

指令 描述
cpsid i 禁止IRQ中断
cpsie i 使能IRQ中断
cpsid f 禁止 FIQ 中断
cpsie f 使能 FIQ 中断

2、设置SP指针

ARM 一共有九种工作模式,但是这里我们不打算一个个设置,只设置一些可能会用到的,比如 SVC、IRQ、USER、SYS 等。因为 SYS 和 USER 模式共用一个SP指针,即共用一个栈,所以二选一设置即可。(每种模式下的栈都给 2 M 大小

每一种模式下的 SP 设置方式都类似:

  • 修改 CPSR 寄存器切换到某一模式下
  • 设置该模式下的SP指针(R13寄存器)

【裸机开发】中断系统(二)—— Reset 中断服务函数(汇编实现)

/* 切换到 SVC 模式 */
mrs r0, cpsr                @ 将 cpsr 寄存器的内容读取到 r0 寄存器
bic r0, r0, #0x1f           @ 将 r0 的低五位清零,运算结果放到 r0
orr r0, r0, #0x13           @ 让 r0 的低五位或上 10011(0x13),结果保存到 r0
msr cpsr, r0                @ 将 r0 的值写入到 cpsr 寄存器
ldr sp,=0x80200000          @ 设置栈指针

/* 切换到 SYS 模式 */
mrs r0, cpsr                @ 将 cpsr 寄存器的内容读取到 r0 寄存器
bic r0, r0, #0x1f           @ 将 r0 的低五位清零,运算结果放到 r0
orr r0, r0, #0x1f           @ 让 r0 的低五位或上 11111(0x1f),结果保存到 r0
msr cpsr, r0                @ 将 r0 的值写入到 cpsr 寄存器
ldr sp,=0x80400000          @ 设置栈指针

/* 切换到 IRQ 模式 */   
mrs r0, cpsr                @ 将 cpsr 寄存器的内容读取到 r0 寄存器
bic r0, r0, #0x1f           @ 将 r0 的低五位清零,运算结果放到 r0
orr r0, r0, #0x12           @ 让 r0 的低五位或上 10010(0x12),结果保存到 r0
msr cpsr, r0                @ 将 r0 的值写入到 cpsr 寄存器
ldr sp,=0x80600000          @ 设置栈指针

3、清除 .bss 段

4、完整 Reset 中断服务函数

/* 复位中断 */ 
Reset_Handler:
    cpsid i                     /* 禁止IRQ */
    cpsid f                     /* 禁止FIQ */

    /* 切换到 SVC 模式 */
    mrs r0, cpsr                @ 将 cpsr 寄存器的内容读取到 r0 寄存器
    bic r0, r0, #0x1f           @ 将 r0 的低五位清零,运算结果放到 r0
    orr r0, r0, #0x13           @ 让 r0 的低五位或上 10011(0x13),结果保存到 r0
    msr cpsr, r0                @ 将 r0 的值写入到 cpsr 寄存器
    ldr sp,=0x80200000          @ 设置栈指针

    /* 切换到 SYS 模式 */
    mrs r0, cpsr                @ 将 cpsr 寄存器的内容读取到 r0 寄存器
    bic r0, r0, #0x1f           @ 将 r0 的低五位清零,运算结果放到 r0
    orr r0, r0, #0x1f           @ 让 r0 的低五位或上 11111(0x1f),结果保存到 r0
    msr cpsr, r0                @ 将 r0 的值写入到 cpsr 寄存器
    ldr sp,=0x80400000          @ 设置栈指针

    /* 切换到 IRQ 模式 */   
    mrs r0, cpsr                @ 将 cpsr 寄存器的内容读取到 r0 寄存器
    bic r0, r0, #0x1f           @ 将 r0 的低五位清零,运算结果放到 r0
    orr r0, r0, #0x12           @ 让 r0 的低五位或上 10010(0x12),结果保存到 r0
    msr cpsr, r0                @ 将 r0 的值写入到 cpsr 寄存器
    ldr sp,=0x80600000          @ 设置栈指针

    /* bss 段清零 */
    ldr r0, =__bss_start
    ldr r1, =__bss_end
    mov r2, #0
    bl bss_loop                 @ 跳转到 bss_loop,LR寄存器自动保存下一条指令地址

    cpsie f                     /* 使能FIQ */
    cpsie i                     /* 使能IRQ */

    b main                      @ 跳转到 main 函数

bss_loop:
    stmia, r0!, {0}
    cmp r0, r1
    bne bss_loop

    mov pc, lr                  @ 清零完毕后回到原位置

跳转指令参考:b、bl 跳转指令文章来源地址https://www.toymoban.com/news/detail-495752.html

到了这里,关于【裸机开发】中断系统(二)—— Reset 中断服务函数(汇编实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 汇编十一、汇编实现外部中断

    (1)实现8颗LED灯呈流水灯依次被点亮;静态数码管通过按键按下,显示数值发生改变,通过按键依次显示0-9。 (2)按键检测采用外部中断检测。 (1)51单片机P1端口接八个共阴极LED灯,即IO口输出高电平,LED点亮。 (1)P0端口连接静态数码管(JP3) (2)IO口对应数码段。 P0.0对应a P0.1对

    2024年02月05日
    浏览(32)
  • 基于IMX6ULLmini的Linux裸机开发系列五:通用中断控制器(GIC)

    目录 GIC结构 获取GIC中断控制器基地址 方法一:查询芯片数据手册 方法二:查询cp15协处理器 CBAR寄存器 SCTLR 寄存器 VBAR寄存器 GIC用于管理单核或多核芯片中的中断资源 ARM公司开发了4 个版本GIC规范 ,V1~V4 ARMv7-A内核搭配GIC-400使用 GIC结构 GIC官方手册:ARM® Generic Interrupt Contr

    2024年02月12日
    浏览(37)
  • 【ARM 裸机】汇编 led 驱动之烧写 bin 文件

    bin 文件烧写到哪里呢?使用 STM32 的时候烧写到内部 FLASH,6ULL 没有内部 FLASH,是不是就不能烧写呢?不,6ULL 支持 SD卡、EMMC、NAND FLASH、NOR FLASH 等方式启动,在裸机学习的工程中,选择 SD卡启动,所以将 bin 文件烧写到 SD卡中。 烧写并不是将 bin 文件直接拷贝到 SD卡中,而是

    2024年04月28日
    浏览(34)
  • [驱动开发]gpio子系统及中断实现led亮灭

    编写LED灯的驱动,使用GPIO子系统,里面添加按键的中断处理 1.应用程序发送指令控制发光二极管亮灭 2.按键1按下,led1电位反转;按键2按下,led2电位反转;按键3按下,led3电位反转   

    2024年02月14日
    浏览(75)
  • S5PV210 | 裸机汇编LED流水灯实验

    目录 S5PV210 | 裸机汇编LED流水灯实验 开发板: 1.原理图 2.Datasheet相关 3.代码 3-1. 代码实现(流水灯,仅作演示) 3-2.工具 mkv210_image 代码 4.运行 SD卡启动 5.参考 上图中,当按下 POWER 键后, VDD_5V 和 VDD_IO 会产生 5V 和 3.3V 的电压,其中 D26 无须 GPIO 控制,为常亮状态,即我们所说的

    2024年02月03日
    浏览(40)
  • linuxARM裸机学习笔记(4)----GPIO中断以及定时器中断实验

    这个表里面存放的都是中断向量,中断服务程序的入口地址或存放中断服务程序的首地址成为中断向量。中断向量表是一系列中断服务程序入口地址组成的表,当某个中断触发的时候会自动跳转到中断向量表对应的中断服务程序的入口。 2.NVIC(内嵌向量中断控制器) 在IMU6U的中

    2024年02月14日
    浏览(38)
  • 韦东山老师 RTOS 入门课程(一)RTOS 介绍,熟悉裸机的汇编逻辑

    课程链接:韦东山直播公开课:RTOS实战项目之实现多任务系统 第1节:裸机程序框架和缺陷_哔哩哔哩_bilibili 裸机:固定顺序执行。 中断:可以一直专心做循环里的事情,直到触发中断。也可以中断里设立 flag 在循环里检测执行,防止中断超时。 定时器:太多个任务的时候不

    2024年02月12日
    浏览(36)
  • 服务器(裸机)如何安装Centos 7系统

    下载UltraISO制作工具并安装 再准备一个空U盘(注意:这个操作会将U盘内数据全部删除操作之前请将U盘内文件备份) 插入U盘 打开UltraISO软件,选择 “文件” - “打开” 选择linux系统镜像(iso文件)并 “打开” 选择 “启动” - “写入硬盘镜像”,硬盘驱动器选择做为系统盘

    2024年02月13日
    浏览(36)
  • ARM裸机 - 中断处理编程实战_arm断电文件内容丢失

    #define exception_vector_table_base 0xD0037400 #define exception_reset (exception_vector_table_base + 0x00) #define exception_undef (exception_vector_table_base + 0x04) #define exception_sotf_int (exception_vector_table_base + 0x08) #define exception_prefetch (exception_vector_table_base + 0x0C) #define exception_data (exception_vector_table_base + 0x10) #de

    2024年04月16日
    浏览(80)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包