移植ucosii遇到的问题 B OSStartHang
来源:互联网 发布:淘宝手机端连接 编辑:程序博客网 时间:2024/05/22 13:15
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
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
阅读全文
0 0
- 移植ucosii遇到的问题 B OSStartHang
- 移植ucosii遇到的问题 B OSStartHang
- uCOS-II移植 (B OSStartHang)问题 和 多任务不能切换问题
- STM32F105 UC/OS-II (B OSStartHang)问题
- ucosII的移植
- 关于ucosii移植后的问题及思考
- 移植遇到的问题
- 关于ucos的进入OSStartHang死循环的问题
- ucosii移植
- UCOSII移植
- 内核移植,文件系统移植遇到的问题
- uclinux移植遇到的问题
- 移植Android 遇到的问题
- 数据库移植遇到的问题
- ucosii在stm32上的移植详解
- 简单c8051F120上ucosII的移植记
- ucosii在msp430F5239上的移植步骤
- ucosii 在ppc8313的移植(一)
- VMware中CentOS配置静态IP进行网络访问(NAT方式和桥接模式)
- 第六篇: 设计模式六大原则: 老板是如何减轻负担的 -- 依赖倒置原则
- HDU 3037:卢卡斯定理
- 【C语言】C语言运算符优先级列表
- hdu3555 Bomb(数位dp)
- 移植ucosii遇到的问题 B OSStartHang
- 基于哈希表的索引堆变形(Hackerrank: QHEAP1)
- opencv3.3.0安装cmake-cui的配置参考
- Android RemoteCallbackList类
- 读书笔记_C#入门经典(第5版)第六章_函数
- onSaveInstanceState、onRestoreInstanceState、onNewIntent调用时机
- JAVA学习笔记_断言的使用
- 【POJ1113】【计算几何】Wall 题解
- HDU6154CaoHaha's staff(递推+网格)