SysTick系统时钟滴答实验(stm32中断入门)
定义。而在IAP模式下,应用代码的起始地址并不是flash首地址,而是由偏移量0x8(假定值),从上面也可以简单推出应用代码的向量表偏移量也是0x8,此时向量表偏移寄存器就需要重定义了。
下图来自于list下生成的.map文件
再参考生成的bin文件和启动文件:
可以很清晰证实上面的观点。
3.了解M3芯片基础的应该知道,M3拥有通用寄存器组R0~R15,这些寄存器在程序运行中保存着代码流程的所有信息,包括当前地址,正在修改的变量参数。因此在中断触发时,只要将R0~R15依次压栈,中断结束后出栈,代码就会回到运行之前的位置(uC/OS-ii正是模拟该过程实现任务切换的),当然这只是最简单的一种情况,因为m3芯片本身支持中断优先级和中断嵌套,实际复杂度远高于此.其实可以简化为如下流程:
主程序暂停 -〉相关位置和状态参数入栈-〉中断服务例程执行-〉相关位置和状态参数出栈-〉主程序恢复
4.Cortex-M3支持最多240个可配置中断,中断优先级的数目3~8位,也就是支持8~256个优先级,而事实上一般并没有支持那么多,如8,16,32级,其中最多支持128个抢占级。arm中断及复位控制寄存器中的3~8位设定优先级的部分,通过配置可将其分割为两部分,前面为抢占级,后面为亚优先级,并且亚优先级至少为1位,分组是可以从保留的优先级组开始的。一个中断的优先级可通过以下顺序判断,优先级依此降低。
优先级组:抢占级 > 亚优先级
优先级: 数值小 > 数值大
中断号: 中断号小 > 中断号大
抢占级和亚优先级的区别:
抢占级是在发生在中断嵌套的基础,上面提到了中断打断了线程的流程,但是如果有抢占级的加入,中断本身也会被优先级更高的中断打断,具体流程如下:
主程序暂停 -〉低优先级中断 -〉高优先级中断-〉低优先级中断-〉主程序恢复
亚优先级表示没有发生中断的嵌套,一个中断只有在它结束后另一个亚优先级的中断才会响应,即不会发生中断嵌套。
此外为了加快中断执行的流程,Cortex-M3提供了基于优先级的四种动作:
1.占先:主要发生在抢占级中,即高优先级中断低优先级执行,发生中断嵌套
2.末尾连锁:若占先发生上一个中断的末尾出栈之前,则打断出栈动作,直接执行高优先级中断,结束后如果没有发生抢占,才执行出栈
3.迟来 若占先发生在中断的开始入栈阶段,则继续入栈,低优先级中断挂起。
4.返回 出栈过程,如果收到高优先级中断则停止并产生末尾连锁
从上面可以看出,中断优先级和中断嵌套在加上ARM基于优先级机制的优化,可以让中断中高优先级任务更快执行,正是优先级设定的意义。
SysTick系统时钟滴答实验stm32中断入 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)