打印
[ZLG-MCU]

阅读《Cortex-M3开发指南》中的疑问

[复制链接]
4786|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wahahaabc|  楼主 | 2008-1-17 09:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近正在学习Cortex-M3,买了一块ZLG的EASYARM8962,在看《Cortex-M3开发指南》,问一个弱弱的问题,P34中的表1.16最下面一行的“LR设置为EXC_RETURN,...”,EXC_RETURN是什么(EXC_RETURN在前面的39页中好像都没有描述)?
EXC_RETURN是否为一个寄存器?如果是寄存器,有什么作用?
(好像是用来保存异常返回地址的寄存器)

相关帖子

沙发
wahahaabc|  楼主 | 2008-1-17 09:38 | 只看该作者

再补充一个问题?

P38中间的“如果没有激活异常,或如果被压栈的异常的最高优先级比激活异常的最高优先级要高,则处理器返回到上一个被压栈的ISR”该怎么理解???

这句话“如果被压栈的异常的最高优先级比激活异常的最高优先级要高”说明一个低优先级的异常抢占了一个高优先级的异常,低优先级异常就是这句话中的“激活异常”,高优先级异常就是这句话中的“被压栈的异常”,但是低优先级的异常抢占了一个高优先级的异常,这可能吗???不知上面的理解是否正确,如果有错,还请大侠指正。

使用特权

评论回复
板凳
ATmega32L| | 2008-1-17 11:49 | 只看该作者

没碰CORTEX-M3一段时间了,都望了。


        NAME __set_PSP     
        RSEG CSTACK:DATA:NOROOT(2)
        PUBLIC __set_PSP
        RSEG CODE:CODE:NOROOT(2)
        THUMB
__set_PSP:
         MSR PSP, r0    
         BX lr          




        RSEG CODE:CODE:NOROOT(2)
        THUMB
__set_USE_PSP:
     MSR PSP, r0            
      ORR lr, lr, #4         
      BX lr                  


       RSEG CODE:CODE:NOROOT(2)
        THUMB
__change_PSP:
    mrs r0,CONTROL
    orr r0,r0,#2
    msr CONTROL,r0
      BX lr                  

        END

使用特权

评论回复
地板
zlgmcu| | 2008-1-17 16:50 | 只看该作者

回复1、2楼

1楼:
   EXC_RETURN是什么? 书上在那句话后面说明叫看1.4.7节哈。

2楼:
  你的理解错误了。
  他指的是在退出的时刻。如果在退出前有高优先级中断产生,必定会占先。
  如果正在退出的中断是目前最高优先级,则直接退出。
  注意异常产生的时刻。

使用特权

评论回复
5
wahahaabc|  楼主 | 2008-1-21 09:48 | 只看该作者

P33 最下面

P33 最下面
“当处理器调用异常时,它自动将下面的8个寄存器按以下顺序压栈:R0,R1,R2,R3,R12,LR,PC,XPSR”,也就是说,R0先入栈,然后是R1,R2...

但是,这和P34的图1.26刚好相反,图1.26中的“原来的SP”在图的上方,压栈顺序应该是,XPSR,PC,LR,R12,R3,R2,R1,R0

使用特权

评论回复
6
zlgmcu| | 2008-1-21 10:12 | 只看该作者

书本上33页最后的这句话确实讲得有些模糊


正确的压桟顺序是:xPSR、PC、LR、R12、R3~R0
在第35页的“异常进入时序”图里也得到了印证。
我刚才翻了翻《Cortex-M3技术参考手册》,原文上也是如此。
该书在下次修订时一定会把压桟的顺序交代清除。


(zlgmcu_wdx)

使用特权

评论回复
7
wahahaabc|  楼主 | 2008-1-22 09:27 | 只看该作者

处理器在自动将寄存器压栈时,是自动压到主堆栈还是线程

例如:uc/os ii的任务使用线程堆栈,在任务运行时如果发生异常,处理器是将R0~R4,,R12,LR,PC,XPSR自动保存到线程堆栈还是主堆栈

使用特权

评论回复
8
zlgmcu| | 2008-1-22 12:54 | 只看该作者

是主堆栈

我的理解是,发生异常时,处理器先进入异常状态,然后执行压桟操作。因此这些寄存器是被压到主堆栈里。

(zlgmcu_wdx)

使用特权

评论回复
9
maliang100| | 2008-1-22 13:03 | 只看该作者

处理器在自动将寄存器压栈时,是自动压到当前使用的堆栈

也就是说,如果当前使用的是主堆栈,发生中断时,自动压到主堆栈;
如果当前使用的是进程堆栈,发生中断时,自动压到进程堆栈

使用特权

评论回复
10
wahahaabc|  楼主 | 2008-1-22 13:14 | 只看该作者

8楼,9楼的两位大侠的意见不统一,不知两位有什么依据

两位大侠的说法不同,不知有什么依据?不知道《Cortex-M3技术参考手册》中是否讲到,偶还没有看呢?

使用特权

评论回复
11
dld2| | 2008-1-22 13:21 | 只看该作者

处理器不知道有什么线程堆栈

使用特权

评论回复
12
wahahaabc|  楼主 | 2008-1-22 16:27 | 只看该作者

NVIC的问题???

(1)P54,P55的中断使能设置寄存器和中断使能清除寄存器,一个用于使能中断,一个用于禁止中断,如果两个寄存器的同一位都为1,那到底是使能了中断,还是禁止了中断。例如:
#define NVIC_EN0  0xe000e100
#define NVIC_DIS0 0xe000e180

HWREG( NVIC_EN0 ) = (1<<2);
HWREG( NVIC_DIS0) = (1<<2);
则外部2号中断到底是使能了,还是禁止了???

(2)P57的中断优先级寄存器共有8个,一个寄存器中的1个字节用于设置一个外部中断的优先级,也就是说,一个寄存器可以管理4个外部中断的优先级,8个寄存器一共可以管理32个外部中断的优先级,那么,外部中断超过32个该怎么办???例如:CAN0,CAN1,以太网的中断优先级该如何设置???按照P51的说法,NVIC可以管理240个中断,每个中断的优先级有256个可选,现在怎么只能管理32个中断的优先级???

使用特权

评论回复
13
zlgmcu| | 2008-1-22 16:27 | 只看该作者

找到了原文,应该是先压入当前堆栈,再切换到处理模式

在《Cortex-M3技术参考手册》当中,原文是这样讲的:
  After pushing the eight registers, the ISR uses the main stack, and all subsequent interrupt pre-emptions use the main stack.

参考译文:
  在将8个寄存器压栈之后,ISR使用主堆栈,并且后面所有的抢占中断都使用主堆栈。

照此理解,发生异常时,应当是寄存器先入栈(当前堆栈),然后再切换到处理模式。

(zlgmcu_wdx)

使用特权

评论回复
14
zlgmcu| | 2008-1-22 16:43 | 只看该作者

关于NVIC

(1) 首先,这两个寄存器你不可能在同一时刻访问,必然有一个在先,有一个在后。以最后访问的那个寄存器为准。
这就好比是接有两只输入按键的R-S触发器,规定只能用一根手指头来按。操作时,按其中一个能使输出置位,按另一个使输出清零,但一根手指头不可能同时按下两只按键。

(2) Cortex-M3处理器内核可以支持256级中断优先级(8个有效位),但在Lumianry ARM当中,只实现了8级中断优先级(3个有效位)。在Luminary ARM当中,外设实际配置的中断源肯定已经大大超过8个。但是不要紧,多个中断源完全可以共享同一个中断优先级,谁先来先处理谁,后来的中断暂时等待。
作为MCU的一个实际的应用,8个优先级其实已经足够了。在同一时刻,同时发生8个以上的中断确实极为罕见,即使出现了,也不要紧,暂时等待而已,中断不会丢失。

(zlgmcu_wdx)

使用特权

评论回复
15
wahahaabc|  楼主 | 2008-1-23 10:27 | 只看该作者

RE:14楼

zlgmcu大侠误会偶的12楼:第(2)个问题的意思了,偶的意思是8个寄存器一共可以管理32个外部中断的优先级,每个中断的优先级可以相同(8个优先级对应用来说已经足够),但是,当外部中断的个数超过32个时,该如何设置超过的这些外部中断的优先级???
例如:对于P58的表1.27,最后一个外部中断(31号外部中断)就是GPIOG中断,对于LM3S8962来说,还有CAN0,CAN1,以太网等外部中断,这些中断的外部中断号都大于等于32,但是P58的表1.27并没有告诉如何设置CAN0,CAN1等这些外部中断的优先级???

还有几个问题:
(1)软件触发PendSV中断,处理器会自动将R0~R4,,R12,LR,PC,XPSR自动保存到堆栈吗???

(2)CPSID I // 关总中断指令
     CPSIE I // 开总中断指令
以上两条在非特权模式下都可以执行(偶已经在EasyARM8962开发板上实际检验过),也就是说,可以在非特权模式下操作P19的中断屏蔽寄存器???

(3)thumb-2指令 BX LR 和thumb指令 BX LR的功能是否完全相同???
为什么中断服务程序的最后一条汇编指令几乎都是BX LR???

使用特权

评论回复
16
wahahaabc|  楼主 | 2008-1-24 08:28 | 只看该作者

勘误

(1)P66最下面一行代码 (6<<8)改为(5<<8),因为抢占式优先级分组为2位

(2)P67表1.37最后一行“为0时,默认...,为0时,...”,有两个“为0”

使用特权

评论回复
17
wahahaabc|  楼主 | 2008-1-28 09:08 | 只看该作者

看来只有偶自己来回答15楼的前两个问题了? 顺便再提几个

15楼的前两个问题:
(1)软件触发PendSV中断,处理器会自动将R0~R4,,R12,LR,PC,XPSR自动保存到堆栈。uC/OS-ii移植到LM3S8962的代码就利用了这个特点。参见P370。

(2)CPSID I // 关总中断指令
     CPSIE I // 开总中断指令
以上两条指令在非特权模式下都可以执行。可以参见micrium官方的uC/OS-ii移植到CORTEX-M3的代码中的:
OS_ENTER_CRITICAL();
OS_EXIT_CRITICAL();


这里还要继续提几个问题,麻烦大侠留意一下:
(1)12楼的问题(2)还没有得到解答???

(2)P17说“在进入异常时,处理器将3个寄存器的组合XPSR保存在堆栈内”,3个寄存器组合成一个32bit的值压入堆栈,组合以后是一个什么???也就是说,各个位分布是怎样的???
因为只有了解了组合以后的寄存器形态,才能明白P363的uc/OS移植代码中的
*(stk) = (INT32U)0x01000000L; // XPSR
为什么是0x01000000这个值???

(3)关于uc/OS-II的移植还有两个问题不太清楚:
1.为什么要将PendSV异常设置为最低优先级???
P372的解释“OSPendSV()不能抢占其他代码,所以将它设置为最低优先级”的解释过于简单,大侠能否说得更详细一些。

2.P373中间的一段黑体字“再次声明优先级高于OS_CRITICAL_INT_PRIO的中断不能调用任何uc/os-ii的函数和变量”,在该书的移植代码中,已经多次提到这个问题。为什么优先级高于OS_CRITICAL_INT_PRIO的中断不能调用任何uc/os-ii的函数和变量???大侠能否举一个例子???



勘误:
(1)P360中间的一段话“一旦产生异常,......保存到SP_MAIN所指向的堆栈中”改为“保存到当前堆栈中”

使用特权

评论回复
18
wahahaabc|  楼主 | 2008-1-29 09:27 | 只看该作者

勘误:

P40最上面一句话,“当使用下面的其中一条指令将LR的值装入PC......”,翻译有错,参见《Cortex-M3技术参考手册》P103,不是将LR的值装入PC,而是0xFFFFFFFX,原文如下:
Exception returns occur when one of the following instructions loads a value of 0xFFFFFFFX into the PC:

使用特权

评论回复
19
zlgmcu| | 2008-1-29 09:55 | 只看该作者

谢谢wahahaabc提出这几个勘误!

(zlgmcu_wdx)

使用特权

评论回复
20
zlgarm| | 2008-1-29 10:11 | 只看该作者

感谢wahahaabc

《Cortex-M3开发指南》的问题会认真地总结,下一版将更正过来。另外,我和两个女孩子正在翻译一本美国的宏编巨著,里面非常清晰地描述Cortex-M3的内核、指令集、MPU、调试方法等等,敬请留意。

(zlgarm_zsg)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

119

主题

627

帖子

0

粉丝