前言
前面一篇<中断服务子程序是如何被cpu执行的>讲了
1 中断前保护现场,中断后恢复现场。
2 中断向量表的组成和运行过程。
3 堆栈在中断的占用情况。
回顾一下
1 中断前保护现场就是 会保存之前的数据 再进入中断 反之
中断后 恢复现场就是不保存中断数据 回到原先事件
2{
中断向量表的每个表项都会对应 相应的中断源的子程序
并且直接从R14寄存器取出地址 进行函数执行 pc指针也会存入函数 以便准备下一次的运行。
}
3 {
在保护现场 堆栈就明显增多 恢复现场明显减少了。
}
复位的概念
************解开复位的神秘面具 其实就一句话 (重要)
复位就是 检查有没有错误的意思
引起复位的几种原因
上电复位 通道之后的检查有无错误 没有就继续往下上电.
外部手动复位:也就是常见的复位按键 只是换个方式来检查有无出错。和上电复位差不多
区别是 一个是自动 一个是手动 仅此而已。
。。。。。等等的复位。。。。。。。。
中断向量表
这里列出来很多的 中断外部中断对应了不同的优先级 -3是最高的 也就是它会起到一个承上启下的作用 他可以起到手动复位的作用 。并且 cpu 会有一部分单独的特殊中断 称之为异常.上电之后 会先给cpu 检测有无出错现象.没有 就是没有异常在运行.
而红箭头指向 没什么都没写 其实他存放的是优先级-2 -1的变量 并且不能被编程 和执行的
并且它是表示 堆栈的 栈顶 根据堆栈的“先进后出”机制 那么它是第一个进去的 也就是最后一个出来的 那么他堆栈空间大小就可以确定了 也就可以说它是一个结束地址。
中断向量表的位置
大概分成两中情况
1 很常规的 源程序 — 中断 函数的 方式 (FLASH不分块 )
1 他的地址就是 0x0800000 很和常规的没差别。
2 把FLASH分成两块
相当于 原先的一块 分成了两块 并且他们都有 两个不一样的名字
名字就是bootlarder和app
这里可理解为 中断存放的PC指针的地址 就是 bootlarder 或者是 app
换名字的过程 就是你们所说的重定向
重定向就是 换一个名字代替而已 和宏定义没区别。
在F103 可以这么实现
NVIC_SetVectorTable(NVIC_VectTab_FLASH, offset);
复位过程
用上面的 第一个例子 讲解 拿到了一个起始地址,也就是栈顶,这就确认了堆栈空间大小 并且存入SP 初始化PC指针 pc指针存放是下一个地址的指令 所以会去执行的是中断复位程序。
执行完复位程序之后 它会先去检测sysinit函数的复位 如果没有出错
sysinit 作用起效了 他的作用是 初始化RCC 和重定向的初始化 等等。
最后才会执行main (结合下面的图来理解)
总结
1 上电复位 检查cpu有无异常,有无出错---- 2 确定栈顶位置 也就知道了堆栈空间的大小
---3 把存放在R14的地址 取出 返回执行 函数点 因为 pc指针存放下一个地址的指令一直
运行到了Sysinit 再次复位检查 RCC 和重定向有无出错 没有出错 就初始化 RCC和重定向 ----
4 最后跳转到main执行 pc指针始终在前面存放。
请多多指教 这位哞