[ZLG-MCU] 基于群星Cortex-M3的uCOS-II移植模板

[复制链接]
13324|42
 楼主| zlgarm 发表于 2008-3-10 08:24 | 显示全部楼层

出错原因

原因有:<br />1.&nbsp;LM-LINK的驱动没有装好,或USB线没接好。<br />2.&nbsp;目标板的电源没有接好,不能用LM-LINK供电。<br />3.&nbsp;uCOS-II模板中没有设置好LM-LINK仿真。<br /><br />(zlgarm_zsg&nbsp;Steven&nbsp;Zhou)
jtingwang 发表于 2008-3-28 19:53 | 显示全部楼层

这个模板有没有发现什么问题和bug?呵呵

这个模板有没有发现什么问题和bug?呵呵<br />我用在了V2.85版上,好像也没有啥问题啊:)<br />官方的发现过两个bug
ATmega32L 发表于 2008-3-31 09:43 | 显示全部楼层

OS_ENTER_CRITICAL()写法太麻烦了

#if&nbsp;OS_CRITICAL_METHOD&nbsp;==&nbsp;3<br />#define&nbsp;&nbsp;OS_ENTER_CRITICAL()&nbsp;do{cpu_sr=CriticalEnter();}while(0)<br />#define&nbsp;&nbsp;OS_EXIT_CRITICAL()&nbsp;&nbsp;do{CriticalExit(cpu_sr);}while(0)&nbsp;&nbsp;&nbsp;&nbsp;<br />#endif&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />#define&nbsp;CRITICAL()<br />&nbsp;&nbsp;for(OS_CPU_SR&nbsp;cpu_sr=CriticalEnter(),__ToDo=1;<br />__ToDo;__ToDo=0,CriticalExit(cpu_sr))<br />
 楼主| zlgarm 发表于 2008-3-31 10:26 | 显示全部楼层

不建议使用方法3

ATmega32L写到的是“方法3”,它有两大缺点:<br />1)函数必须定义局部变量cpu_sr。<br />2)不能嵌套开关中断,即不能连续调用OS_ENTER_CRITICAL(),再连续调用相同次数的OS_EXIT_CRITICAL()。<br /><br />可参考本移植模板定义的“方法4”,上面的问题都能解决。
ATmega32L 发表于 2008-3-31 13:42 | 显示全部楼层

我反而觉得“方法3”更好。

#if&nbsp;OS_CRITICAL_METHOD&nbsp;==&nbsp;3<br />#define&nbsp;&nbsp;OS_ENTER_CRITICAL()&nbsp;do{cpu_sr=CriticalEnter();}while(0)<br />#define&nbsp;&nbsp;OS_EXIT_CRITICAL()&nbsp;&nbsp;do{CriticalExit(cpu_sr);}while(0)&nbsp;&nbsp;&nbsp;&nbsp;<br />#endif&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />#define&nbsp;CRITICAL()<br />&nbsp;&nbsp;for(OS_CPU_SR&nbsp;cpu_sr=CriticalEnter(),__ToDo=1;<br />__ToDo;__ToDo=0,CriticalExit(cpu_sr))<br /><br /><br /><br />OS_CPU_SR&nbsp;CriticalEnter(void)<br />{&nbsp;<br />&nbsp;&nbsp;asm(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;mrs&nbsp;r0,primask&nbsp;
        &quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;cpsid&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        &quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;bx&nbsp;lr&nbsp;&nbsp;
        &quot;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />&nbsp;&nbsp;return&nbsp;1;<br />}<br /><br />void&nbsp;CriticalExit(OS_CPU_SR&nbsp;cpu_sr)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;asm(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;msr&nbsp;primask,r0&nbsp;
        &quot;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />}<br /><br /><br /><br />“方法3”,的优点:<br />1.临界段写法更加灵活方便。<br />除了一般写法,还可以&nbsp;<br />CRITICAL()<br />{<br />………………<br />}<br /><br />2.cpu_sr是一个参数,含义可以自己定义。<br />为软非屏蔽中断(不受操作系统管理中断)提供了接口。<br />cpu_sr=CriticalEnter()<br />//保存系统管理中断状态,关闭系统管理中断<br />CriticalExit(cpu_sr)<br />//恢复系统管理中断状态<br /><br />这样非系统管理中断可以不受临界段影响。<br /><br />另外,并不是不能嵌套。嵌套只需cpu_sr作用域不同就行了。<br />更方便的嵌套是:<br />CRITICAL()<br />{<br />&nbsp;&nbsp;&nbsp;CRITICAL()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />还可以<br />CRITICAL()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;NONCRITICAL()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//非临界段<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br /><br /><br /><br /><br />
 楼主| zlgarm 发表于 2008-3-31 14:01 | 显示全部楼层

疑问

OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()&nbsp;都用C来写,而且用了for和while循环,能否保证它们自己没有嵌套问题?
ATmega32L 发表于 2008-3-31 14:11 | 显示全部楼层

C语言常用的

do{&nbsp;&nbsp;}while(0)<br />很常用的写法<br /><br />for(char&nbsp;i=1;i;i=0<br />{<br />}<br />C99写法,IAR,GCC都可以,KEIL好像不行。<br />KEIL不支持C99标准?<br />
 楼主| zlgarm 发表于 2008-3-31 15:02 | 显示全部楼层

建议用汇编写

OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()是关键代码,建议用汇编写。因为不同编译器对C编译出来的汇编有所不同,不能保证这两个宏本身没有临界区问题。用汇编来写,可以一行一行代码去分析,有没有临界区问题。<br /><br />(zlgarm_zsg)
jtingwang 发表于 2008-4-2 16:46 | 显示全部楼层

使用这个模板,ISR需不需要来通过OS管理开关中断?

如果使用了这个模板,在中断服务程序中,需不需要调用OS提供的函数,来开关中断呢?<br />比如串口中断,看到有人这么写:<br />void&nbsp;USART1_IRQHandler(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_ENTER_CRITICAL();<br />&nbsp;&nbsp;&nbsp;&nbsp;OSIntNesting++;<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_EXIT_CRITICAL();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//具体的中断服务程序;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;OSIntExit();<br />}<br /><br />有必要在中断服务程序的开始和结尾,调用这些函数吗?谢谢!
ATmega32L 发表于 2008-4-2 17:14 | 显示全部楼层

中断写法

void&nbsp;OSIntEnter(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_ENTER_CRITICAL();<br />&nbsp;&nbsp;&nbsp;&nbsp;OSIntNesting++;<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_EXIT_CRITICAL();&nbsp;&nbsp;<br />]<br /><br /><br />void&nbsp;USART1_IRQHandler(void)<br />{<br />&nbsp;&nbsp;OSIntEnter();<br />&nbsp;&nbsp;&nbsp;&nbsp;//具体的中断服务程序;<br />&nbsp;&nbsp;OSIntExit();<br />}<br /><br />
jtingwang 发表于 2008-4-2 17:23 | 显示全部楼层

可能是运行时没有发生过中断嵌套

是吧?!<br />但是不要的话,好像也可以运行,有点奇怪,可能是运行时没有发生过中断嵌套
 楼主| zlgarm 发表于 2008-4-3 08:35 | 显示全部楼层

看情况

&nbsp;&nbsp;&nbsp;&nbsp;如果中断服务函数使用了uCOS-II的东西,例如信号量发送函数,则要按规范写,否则uCOS-II不知道当前的中断嵌套情况,有可能出错。<br />void&nbsp;USART1_IRQHandler(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_ENTER_CRITICAL();<br />&nbsp;&nbsp;&nbsp;&nbsp;OSIntNesting++;<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_EXIT_CRITICAL();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//具体的中断服务程序;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;OSIntExit();<br />}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;如果中断服务函数没有使用uCOS-II的东西,则可按前后台的中断编写,不需按规范。<br />void&nbsp;USART1_IRQHandler(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;//具体的中断服务程序;<br />}<br /><br />(zlgarm_zsg)&nbsp;&nbsp;&nbsp;&nbsp;
jtingwang 发表于 2008-4-3 09:57 | 显示全部楼层

中断写法

明白了,感谢zlgarm
jtingwang 发表于 2008-4-7 10:37 | 显示全部楼层

为什么OS的时钟节拍中断老是打断其他中断服务程序?

使用这个模板,为什么OS的时钟节拍中断老是打断其他中断服务程序呢?<br />该模板对其他中断服务程序的优先级,有什么要求吗?<br />比方说如何设置其他中断(如UART中断、TIM1中断)的可抢占优先级和不可抢占优先级?<br />谢谢!
 楼主| zlgarm 发表于 2008-4-7 15:58 | 显示全部楼层

OS的时钟节拍是最低优先级

OS的时钟节拍是最低优先级,不会抢占其他中断的。优先级设置可用IntPrioritySet()函数。<br /><br />(zlgarm_zsg)
jtingwang 发表于 2008-4-24 11:36 | 显示全部楼层

!急问:任务调度时的程序跑飞

任务调度调用OSSched(),在调用OS_TASK_SW();后,再调用OS_EXIT_CRITICAL();退出临界区时有如下语句:<br /><br />POP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{R1,&nbsp;R2}<br />BX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LR<br /><br />POP寄存器时,LR指针的值由正常的0x08000104,变为异常值0xFFFFFFFD,由此就进入了&nbsp;硬件故障中断
crazykiller 发表于 2011-3-28 11:21 | 显示全部楼层
16# zlgarm

基于群星Cortex-M3的μCOS-II移植模板的使用,debug运行到
intDisAll
    CPSID I ;使能所有优先级的中断
    BX LR
出现了如下窗口:

IarIdePM
---------------------------
Could not find the source file: "C:\cygwin\home\bkircher\sandbox\DriverLib\build\DriverLib.PDL-LM3S\DriverLib.test\src\sysctl.c"

Would you like to locate it yourself?
---------------------------
是(Y)   否(N)   
---------------------------
本人驱动库已装,电脑上也没有这个路径,这个问题直接导致中断出错,求指点,不甚感激!!!
金鱼木鱼 发表于 2011-3-28 20:04 | 显示全部楼层
可以详细的说下过程吗?
crazykiller 发表于 2011-3-29 08:19 | 显示全部楼层
在IAR上运行这个模版,debug进入intDisAll()函数,这句《CPSID I 》执行后就跳出了这个窗口,IAr版本是4.42
FVJFIFE 发表于 2011-4-3 20:34 | 显示全部楼层
菜农还是这么爱学啊!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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