[ZLG-MCU] 阅读《Cortex-M3开发指南》中的疑问

[复制链接]
5985|19
 楼主| wahahaabc 发表于 2008-1-17 09:23 | 显示全部楼层 |阅读模式
最近正在学习Cortex-M3,买了一块ZLG的EASYARM8962,在看《Cortex-M3开发指南》,问一个弱弱的问题,P34中的表1.16最下面一行的“LR设置为EXC_RETURN,...”,EXC_RETURN是什么(EXC_RETURN在前面的39页中好像都没有描述)?<br />EXC_RETURN是否为一个寄存器?如果是寄存器,有什么作用?<br />(好像是用来保存异常返回地址的寄存器)
 楼主| wahahaabc 发表于 2008-1-17 09:38 | 显示全部楼层

再补充一个问题?

P38中间的“如果没有激活异常,或如果被压栈的异常的最高优先级比激活异常的最高优先级要高,则处理器返回到上一个被压栈的ISR”该怎么理解???<br /><br />这句话“如果被压栈的异常的最高优先级比激活异常的最高优先级要高”说明一个低优先级的异常抢占了一个高优先级的异常,低优先级异常就是这句话中的“激活异常”,高优先级异常就是这句话中的“被压栈的异常”,但是低优先级的异常抢占了一个高优先级的异常,这可能吗???不知上面的理解是否正确,如果有错,还请大侠指正。<br />
ATmega32L 发表于 2008-1-17 11:49 | 显示全部楼层

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

<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NAME&nbsp;__set_PSP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RSEG&nbsp;CSTACK:DATA:NOROOT(2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PUBLIC&nbsp;__set_PSP<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RSEG&nbsp;CODE:CODE:NOROOT(2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;THUMB<br />__set_PSP:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;PSP,&nbsp;r0&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BX&nbsp;lr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RSEG&nbsp;CODE:CODE:NOROOT(2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;THUMB<br />__set_USE_PSP:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;PSP,&nbsp;r0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORR&nbsp;lr,&nbsp;lr,&nbsp;#4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BX&nbsp;lr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RSEG&nbsp;CODE:CODE:NOROOT(2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;THUMB<br />__change_PSP:<br />&nbsp;&nbsp;&nbsp;&nbsp;mrs&nbsp;r0,CONTROL<br />&nbsp;&nbsp;&nbsp;&nbsp;orr&nbsp;r0,r0,#2<br />&nbsp;&nbsp;&nbsp;&nbsp;msr&nbsp;CONTROL,r0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BX&nbsp;lr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;END<br /><br />
zlgmcu 发表于 2008-1-17 16:50 | 显示全部楼层

回复1、2楼

1楼:<br />&nbsp;&nbsp;&nbsp;EXC_RETURN是什么?&nbsp;书上在那句话后面说明叫看1.4.7节哈。<br /><br />2楼:<br />&nbsp;&nbsp;你的理解错误了。<br />&nbsp;&nbsp;他指的是在退出的时刻。如果在退出前有高优先级中断产生,必定会占先。<br />&nbsp;&nbsp;如果正在退出的中断是目前最高优先级,则直接退出。<br />&nbsp;&nbsp;注意异常产生的时刻。<br />
 楼主| wahahaabc 发表于 2008-1-21 09:48 | 显示全部楼层

P33 最下面

P33&nbsp;最下面<br />“当处理器调用异常时,它自动将下面的8个寄存器按以下顺序压栈:R0,R1,R2,R3,R12,LR,PC,XPSR”,也就是说,R0先入栈,然后是R1,R2...<br /><br />但是,这和P34的图1.26刚好相反,图1.26中的“原来的SP”在图的上方,压栈顺序应该是,XPSR,PC,LR,R12,R3,R2,R1,R0<br />
zlgmcu 发表于 2008-1-21 10:12 | 显示全部楼层

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

<big><br />正确的压桟顺序是:xPSR、PC、LR、R12、R3~R0<br />在第35页的“异常进入时序”图里也得到了印证。<br />我刚才翻了翻《Cortex-M3技术参考手册》,原文上也是如此。<br />该书在下次修订时一定会把压桟的顺序交代清除。<br /></big><br /><br />(zlgmcu_wdx)
 楼主| wahahaabc 发表于 2008-1-22 09:27 | 显示全部楼层

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

例如:uc/os&nbsp;ii的任务使用线程堆栈,在任务运行时如果发生异常,处理器是将R0~R4,,R12,LR,PC,XPSR自动保存到线程堆栈还是主堆栈
zlgmcu 发表于 2008-1-22 12:54 | 显示全部楼层

是主堆栈

我的理解是,发生异常时,处理器先进入异常状态,然后执行压桟操作。因此这些寄存器是被压到主堆栈里。<br /><br />(zlgmcu_wdx)
maliang100 发表于 2008-1-22 13:03 | 显示全部楼层

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

也就是说,如果当前使用的是主堆栈,发生中断时,自动压到主堆栈;<br />如果当前使用的是进程堆栈,发生中断时,自动压到进程堆栈
 楼主| wahahaabc 发表于 2008-1-22 13:14 | 显示全部楼层

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

两位大侠的说法不同,不知有什么依据?不知道《Cortex-M3技术参考手册》中是否讲到,偶还没有看呢?
dld2 发表于 2008-1-22 13:21 | 显示全部楼层

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

  
 楼主| wahahaabc 发表于 2008-1-22 16:27 | 显示全部楼层

NVIC的问题???

(1)P54,P55的中断使能设置寄存器和中断使能清除寄存器,一个用于使能中断,一个用于禁止中断,如果两个寄存器的同一位都为1,那到底是使能了中断,还是禁止了中断。例如:<br />#define&nbsp;NVIC_EN0&nbsp;&nbsp;0xe000e100<br />#define&nbsp;NVIC_DIS0&nbsp;0xe000e180<br /><br />HWREG(&nbsp;NVIC_EN0&nbsp;)&nbsp;=&nbsp;(1&lt&lt2);<br />HWREG(&nbsp;NVIC_DIS0)&nbsp;=&nbsp;(1&lt&lt2);<br />则外部2号中断到底是使能了,还是禁止了???<br /><br />(2)P57的中断优先级寄存器共有8个,一个寄存器中的1个字节用于设置一个外部中断的优先级,也就是说,一个寄存器可以管理4个外部中断的优先级,8个寄存器一共可以管理32个外部中断的优先级,那么,外部中断超过32个该怎么办???例如:CAN0,CAN1,以太网的中断优先级该如何设置???按照P51的说法,NVIC可以管理240个中断,每个中断的优先级有256个可选,现在怎么只能管理32个中断的优先级???<br />
zlgmcu 发表于 2008-1-22 16:27 | 显示全部楼层

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

在《Cortex-M3技术参考手册》当中,原文是这样讲的:<br />  After&nbsp;pushing&nbsp;the&nbsp;eight&nbsp;registers,&nbsp;the&nbsp;ISR&nbsp;uses&nbsp;the&nbsp;main&nbsp;stack,&nbsp;and&nbsp;all&nbsp;subsequent&nbsp;interrupt&nbsp;pre-emptions&nbsp;use&nbsp;the&nbsp;main&nbsp;stack.<br /><br />参考译文:<br />  在将8个寄存器压栈之后,ISR使用主堆栈,并且后面所有的抢占中断都使用主堆栈。<br /><br />照此理解,发生异常时,应当是寄存器先入栈(当前堆栈),然后再切换到处理模式。<br /><br />(zlgmcu_wdx)
zlgmcu 发表于 2008-1-22 16:43 | 显示全部楼层

关于NVIC

(1)&nbsp;首先,这两个寄存器你不可能在同一时刻访问,必然有一个在先,有一个在后。以最后访问的那个寄存器为准。<br />这就好比是接有两只输入按键的R-S触发器,规定只能用一根手指头来按。操作时,按其中一个能使输出置位,按另一个使输出清零,但一根手指头不可能同时按下两只按键。<br /><br />(2)&nbsp;Cortex-M3处理器内核可以支持256级中断优先级(8个有效位),但在Lumianry&nbsp;ARM当中,只实现了8级中断优先级(3个有效位)。在Luminary&nbsp;ARM当中,外设实际配置的中断源肯定已经大大超过8个。但是不要紧,多个中断源完全可以共享同一个中断优先级,谁先来先处理谁,后来的中断暂时等待。<br />作为MCU的一个实际的应用,8个优先级其实已经足够了。在同一时刻,同时发生8个以上的中断确实极为罕见,即使出现了,也不要紧,暂时等待而已,中断不会丢失。<br /><br />(zlgmcu_wdx)
 楼主| wahahaabc 发表于 2008-1-23 10:27 | 显示全部楼层

RE:14楼

zlgmcu大侠误会偶的12楼:第(2)个问题的意思了,偶的意思是8个寄存器一共可以管理32个外部中断的优先级,每个中断的优先级可以相同(8个优先级对应用来说已经足够),但是,当外部中断的个数超过32个时,该如何设置超过的这些外部中断的优先级???<br />例如:对于P58的表1.27,最后一个外部中断(31号外部中断)就是GPIOG中断,对于LM3S8962来说,还有CAN0,CAN1,以太网等外部中断,这些中断的外部中断号都大于等于32,但是P58的表1.27并没有告诉如何设置CAN0,CAN1等这些外部中断的优先级???<br /><br />还有几个问题:<br />(1)软件触发PendSV中断,处理器会自动将R0~R4,,R12,LR,PC,XPSR自动保存到堆栈吗???<br /><br />(2)CPSID&nbsp;I&nbsp;//&nbsp;关总中断指令<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPSIE&nbsp;I&nbsp;//&nbsp;开总中断指令<br />以上两条在非特权模式下都可以执行(偶已经在EasyARM8962开发板上实际检验过),也就是说,可以在非特权模式下操作P19的中断屏蔽寄存器???<br /><br />(3)thumb-2指令&nbsp;BX&nbsp;LR&nbsp;和thumb指令&nbsp;BX&nbsp;LR的功能是否完全相同???<br />为什么中断服务程序的最后一条汇编指令几乎都是BX&nbsp;LR???<br /><br />
 楼主| wahahaabc 发表于 2008-1-24 08:28 | 显示全部楼层

勘误

(1)P66最下面一行代码&nbsp;(6&lt&lt8)改为(5&lt&lt8),因为抢占式优先级分组为2位<br /><br />(2)P67表1.37最后一行“为0时,默认...,为0时,...”,有两个“为0”
 楼主| wahahaabc 发表于 2008-1-28 09:08 | 显示全部楼层

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

15楼的前两个问题:<br />(1)软件触发PendSV中断,处理器会自动将R0~R4,,R12,LR,PC,XPSR自动保存到堆栈。uC/OS-ii移植到LM3S8962的代码就利用了这个特点。参见P370。<br /><br />(2)CPSID&nbsp;I&nbsp;//&nbsp;关总中断指令<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPSIE&nbsp;I&nbsp;//&nbsp;开总中断指令<br />以上两条指令在非特权模式下都可以执行。可以参见micrium官方的uC/OS-ii移植到CORTEX-M3的代码中的:<br />OS_ENTER_CRITICAL();<br />OS_EXIT_CRITICAL();<br /><br /><br />这里还要继续提几个问题,麻烦大侠留意一下:<br />(1)12楼的问题(2)还没有得到解答???<br /><br />(2)P17说“在进入异常时,处理器将3个寄存器的组合XPSR保存在堆栈内”,3个寄存器组合成一个32bit的值压入堆栈,组合以后是一个什么???也就是说,各个位分布是怎样的???<br />因为只有了解了组合以后的寄存器形态,才能明白P363的uc/OS移植代码中的<br />*(stk)&nbsp;=&nbsp;(INT32U)0x01000000L;&nbsp;//&nbsp;XPSR<br />为什么是0x01000000这个值???<br /><br />(3)关于uc/OS-II的移植还有两个问题不太清楚:<br />1.为什么要将PendSV异常设置为最低优先级???<br />P372的解释“OSPendSV()不能抢占其他代码,所以将它设置为最低优先级”的解释过于简单,大侠能否说得更详细一些。<br /><br />2.P373中间的一段黑体字“再次声明优先级高于OS_CRITICAL_INT_PRIO的中断不能调用任何uc/os-ii的函数和变量”,在该书的移植代码中,已经多次提到这个问题。为什么优先级高于OS_CRITICAL_INT_PRIO的中断不能调用任何uc/os-ii的函数和变量???大侠能否举一个例子???<br /><br /><br /><br />勘误:<br />(1)P360中间的一段话“一旦产生异常,......保存到SP_MAIN所指向的堆栈中”改为“保存到当前堆栈中”
 楼主| wahahaabc 发表于 2008-1-29 09:27 | 显示全部楼层

勘误:

P40最上面一句话,“当使用下面的其中一条指令将LR的值装入PC......”,翻译有错,参见《Cortex-M3技术参考手册》P103,不是将LR的值装入PC,而是0xFFFFFFFX,原文如下:<br />Exception&nbsp;returns&nbsp;occur&nbsp;when&nbsp;one&nbsp;of&nbsp;the&nbsp;following&nbsp;instructions&nbsp;loads&nbsp;a&nbsp;value&nbsp;of&nbsp;0xFFFFFFFX&nbsp;into&nbsp;the&nbsp;PC:
zlgmcu 发表于 2008-1-29 09:55 | 显示全部楼层

谢谢wahahaabc提出这几个勘误!

(zlgmcu_wdx)
zlgarm 发表于 2008-1-29 10:11 | 显示全部楼层

感谢wahahaabc

《Cortex-M3开发指南》的问题会认真地总结,下一版将更正过来。另外,我和两个女孩子正在翻译一本美国的宏编巨著,里面非常清晰地描述Cortex-M3的内核、指令集、MPU、调试方法等等,敬请留意。<br /><br />(zlgarm_zsg)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

119

主题

627

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部