破坏 STM32 中断机制引发的异常
现象描述
我将一个具有实时任务切换功能的小型嵌入式操作系统内核成功的从具有 ARM7 内核的
ADUC7024 芯片移植到了具有 cortex 内核的 LM3S8962 芯片 , 然而在移植到同样具有 cortex 内核
的 STM32F103VB 芯片上却出了问题,程序运行一段时间就跑飞,最终查明是任务切换过程破
坏了 cortex 内核的中断机制所致 , 但为何同样采用了 cortex 内核的 LM3S8962 芯片却没有出现
该问题?本文将向你讲述这其中的原因 , 同时你还可以了解到操作系统任务切换的基本原理
以及 cortex 中断方面的一些知识。
背景知识介绍
在介绍问题定位过程前我们先了解一下实时嵌入式操作系统任务切换的基本原理。
对于嵌入式设备 , 程序一般存储在 ROM 中 , 有些芯片可以直接运行 ROM 中的指令 , 将变量
中的数据存放在 RAM 中 , 有些芯片则可以将 ROM 中的指令搬移到 RAM 中执行 , RAM 中既存放指令
又存放数据 。 不管哪种方式 , 程序执行过程中都需要使用芯片内核里的寄存器 , 这些寄存器
用来存放程序运行过程中需要使用的数据 , 用来指示芯片的状态 , 这些寄存器距离芯片内核
最近 , 速度最快 , 支持更多的寻址方式 , 因此程序执行过程大部分的操作都是使用这些寄存
器完成的。
芯片通过寄存器执行程序空间的指令,不停的将临时数据从寄存器中存储到数据空间
,
将数据空间的临时数据恢复到寄存器中参与运算,这就是程序的运行过程。
图 1 芯片内部结构 (忽略 cache )
程序的执行只与指令和数据相关 , 指令是不可修改的 , 编译后就确定了 , 能改变的只有
数据 , 但指令需要对数据进行判断 , 走不同的指令分支 , 这些寄存器中保存的数据就控制了
程序执行的分支,因此 可以 说操作系统任务切换的过程就是将任务 A 的寄存器数据存储到数
据空间,然后再从数据空间将任务 B 数据恢复到寄存器中的过程,这样操作系统就完成了从
任务 A 切换到任务 B 的上下文切换 , 有关操作系统切换过程更详细的介绍可以参考我写的 《 底
层工作者手册之嵌入式操作系统内核 》 ,可以 在 我的博客 blog.sina.com.cn/ifreecoding 下
载相关的文档、源代码和演示视频。
运算
单元
寄存器 1
寄存器
2
寄存器 3
寄存器
4
……
寄存器
N
芯片内核
程序空间
数据空间