您的位置 首页 传感器

移植ucosii遇到的问题 B OSStartHang

ucosii在STM32rbt6上可以正常地运行,工作需要,我将ucosii移植到STM32F103C8T6,更换了一下启动代码,结果程序开始调度时就死在那了OS

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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/257109.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部