移植UCOS,遇到B OSStartHang的问题及其解决方法

在移植的过程中要给系统提供两个中断函数,一个是“OS_CPU_PendSVHandler”,另一个是"OS_CPU_SysTickHandler",第一个在os_cpu_a.asm中用到,另一个在os_cpu_c.c中用到。

项目中---startup_stm32f10x_md.s中定义了中断向量表(中断函数的入口地址)
          ---stm32f10x_it.c 中断服务函数的C语言代码。

在startup_stm32f10x_md.s中有两段代码如下:
        DCD     PendSV_Handler 

        DCD     SysTick_Handler  

在stm32f10x_it.c中的服务函数如下
                  void PendSV_Handler(void)

                  {

                   }

                   void SysTick_Handler(void)

                   {
  
                   }

刚开始,为了偷懒而且没意识到问题的严重性,所以做出了下面的修改。
void PendSV_Handler(void)
{
   OS_CPU_PendSVHandler(); //调用ucos系统中断函数
}

void SysTick_Handler(void)
{
   OS_CPU_SysTickHandler(); //调用ucos系统中断函数
}

startup_stm32f10x_md.s没变动,我直接修改了两个服务函数,在函数中调用ucosII的函数。。。结果就出
现了下面的问题:

程序死在了OSStart();里。经过单步发现程序的软件中断触发后调用服务函数失败,停在了
OSStartHang
    B       OSStartHang <-----------------------停在这里了

上网搜了一下,发现遇到这个问题的还挺多的,不过原因可能有很多,而且基本上没人给出解决的办法,郁闷中,只能一步一步的对比查找,后来就发现了问题,解决如下:

1:ucos系统中断函数更名为PendSV_Handler,注释掉stm32f10x_it.c文件中void PendSV_Handler(void)函数。

2.在void SysTick_Handler(void)函数中添加如下代码:

void SysTick_Handler(void)

{
  OS_CPU_SR  cpu_sr;

  OS_ENTER_CRITICAL();                                        // Tell uC/OS-II that we are starting an ISR               
  OSIntNesting++;
  OS_EXIT_CRITICAL();

  OSTimeTick();                                               // Call uC/OS-II's OSTimeTick()                            
  OSIntExit();                                                // Tell uC/OS-II that we are leaving the ISR 

}
也就是要把入口直接指向服务函数的入口,不可以第二次调用,因为第二次调用SP和一些寄存器的内容已经被改了,所以没法系统调度了,系统就死掉了。

posted @ 2010-11-26 12:10  51arm  阅读(3375)  评论(0)    收藏  举报