CM3学习-中断

这篇具有很好参考价值的文章主要介绍了CM3学习-中断。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

红叶何时落水

编号为 1-15 的对应系统异常,大于等于 16 的则全是外部中断。具体类型P108
这里的编号指的是中断源,而不是优先级,优先级是可以重定义的
在 NVIC 的中断控制及状态寄存器中,有一个 VECTACTIVE 位段;另外,还有一个特殊功能寄
存器 IPSR。在它们二者的里面,都记录了当前正服务的异常,给出了它的编号。

如果一个发生的异常不能被即刻响应,就称它被“悬起”(pending)。同系统里的挂起

优先级寄存器裁剪,保留高位,低位读回0, 以便于移植,防止优先级反转

应用程序中断及复位控制寄存器(AIRCR)(地址:0xE000_ED00)
31:16 VECTKEY 访问钥匙:任何对该寄存器的写操作,都必须同时把 0x05FA 写入此段,否则写操作被忽略。
10:8 PRIGROUP  优先级分组
2 SYSRESETREQ 请求芯片控制逻辑产生一次复位
0 VECTRESET 复位 CM3 处理器内核(调试逻辑除外),但是此复位不影响芯片上在内核以外的电路

相同的抢占优先级,不同的子优先级,不会发生抢占,只用于解除悬挂状态,当子优先级也一致时,判断中断源的编号

NVIC 中有一个寄存器,称为“向量表偏移量寄存器”(在地址 0xE000_ED08 处), 通过修改它的值就能重定位向量表

中断状态标志位在系统内部,用于标识运行,悬挂,完成状态,可以动态改变,可能会导致硬件层次的死循环

硬 fault 是上文讨论的总线 fault、存储器管理 fault 以及用法 fault 上访的结果。如果这些 fault 的服务例程无法执行,它们就会成为“硬伤”——上访(escalation)成硬 fault。

在 SVC 服务例程执行后,上次执行的 SVC 指令地址可以根据自动入栈的返回地址计算出。找到
了 SVC 指令后,就可以读取该 SVC 指令的机器码,从机器码中萃取出立即数,就获知了请求执行的
功能代号。如果用户程序使用的是 PSP,服务例程还需要先执行 MRS Rn, PSP 指令来获取应用程序的堆栈指针。通过分析 LR 的值,可以获知在 SVC 指令执行时,正在使用哪个堆栈
应用程序执行 SVC 时都是希望需的请求立即得到响应。另一方面,PendSV 则不同,它是可以像普通的中断一样被悬起的(不像SVC 那样会上访)。
OS 可以利用它“缓期执行”一个异常——直到其它重要的任务完成后才执行动作。
悬起 PendSV 的方法是:手工往 NVIC 的 PendSV 悬起寄存器中写 1。悬起后,如果优先级不够高,则将缓期等待执行
PendSV 的典型使用场合是在上下文切换时(在不同任务之间切换)p127
以前使用滴答定时器切换上下文,无法回到被他打断的中断中,可能会长时间的打断优先级低于它的中断,
为什莫呢???(使用双堆栈的条件下,线程模式响应中断时,进入中断入栈时使用psp,然后在中断中使用msp,结束该中断时,切换到psp来出栈)
任务一发生中断,中断放到任务一的堆栈中,然后滴答定时器中断,使用msp记录滴答定时器中断地址,
 滴答定时器将psp切换到任务二的堆栈中,那么,滴答定时器在结束中断时,msp转化为任务二的PSP;
现在使用PendSV来切换上下文,(将PendSV的优先级设置为最低),滴答定时器打断中断后上下文未发生变化,因此可以回到被打断的中断
滴答定时器会悬起PendSV中断,当所有中断程序执行完毕后,让它来进行最低中断级别的上下文切换,回到任务中


中断配置
每个外部中断源都在 NVIC 的下列寄存器中“挂号”,通过改变这些寄存器的值来改变中断状态
 使能与除能寄存器
 悬起与“解悬”寄存器
 优先级寄存器
 活动状态寄存器 大部分是只读的,由硬件自动操作,但是PendSV可以改变,以此来发出切换上下文的请求


1.中断的使能与除能分别使用各自的寄存器来控制 每个中断源只占了一个32位寄存器的一位,p130
写零无效  从而实现每个中断都可以自顾地设置,而互不侵犯——只需单一的写指令,不再需要读-改-写三步曲。
想使能,就写 1 到对应 SETENA 的位 
欲除能一个中断,你需要写 1 到对应的 CLRENA 位
2. 悬起与“解悬”寄存器 同理
3.每个外部中断都有一个对应的优先级寄存器 每个寄存器占用 8 位 使用几位取决于芯片

中断的具体行为 
响应异常的第一个行动,就是自动保存现场的必要部分:依次把xPSR, PC, LR, R12以及R3-R0由硬
件自动压入适当的堆栈中:如果当响应异常时,当前的代码正在使用PSP,则压入PSP,也就是使用
进程堆栈;否则就压入MSP,使用主堆栈。一旦进入了服务例程,就将一直使用主堆栈。

在执行服务例程时,将由MSP负责对堆栈的访问。


EXC_RETURN位段详解 p146
[31:4] EXC_RETURN的标识:必须全为1
3   0=返回后进入Handler模式
    1=返回后进入线程模式
2   0=从主堆栈中做出栈操作,返回后使用MSP,
    1=从进程堆栈中做出栈操作,返回后使用PSP
合法的EXC_RETURN值及其功能
0xFFFF_FFF1 返回handler模式
0xFFFF_FFF9 返回线程模式,并使用主堆栈(SP=MSP)
0xFFFF_FFFD 返回线程模式,并使用线程堆栈(SP=PSP)


 文章来源地址https://www.toymoban.com/news/detail-467382.html

到了这里,关于CM3学习-中断的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 何时开始学习Qt和C++,以及如何有效学习?

    我这里刚好有嵌入式、单片机、plc的资料需要可以私我或在评论区扣个6

    2024年02月12日
    浏览(28)
  • 嵌入式学习---ARM中断控制系统

    硬件中断处理是实时系统设计的最重要、最关键的问题。 程序不断地查询各设备的状态,并做出相应的反应。该方式实现比较简单,常用在比较单一的系统中,比如一个温控系统中可以使用查询方式不断检测温度的变化。 特点:实现简单;但 CPU利用率很低 ,不适合多任务的

    2024年02月03日
    浏览(59)
  • 《操作系统真象还原》学习笔记:第七章 中断

    由于 CPU 获知了计算机中发生的某些事,CPU 暂停正在执行的程序,转而去执行处理该事件的程序,当这段程序执行完毕后,CPU 继续执行刚才的程序。整个过程称为中断处理,也称为中断。 把中断按事件来源分类,来自CPU外部的中断就称为外部中断,来自CPU内部的中断就称为

    2024年02月11日
    浏览(39)
  • STM32的中断系统详解(嵌入式学习)

    中断是处理器中的一种机制,用于响应和处理突发事件或紧急事件。当发生中断时,当前正在执行的程序会被暂时中止,处理器会跳转到中断处理程序(也称为中断服务例程),对中断事件进行处理。处理完中断后,处理器再返回到被中断的程序继续执行。 中断可以分为内部

    2024年02月12日
    浏览(59)
  • STM32学习笔记(三)丨中断系统丨EXTI外部中断(对射式红外传感器计次、旋转编码器计次)

    ​  本次课程采用单片机型号为STM32F103C8T6。 ​  课程链接:江科大自化协 STM32入门教程   往期笔记链接:   STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出   STM32学习笔记(二)丨STM32程序调试丨OLED的使用   本篇文章的内容我愿称之为 史诗级副本 (感觉

    2024年02月16日
    浏览(34)
  • MATLAB实现与封堵溃口有关的重物落水后运动过程的数学建模

    目录 摘 要 1 与封堵溃口有关的重物落水后运动过程的数学建模 3 一、问题重述 3 二、问题分析 5 三、基本假设 5 (2)、重物在同一稳定介质中阻力影响系数保持不变; 5 (5)、只考虑迎水面积上的摩阻力作用,忽略侧面粘滞阻力。 5 四、符号约定 4 五、主要创新点 5 对问题

    2024年02月22日
    浏览(30)
  • 猿创征文|[CM311-1A Armbian]-烧录制作 Armbian 系统盘以及写入 CM311-1A 机顶盒的 EMMC 刷成服务器

    ################################################## 目录 寻找盒子系统镜像 关于镜像网站 盒子简介 卖家镜像站 s9x 芯片镜像 Ubuntu Armbian jammy Debian Armbian bullseye 默认 arm 系统账户和密码 我所使用的 Armbian Server 镜像资源 使用烧录工具烧录 Armbian 系统盘 获取 balenaEtcher U 盘系统烧录工具 安

    2024年02月04日
    浏览(156)
  • 【IMX6ULL驱动开发学习】14.Linux驱动开发 - GPIO中断(设备树 + GPIO子系统)

    代码自取 【14.key_tree_pinctrl_gpios_interrupt】: https://gitee.com/chenshao777/imx6-ull_-drivers 主要接口函数: 1. of_gpio_count (获得GPIO的数量) 2. kzalloc (向内核申请空间) 3. of_get_gpio (获取GPIO子系统标号) 4. gpio_to_irq (根据GPIO子系统标号得到软件中断号) 5. request_irq (根据软件中断号

    2024年02月12日
    浏览(35)
  • 【练习】条件变量:创建三个线程 id号为ABC,三个线程循环打印自己的ID号,运行顺序为 ABCABC

    题目: 创建三个线程 id号为ABC,三个线程循环打印自己的ID号,运行顺序为 ABCABC...... 要求使用条件变量 运行结果:死循环输出ABCn

    2024年02月14日
    浏览(27)
  • KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记7 - STM32的CAN学习与测试2

    根据《KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记6 - STM32的CAN学习与测试1》的讨论,我实现了单机的回环模式的CAN测试。后来在测试中又有下面的积累。 在回环模式下,不会有ACK检定,也不会有ACK不应答的报警。 由于CANTX实际上并不把数据发给CAN收发器,只是在芯片里面转一圈就

    2024年02月22日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包