移植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和一些寄存器的内容已经被改了,所以没法系统调度了,系统就死掉了。