/*问题:移植UCOS-II后,程序总是在
B OSStartHang ,//根据提示,应当永远不会到这步的。
其实很简单,因为STM32本身的异常中断PendSV_Handler替代了UCOS的异常中断OSPendSV,使其不能正常执行。这样我们就需要更改PendSV_Handler为OSPendSV以让中断正常。
第一种
更改startup_stm32f10x_md.s(V3.4.版本)
1、DCD PendSV_Handler ; PendSV Handler
更改为:
DCD OSPendSV ; OSPendSV 中断
2、PendSV_Handler PROC
EXPORT PendSV_Handler [WEAK]
B
ENDP
更改为:
OSPendSV PROC
EXPORT OSPendSV [WEAK]
B .
ENDP
第二种: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)
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
}
目标就是1、注释掉STM32f10x_it.c中的中断函数 ,使os_cpu.asm中的OSPendSV与启动函数中的中断定义PendSV_Handler匹配起来
*/
//void PendSV_Handler(void)
//{
//} |