- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
破坏STM32中断机制引发的异常
破坏STM32中断机制引发的异常
现象描述
我将一个具有实时任务切换功能的小型嵌入式操作系统内核成功的从具有ARM7内核的
ADUC7024芯片移植到了具有cortex内核的LM3S8962芯片,然而在移植到同样具有cortex内核
的STM32F103VB芯片上却出了问题,程序运行一段时间就跑飞,最终查明是任务切换过程破
坏了cortex内核的中断机制所致,但为何同样采用了cortex内核的LM3S8962芯片却没有出现
该问题?本文将向你讲述这其中的原因,同时你还可以了解到操作系统任务切换的基本原理
以及cortex中断方面的一些知识。
背景知识介绍
在介绍问题定位过程前我们先了解一下实时嵌入式操作系统任务切换的基本原理。
对于嵌入式设备,程序一般存储在ROM中,有些芯片可以直接运行ROM中的指令,将变量
中的数据存放在RAM中,有些芯片则可以将ROM中的指令搬移到RAM中执行,RAM中既存放指令
又存放数据。不管哪种方式,程序执行过程中都需要使用芯片内核里的寄存器,这些寄存器
用来存放程序运行过程中需要使用的数据,用来指示芯片的状态,这些寄存器距离芯片内核
最近,速度最快,支持更多的寻址方式,因此程序执行过程大部分的操作都是使用这些寄存
器完成的。
芯片通过寄存器执行程序空间的指令,不停的将临时数据从寄存器中存储到数据空间,
将数据空间的临时数据恢复到寄存器中参与运算,这就是程序的运行过程。
芯片内核
寄存器1
程序空间
寄存器2
寄存器3
运算
寄存器4
单元
……
寄存器N 数据空间
图1 芯片内部结构(忽略cache)
程序的执行只与指令和数据相关,指令是不可修改的,编译后就确定了,能改变的只有
数据,但指令需要对数据进行判断,走不同的指令分支,这些寄存器中保存的数据就控制了
程序执行的分支,因此可以说操作系统任务切换的过程就是将任务A的寄存器数据存储到数
据空间,然后再从数据空间将任务B数据恢复到寄存器中的过程,这样操作系统就完成了从
任务A切换到任务B的上下文切换,有关操作系统切换过程更详细的介绍可以参考我写的《底
层工作者手册之嵌入式操作系统内核》,可以在我的博客/ifreecoding下
载相关的文档、源代码和演示视频。
保存 恢复 保存 恢复
任务A 任务B 任务B 任务A
寄存 寄存 寄存 寄存
A 器组 器组 任务B在运行
任务 在运行 器组 器组 任务A 在运行
任务A 任务A
任务B
图2 任务切换过程
实时嵌入式操作系统会采用一个硬件定时器以固定的频率产生任务调度,这就是我们所
说的tick中断。当tick中断到来时操作系统就会产生调度,进行上面所说的寄存器备份、恢
复操作,完成任务切换。对于其它非tick中断是不需要进行任务切换的,但当这些中断发生
时,芯片会从一般的程序跳转到中断服务程序去执行,其实这也相当于是一种“任务切换”,
也需要备份、恢复这些寄存器,这种情况对于没有使用操作系统的程序也是存在的。这些寄
存器的备份、恢复过程有些是硬件自动完成的,有些则是由C
原创力文档


文档评论(0)