(一)寄存器

1 寄存器组     
R0-R12: 通用寄存器

-----------------------------------------------------------------------------------------
R13: 堆栈寄存器 
有两个,MSP和PSP,同时只能看见一个,引用R13时,引用的是正在使用的那个 
MSP:可用于异常服务和应用程序 
PSP:只能用于应用程序 
系统复位后,用的堆栈指针是MSP。

------------------------------------------------------------------------------------------
R14: 连接寄存器,又名LR,存储返回地址

R15: 程序计数寄存器,又名PC

-------------------------------------------------------------------------------------------
2 特殊功能寄存器 
程序状态字寄存器组(PSRs)
中断屏蔽寄存器组(PRIMASK, FAULTMASK, BASEPRI)
控制寄存器(CONTROL) *****☆
程序状态字寄存器组(PSRs)分为 
应用程序 PSR(APSR) 
中断号 PSR(IPSR) 
执行 PSR(EPSR) 
每个都是32位,由于这3个寄存器有效位是错开的,因此可以组合访问。 
中断屏蔽寄存器组(PRIMASK, FAULTMASK, BASEPRI) ,这三个寄存器用于控制异常的使能和除能。

----------------------------------------------------------------------------------------
控制寄存器(CONTROL)它有两个作用:

1.定义特权级别
2.选择当前使用哪个堆栈指针
3.3 操作模式和特权极别
  操作模式: 处理者模式和线程模式
  异常处理:处理者模式
   主程序:线程模式
对于ucosii,不区分特权级和用户级,程序始终工作在特权级

MSP、PSP两个堆栈指针的切换是全自动的,就在出入异常服务例程时由硬件处理。

-------------------------------------------------------------------

3.3.8 复位序列 
0x00000000 MSP初值
0x00000004 PC  初值 复位向量

(二)异常

1 异常类型 
分为系统异常(编号1-15)和外部中断(大于15)

2 优先级 
CM3支持3个固定的高优先级和多达256级的可编程优先级。

----------------------------------------------------------------------------------------------------------
NVIC 中,每个中断都有一个优先级配置寄存器(1 个 byte) ,用来配置该中断的优先级。但该寄存器并不是每个位都被
使用,不同制造商生产的芯片不相同,譬如stm32使用 4位,也就是说stm32支持16个可编程优先级(参考:chapter9) 。
注意该寄存器是以MSB对齐的,因此stm32每个中断的优先级配置寄存器7:4位有效,3:0位无效。 
对于优先级, CM3又分为抢占优先级和亚优先级,  NVIC中的应用程序中断及复位控制寄存器(AIRCR)的优先级分组(10:8)
描述了如何划分抢占优先级和亚优先级。 
什么意思?以 stm32 为例,优先级配置寄存器不是 7:4 位有效吗,如果 AIRCR 中的优先级分组值为 4,则优先级配置寄
存器的7:5位确定抢占优先级,位4确定亚优先级。此时所有中断有8个抢占优先级,每个抢占优先级有2个亚优先级。 
抢占优先级高的中断可以抢占抢占优先级低的中断,即抢占优先级决定了中断是否可以嵌套。 
相同抢占优先级的中断不能嵌套,但当抢占优先级相同的异常有不止一个到来时,就优先响应亚优先级最高的异常。 
参考附录D  
表D.9 中断优先级寄存器阵列 0xE000_E400 - 0xE000_E4EF 共240个。 
表D.16系统异常优先级寄存器 0xE000_ED18 - 0xE000_ED23 共12个。 
优先级相同,看中断号,中断号小的优先。

3 向量表   
初始在0x00000000处,可以通过向量表偏移量寄存器(VTOR)(地址:0xE000_ED08)更改,一般无需更改。

------------------------------------------------------------------------------------------------------

(三)SVC和PendSV  
SVC 
SVC主要用在分特权级和用户级的操作系统,ucosii不区分特权级和用户级,可以不管这个东西。
这里说点题外话,一开始我很奇怪为什么会提供这种中断,因为这种中断一般都是用在大型的操作系统上,如linux系
统上,可 CM3 又不提供 MMU,应该是无法移植 linux 系统。后来我才知道 uclinux 是针对没有 MMU 的嵌入式系统而设计的,
不过还是很怀疑有人会在像stm32这种芯片上用uclinux。
PendSV 
PendSV中断主要做上下文切换,也就是任务切换,是ucosii移植过程中最重要的中断。 
主要有两点: 
1.PendSV中断是手工往NVIC 的PendSV悬起寄存器中写1 产生的(由OS 写) 。 
2.PendSV中断优先级必须设为最低。 
在讲移植代码时会介绍具体是如何做的。 对于7.6的PendSV部分应认真研读一下。

(四) NVIC 与中断控制 

NVIC负责芯片的中断管理,它和CM3内核紧密相关。

(五)中断的具体行为

1 中断/异常的响应序列 
当CM3开始响应一个中断时 
1.xPSR, PC, LR, R12以及R3‐R0入栈 
2.取向量      
3.选择堆栈指针MSP/PSP,更新堆栈指针SP,更新连接寄存器LR,更新程序计数器PC 
对移植ucosii 来说,需要注意1,3

2 异常返回 
在CM3中,进入中断时,LR寄存器的值会被自动更新。9.6节对更新后的值进行说明。这里统称EXC_RETURN。返回时通
过把EXC_RETURN往PC里写来识别返回动作的。因为EXC_RETURN是一个特殊值,所以对于CM3,汇编语言就不需要类似reti
这种指令,而用 C 语言开发时,不需要特殊编译器命令指示一个函数为中断服务程序。实际上,中断服务程序如果是 c 代码
编写,汇编成汇编代码,函数结尾一般是reti。

3 嵌套的中断 
只要注意:中断嵌套不能过深即可。

(六)Cortex-M3 的低层编程 

汇编与C 的接口 
有两点需要知道: 
1.当主调函数需要传递参数(实参)时,它们使用R0‐R3。其中R0传递第一个,R1 传递第2个……在返回时,把返回
值写到R0中。 
2.在函数中,用汇编写代码时,R0-R3, R12可以随便使用,而使用R4‐R11,则必须先PUSH(入栈),后POP(出栈)。

----

 组别:0>1>2>3>4

    组别优先顺序(第0组优先级最强,第4组优先级最弱):NVIC_PriorityGroup_0>NVIC_PriorityGroup_1>NVIC_PriorityGroup_2>NVIC_PriorityGroup_3>NVIC_PriorityGroup_4

及号越小优先级越高

-------

NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  // 指定抢占式优先级别1

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   // 指定响应优先级别1

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   // 指定响
如上,NVIC_IRQChannelPreemptionPriority 和 NVIC_IRQChannelSubPriority 两个主要指什么呢?有什么区别,如我把两个中断的 // 指定响应优先级别都设置相同的.会不会冲突呢?

它们的值是越大优先级越高还是越小越高呢?

取值范围又是如何的?

能不能详细介绍下NVIC中断的设置吗?

枫儿 (2009-1-18 11:32:41)
看了这个有少少明白,
但理解不清,如何才算是嵌套?stm32的中断设置优点突出在哪里?

STM32(Cortex-M3)中的优先级概念
STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。

具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。

当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。

既然每个中断源都需要被指定这两种优先级,就需要有相应的寄存器位记录每个中断的优先级;在Cortex-M3中定义了8个比特位用于设置中断源的优先级,这8个比特位可以有8种分配方式,如下:

所有8位用于指定响应优先级
最高1位用于指定抢占式优先级,最低7位用于指定响应优先级
最高2位用于指定抢占式优先级,最低6位用于指定响应优先级
最高3位用于指定抢占式优先级,最低5位用于指定响应优先级
最高4位用于指定抢占式优先级,最低4位用于指定响应优先级
最高5位用于指定抢占式优先级,最低3位用于指定响应优先级
最高6位用于指定抢占式优先级,最低2位用于指定响应优先级
最高7位用于指定抢占式优先级,最低1位用于指定响应优先级

这就是优先级分组的概念。

--------------------------------------------------------------------------------
Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:

第0组:所有4位用于指定响应优先级
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第4组:所有4位用于指定抢占式优先级

可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种:

NVIC_PriorityGroup_0 => 选择第0组
NVIC_PriorityGroup_1 => 选择第1组
NVIC_PriorityGroup_2 => 选择第2组
NVIC_PriorityGroup_3 => 选择第3组
NVIC_PriorityGroup_4 => 选择第4组

接下来就是指定中断源的优先级,下面以一个简单的例子说明如何指定中断源的抢占式优先级和响应优先级:

// 选择使用优先级分组第1组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  
// 使能EXTI0中断
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定抢占式优先级别1

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
  
// 使能EXTI9_5中断
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

--------------------------------------------------------------------------------

要注意的几点是:

1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;

2)抢占式优先级别相同的中断源之间没有嵌套关系;

3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。

binglin (2009-1-18 23:39:17)
呵呵,进来一看,枫儿应该是很明白了(至少比我要明白)。
枫儿 (2009-1-19 09:20:08)
不是吧..你太虑心了.
大家交流一下吧..

可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种:

NVIC_PriorityGroup_0 => 选择第0组
NVIC_PriorityGroup_1 => 选择第1组
NVIC_PriorityGroup_2 => 选择第2组
NVIC_PriorityGroup_3 => 选择第3组
NVIC_PriorityGroup_4 => 选择第4组\

要注意的几点是:

1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;

我想问下.这分组是如何的呢?怎才算超出,如分组是4,那么其NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 值不能大于4吗?
```
应该不会吧? stm32中断源可有许多的哦~~~

binglin (2009-1-19 09:45:21)
第0组:所有4位用于指定响应优先级
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第4组:所有4位用于指定抢占式优先级

由上面可知,当选择分组4时,所有4位用于指定抢占式优先级,四位二进制能表示的最大值是什么?请枫儿自已算.

它是用来设置中断优先级,与多少个中断无关.

在程序中合理按排中断优先级可以达到具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。

枫儿 (2009-1-19 09:55:20)
哈哈,谢谢,我想糊了...
2*2*2*2=16

它是用来设置中断优先级,与多少个中断无关.

在程序中合理按排中断优先级可以达到具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。

这个我还想不明白.

yjphyjp02 (2009-5-21 22:20:00)
优先级2正在处理事件,而优先级1这时有事件处理,优先级2暂停,让优先级1立即处理后,优先级2再处理事件;这是抢占优先。
优先级2正在处理事件,优先级3排队有事件处理,而优先级1这时有事件处理,等优先级1处理后,优先级2立即处理事件;这是响应优先。
yjphyjp02 (2009-5-21 22:23:01)
优先级2正在处理事件,而优先级1这时有事件处理,优先级2暂停,让优先级1立即处理后,优先级2再处理事件;这是抢占优先。
优先级2正在处理事件,优先级3排队有事件处理,而优先级1这时有事件处理,等优先级2处理后,优先级3才处理事件;这是响应优先。
catwill (2009-5-23 10:25:52)
没怎么看帖子,不过推荐楼主参考一下“权威指南”
那本书很神级,不知道出纸板了没有
xdz (2009-5-23 15:21:06)
[i=s] 本帖最后由 xdz 于 2009-5-23 15:24 编辑

既然已经设置了先占优先级那么为什么还要再设置响应优先级,老是把这两个弄混。还有就是谁比较理解系统优先级介绍一下。

void NVIC_SystemHandlerPriorityConfig(u32 SystemHandler, u8

SystemHandlerPreemptionPriority, u8 SystemHandlerSubPriority)  Handler  1  SystemHandler Handler  SectionSystemHandler  2  SystemHandlerPreemptionPriority Handler  SectionSystemHandlerPreemptionPriority  3  SystemHandlerSubPriority Handler  SectionSystemHandlerSubPriority         
SystemHandler Handler Table 308.

Table 308. SystemHandler 
NVIC_ VectTab  
SystemHandler_MemoryManage  Handler 存储器管理
SystemHandler_BusFault  Handler          总线错误
SystemHandler_UsageFault  Handler     使用错误
SystemHandler_SVCall  SVCall Handler   SVCall
SystemHandler_DebugMonitor  Handler  除错监控
SystemHandler_PSV  PSV Handler           PSV
SystemHandler_SysTick  Handler        系统滴答时钟

xdz (2009-5-24 02:01:28)
顶一下!!!
yunfei7370 (2009-5-24 07:54:55)
这个问题总是晕,还没看明白!谁能更详细的介绍一下!
binglin (2009-5-24 09:20:15)
如果相同的先占优先级别,就看谁响应优先级优级先,如果响应优先级也相同,就看谁的中断号小。
yunfei7370 (2009-5-24 12:55:40)

QUOTE:

如果相同的先占优先级别,就看谁响应优先级优级先,如果响应优先级也相同,就看谁的中断号小。
binglin 发表于 2009-5-24 09:20 

是不是号小的就优先呢?

binglin (2009-5-24 14:34:58)
印象中似乎是小号的有更高的优先权.
xdz (2009-5-25 11:37:52)
炳哥哥有没有试过中断优先级啊!我用了两个外部中断,设置了其中一个为先占优先级,在其中一个中断里面设置了死循环,另一个设置成先占优先级,然后触发它就是不进设有先占优先级的那个中断。
binglin (2009-5-25 14:58:18)
两个都要设置优先级,一个高一个低再试试。

提示:如果死循环那一个不设置,它的默义优先级别多少?

xdz (2009-5-25 16:55:35)
这是我设置的两个优先级,也看了不少例子但是实际并不像我们想象的那样。高手们都发表一下自己的看法吧! 
/* Enable the EXT5-9 Interrupt on PD.3 */
  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

/* Enable the EXTI10-15 Interrupt on PD.3 */
  NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQChannel ;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 5;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

binglin (2009-5-25 18:47:35)
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。
如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。

当两个中断源抢占式优先级不同时,当正在处理的中断的抢占式优先级比后来的低,则后来的中断将会打断前一个中断处理,先处理后来的抢占式优先级较高的中断。

抢占式优先级与响应优先级,抢占式优先级是用于占先即可以中断比它较低抢占式优先级的中断处理过程。而响应优先级只在两个或多个中断源到达时,中断响应时起作用。

因此我在13楼的描述是不正确的。

                                                                                    摘录

Cortex-M3基础的更多相关文章

  1. STM32学习之路入门篇之指令集及cortex——m3的存储系统

    STM32学习之路入门篇之指令集及cortex——m3的存储系统 一.汇编语言基础 一).汇编语言:基本语法 1.汇编指令最典型的书写模式: 标号 操作码        操作数1, 操作数2,... ...

  2. ARM Cortex M3系列GPIO口介绍(工作方式探讨)

    一.Cortex M3的GPIO口特性    在介绍GPIO口功能前,有必要先说明一下M3的结构框图,这样能够更好理解总线结构和GPIO所处的位置. Cortex M3结构框图     从图中可以看出 ...

  3. ARM Cortex M3(V7-M架构)硬件启动程序 一

    Cortex-m3启动代码分析笔记 启动代码文件名是STM32F10X.S,它的作用先总结下,然后再分析. 启动代码作用一般是: 1)堆和栈的初始化: 2)中断向量表定义: 3)地址重映射及中断向量表 ...

  4. ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 之间有什么区别和联系?(转载自知乎)

    ARM架构:  由英国ARM公司设计的一系列32位的RISC微处理器架构总称,现有ARMv1~ARMv8种类. ARM7:       一类采用ARMv3或ARMv4架构的,使用冯诺依曼结构的内核. ...

  5. Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors

    Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors The goal of the pro ...

  6. 【ARM-Linux开发】ARM7 ARM9 ARM Cortex M3 M4 有什么区别

    ARM7 ARM9 ARM Cortex M3 M4 区别 arm7 arm9 可以类比386和奔腾, 不同代,arm9相比arm7指令集和性能都有所增强,arm7和arm9都有带mmu和无mmu的版 ...

  7. 【freertos】002-posix模拟器设计与cortex m3异常处理

    目录 前言 posix 标准接口层设计 模拟器的系统心跳 模拟器的task底层实质 模拟器的任务切换原理 cortex M3/M4异常处理 双堆栈指针 双操作模式 栈帧 EXC_RETURN 前言 如 ...

  8. ARM Cortex M3(V7-M架构)硬件启动程序 二

    解析 STM32 的启动过程 解析STM32的启动过程 当前的嵌入式应用程序开发过程里,并且C语言成为了绝大部分场合的最佳选择.如此一来main函数似乎成为了理所当然的起点——因为C程序往往从main ...

  9. stm32和cortex M3学习内核简单总结

    1.stm32综述 2.寄存器组 3.操作模式和特权级别 4.存储器映射 5.中断和异常 6.其他 Stm32综述 这可以说是我第一款认真学习的单片机了,学完这个就要开启我通往arm9的大门了,接下来 ...

  10. CORTEX -M3 : Registers in depth

    http://www.zembedded.com/cortex-m3-registers-in-depth/ Thanks for the overwhelm response you show in ...

随机推荐

  1. Python:fromkeys()方法

    简介 Python 字典(Dictionary) fromkeys() 函数用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值. 语法 fromkeys()方法语法: ...

  2. 解决UITableView分割线距左边有距离的办法

    首先在viewDidLoad方法中加上如下代码: if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {    ...

  3. -bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory

    本人使用mac系统,命令行工具使用的iterm2,登录自己的云主机的时候 每次都要提示如下错误 -bash: warning: setlocale: LC_CTYPE: cannot change l ...

  4. Python 目录【持续更新中】

    Python 基础 字符编码 数据类型 文件处理 流程控制 练习题 函数,递归 匿名函数.内置函数 装饰器变形记 函数装饰器 递归 二分法 迭代器和生成器 协程函数 列表表达式 生成器表达式 异常处理 ...

  5. 【转】锁(lock)知识及锁应用

    sql server锁(lock)知识及锁应用转自:http://blog.csdn.net/huwei2003/article/details/4047191 关键词:锁提示,锁应用 提示:这里所摘 ...

  6. 关于微信小程序,你想知道的他们都问了

    微信公开课深圳站小程序专场刚刚结束,大家通过"微信公开课+"互动小程序提出了许多问题.我们筛选了后台问得最多的九个问题进行解答,快来看看这里有没有你想要的答案吧! @谢杨:小程序是 ...

  7. JS DOM节点

    html代码: <body onload ="loaded12()"> <form name="form1" action="htt ...

  8. js-jquery-SweetAlert【二】配置方法

    一.配置 Argument Default value 含义   Description title null (required) 模态对话框的标题.它可以在参数对象的title参数中设置,也可以在 ...

  9. decltype类型声明- 现代C++新特性总结

    decltype类型声明 有时会遇到这样的情况:希望从表达式的类型推断出要定义的变量的类型,但不想用该表达式的值去初始化变量.为了满足这一需求,C++11引入了decltype,它的作用是选择并返回操 ...

  10. vcenter web client chrome浏览器打开中文显示乱码

    使用如下链接试试看https://x.x.x.x/vsphere-client/?locale=zh_CN&csp