打印
[ZLG-MCU]

基于群星Cortex-M3的uCOS-II移植模板

[复制链接]
楼主: zlgarm
手机看帖
扫描二维码
随时随地手机跟帖
21
zlgarm|  楼主 | 2008-3-10 08:24 | 只看该作者 回帖奖励 |倒序浏览

出错原因

原因有:
1. LM-LINK的驱动没有装好,或USB线没接好。
2. 目标板的电源没有接好,不能用LM-LINK供电。
3. uCOS-II模板中没有设置好LM-LINK仿真。

(zlgarm_zsg Steven Zhou)

使用特权

评论回复
22
jtingwang| | 2008-3-28 19:53 | 只看该作者

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

这个模板有没有发现什么问题和bug?呵呵
我用在了V2.85版上,好像也没有啥问题啊:)
官方的发现过两个bug

使用特权

评论回复
23
ATmega32L| | 2008-3-31 09:43 | 只看该作者

OS_ENTER_CRITICAL()写法太麻烦了

#if OS_CRITICAL_METHOD == 3
#define  OS_ENTER_CRITICAL() do{cpu_sr=CriticalEnter();}while(0)
#define  OS_EXIT_CRITICAL()  do{CriticalExit(cpu_sr);}while(0)    
#endif    

#define CRITICAL()
  for(OS_CPU_SR cpu_sr=CriticalEnter(),__ToDo=1;
__ToDo;__ToDo=0,CriticalExit(cpu_sr))

使用特权

评论回复
24
zlgarm|  楼主 | 2008-3-31 10:26 | 只看该作者

不建议使用方法3

ATmega32L写到的是“方法3”,它有两大缺点:
1)函数必须定义局部变量cpu_sr。
2)不能嵌套开关中断,即不能连续调用OS_ENTER_CRITICAL(),再连续调用相同次数的OS_EXIT_CRITICAL()。

可参考本移植模板定义的“方法4”,上面的问题都能解决。

使用特权

评论回复
25
ATmega32L| | 2008-3-31 13:42 | 只看该作者

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

#if OS_CRITICAL_METHOD == 3
#define  OS_ENTER_CRITICAL() do{cpu_sr=CriticalEnter();}while(0)
#define  OS_EXIT_CRITICAL()  do{CriticalExit(cpu_sr);}while(0)    
#endif    

#define CRITICAL()
  for(OS_CPU_SR cpu_sr=CriticalEnter(),__ToDo=1;
__ToDo;__ToDo=0,CriticalExit(cpu_sr))



OS_CPU_SR CriticalEnter(void)

  asm(
      "mrs r0,primask  "
       "cpsid  i      "
       "bx lr   "   
        );
  return 1;
}

void CriticalExit(OS_CPU_SR cpu_sr)
{
    asm(
      "msr primask,r0  " 
        );
}



“方法3”,的优点:
1.临界段写法更加灵活方便。
除了一般写法,还可以 
CRITICAL()
{
………………
}

2.cpu_sr是一个参数,含义可以自己定义。
为软非屏蔽中断(不受操作系统管理中断)提供了接口。
cpu_sr=CriticalEnter()
//保存系统管理中断状态,关闭系统管理中断
CriticalExit(cpu_sr)
//恢复系统管理中断状态

这样非系统管理中断可以不受临界段影响。

另外,并不是不能嵌套。嵌套只需cpu_sr作用域不同就行了。
更方便的嵌套是:
CRITICAL()
{
   CRITICAL()
    {
    }
}
还可以
CRITICAL()
{
    NONCRITICAL()
    {
     //非临界段
    }
}






使用特权

评论回复
26
zlgarm|  楼主 | 2008-3-31 14:01 | 只看该作者

疑问

OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL() 都用C来写,而且用了for和while循环,能否保证它们自己没有嵌套问题?

使用特权

评论回复
27
ATmega32L| | 2008-3-31 14:11 | 只看该作者

C语言常用的

do{  }while(0)
很常用的写法

for(char i=1;i;i=0
{
}
C99写法,IAR,GCC都可以,KEIL好像不行。
KEIL不支持C99标准?

使用特权

评论回复
28
zlgarm|  楼主 | 2008-3-31 15:02 | 只看该作者

建议用汇编写

OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()是关键代码,建议用汇编写。因为不同编译器对C编译出来的汇编有所不同,不能保证这两个宏本身没有临界区问题。用汇编来写,可以一行一行代码去分析,有没有临界区问题。

(zlgarm_zsg)

使用特权

评论回复
29
jtingwang| | 2008-4-2 16:46 | 只看该作者

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

如果使用了这个模板,在中断服务程序中,需不需要调用OS提供的函数,来开关中断呢?
比如串口中断,看到有人这么写:
void USART1_IRQHandler(void)
{
    OS_ENTER_CRITICAL();
    OSIntNesting++;
    OS_EXIT_CRITICAL();

    //具体的中断服务程序;

    OSIntExit();
}

有必要在中断服务程序的开始和结尾,调用这些函数吗?谢谢!

使用特权

评论回复
30
ATmega32L| | 2008-4-2 17:14 | 只看该作者

中断写法

void OSIntEnter(void)
{
    OS_ENTER_CRITICAL();
    OSIntNesting++;
    OS_EXIT_CRITICAL();  
]


void USART1_IRQHandler(void)
{
  OSIntEnter();
    //具体的中断服务程序;
  OSIntExit();
}

使用特权

评论回复
31
jtingwang| | 2008-4-2 17:23 | 只看该作者

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

是吧?!
但是不要的话,好像也可以运行,有点奇怪,可能是运行时没有发生过中断嵌套

使用特权

评论回复
32
zlgarm|  楼主 | 2008-4-3 08:35 | 只看该作者

看情况

    如果中断服务函数使用了uCOS-II的东西,例如信号量发送函数,则要按规范写,否则uCOS-II不知道当前的中断嵌套情况,有可能出错。
void USART1_IRQHandler(void)
{
    OS_ENTER_CRITICAL();
    OSIntNesting++;
    OS_EXIT_CRITICAL();

    //具体的中断服务程序;

    OSIntExit();
}

    如果中断服务函数没有使用uCOS-II的东西,则可按前后台的中断编写,不需按规范。
void USART1_IRQHandler(void)
{
    //具体的中断服务程序;
}

(zlgarm_zsg)    

使用特权

评论回复
33
jtingwang| | 2008-4-3 09:57 | 只看该作者

中断写法

明白了,感谢zlgarm

使用特权

评论回复
34
jtingwang| | 2008-4-7 10:37 | 只看该作者

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

使用这个模板,为什么OS的时钟节拍中断老是打断其他中断服务程序呢?
该模板对其他中断服务程序的优先级,有什么要求吗?
比方说如何设置其他中断(如UART中断、TIM1中断)的可抢占优先级和不可抢占优先级?
谢谢!

使用特权

评论回复
35
zlgarm|  楼主 | 2008-4-7 15:58 | 只看该作者

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

OS的时钟节拍是最低优先级,不会抢占其他中断的。优先级设置可用IntPrioritySet()函数。

(zlgarm_zsg)

使用特权

评论回复
36
jtingwang| | 2008-4-24 11:36 | 只看该作者

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

任务调度调用OSSched(),在调用OS_TASK_SW();后,再调用OS_EXIT_CRITICAL();退出临界区时有如下语句:

POP     {R1, R2}
BX      LR

POP寄存器时,LR指针的值由正常的0x08000104,变为异常值0xFFFFFFFD,由此就进入了 硬件故障中断

使用特权

评论回复
37
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)   
---------------------------
本人驱动库已装,电脑上也没有这个路径,这个问题直接导致中断出错,求指点,不甚感激!!!

使用特权

评论回复
38
金鱼木鱼| | 2011-3-28 20:04 | 只看该作者
可以详细的说下过程吗?

使用特权

评论回复
39
crazykiller| | 2011-3-29 08:19 | 只看该作者
在IAR上运行这个模版,debug进入intDisAll()函数,这句《CPSID I 》执行后就跳出了这个窗口,IAr版本是4.42

使用特权

评论回复
40
FVJFIFE| | 2011-4-3 20:34 | 只看该作者
菜农还是这么爱学啊!

使用特权

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

本版积分规则