赞
踩
ucosii在STM32rbt6上可以正常地运行,工作需要,我将ucosii移植到STM32F103C8T6,更换了一下启动代码,结果程序 开始调度时就死在那了 OSStart(); 进去后 void OSStart (void) { if (OSRunning == OS_FALSE) { OS_SchedNew(); OSPrioCur = OSPrioHighRdy; OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; OSTCBCur = OSTCBHighRdy; OSStartHighRdy(); } }停在黑色加粗,通过调试找到汇编代码.asm里边 OSStartHang B OSStartHang 这个位置。 网上搜索后有网友提供答案 关于STM32F107VC _OSStartHang解决方案 问题:移植UCOS-II后,程序总是在 B OSStartHang ,//根据提示,应当永远不会到这步的。 其实很简单,因为STM32本身的异常中断PendSV_Handler替代了UCOS的异常中断OSPendSV,使其不能正常执行。这样我们就需要更改PendSV_Handler为OSPendSV以让中断正常。 第一种 更改startup_stm32f10x_cl.s(V3.5.版本) 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_cl.s中定义了中断向量表(中断函数的入口地址) —stm32f10x_it.c 中断服务函数的C语言代码。 在startup_stm32f10x_cl.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 } ================================================ 之前一直使用的stm32f10x_it.c中的PendSV_Handler函数里调用OSPendSV()的方式突然不好用了,可能和升级了IAR6有关系,之前一直使用的是IAR5.4。 参照上述操作,已经好用了,有些差别用的startup_stm32f10x_cl.s V3.1.2版本。 DCD OSPendSV ; PendSV Handler PUBWEAK OSPendSV SECTION .text:CODE:REORDER(1) OSPendSV B OSPendSV |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。