### STM32F103上μC/OS-II的移植关键点解析 #### 标题解析:STM32F103上μC/OS-II的移植 本标题主要聚焦于将μC/OS-II操作系统移植到STM32F103微控制器的过程与注意事项。μC/OS-II(或称为μCOS-II)是一种开源实时操作系统(RTOS),广泛应用于嵌入式系统开发中。而STM32F103是基于ARM Cortex-M3内核的高性能微控制器,适用于各种复杂的嵌入式应用。 #### 描述解析:移植过程中的难点及解决方法 在将μC/OS-II移植到STM32F10x过程中,作者遇到并总结了几个关键问题及其解决方案。这些问题主要包括中断处理、系统时钟配置以及任务调度等核心环节。 #### 标签解析:μC/OS-II 移植 STM32F10x - **μC/OS-II移植**:指将μC/OS-II操作系统从一个硬件平台移植到另一个硬件平台的过程。 - **STM32F10x**:表示STM32F10x系列微控制器家族,该系列包括多个型号如STM32F103,它们均采用ARM Cortex-M3内核。 #### 内容解析:具体实现细节及解决方案 根据提供的部分内容,我们可以进一步探讨移植过程中的技术细节和解决方案。 ##### 中断处理与调度 1. **PendSV_Handler与OSPendSV**: - PendSV_Handler:STM32的标准库中用于处理PendSV异常的服务例程。 - OSPendSV:μC/OS-II中定义的函数,用于处理PendSV异常。 - 在移植过程中,需要将PendSV_Handler重新定义为OSPendSV,以确保μC/OS-II能够正确地处理PendSV异常。 - 这一修改可以通过在启动文件`startup_stm32f10x_hd.s`中进行,例如通过如下代码实现: ```assembly PROC PendSV_Handler EXPORT PendSV_Handler [WEAK] B OSPendSV ENDP PROC OSPendSV EXPORT OSPendSV [WEAK] B OSPendSV ENDP ``` 2. **SysTick配置**: - SysTick定时器被用作μC/OS-II的系统时钟源,用于实现任务调度和延时等功能。 - 需要配置SysTick定时器以合适的频率运行,一般建议设置为10ms到100ms之间。 - SysTick定时器的中断处理程序`SysTick_Handler`负责调用`OSTimeTick()`来更新μC/OS-II的时间基础。 - 实现示例: ```c void SysTick_Handler(void) { OS_ENTER_CRITICAL(); // 告知μC/OS-II我们正在进入中断服务例程 OSIntNesting++; // 记录中断嵌套层数 OS_EXIT_CRITICAL(); OSTimeTick(); // 调用μC/OS-II的OSTimeTick() OS_EXIT_CRITICAL(); // 告诉μC/OS-II我们正在离开中断服务例程 } ``` 3. **任务调度机制**: - μC/OS-II的任务调度算法依赖于任务优先级。 - 当前任务执行完毕后,会检查是否有更高优先级的任务就绪,如果有则进行上下文切换。 - 上下文切换由`OS_Sched`函数完成,它会在每个中断返回前后调用。 - 实现示例: ```c void OS_Sched(void) { #if OS_CRITICAL_METHOD == 3 /* Allocates storage for CPU status register */ OS_CPU_SR cpu_sr; #endif INT8U y; OS_ENTER_CRITICAL(); if ((OSIntNesting == 0) && (OSLockNesting == 0)) { /* Scheduling only if all ISRs done & not locked */ y = OSUnMapTbl[OSRdyGrp]; /* Get pointer to HPT ready to run */ OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]); if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */ OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; OSCtxSwCtr++; /* Increment context switch counter */ OS_TASK_SW(); /* Perform a context switch */ } } OS_EXIT_CRITICAL(); } ``` 4. **时间延迟机制**: - `OSTimeDly`函数用于实现任务的延时功能。 - 在调用`OSTimeDly`时,系统会记录延时时间,并在下次`OSTimeTick`时更新任务状态。 - 示例代码: ```c void OSTimeDly(INT16U ticks) { // 实现延时逻辑 } ``` 通过以上分析可以看出,在STM32F103上移植μC/OS-II的关键在于中断处理、任务调度和时间延迟等机制的正确配置与实现。这些步骤不仅需要对μC/OS-II有深入的理解,还需要对STM32的硬件架构和标准库有充分的认识。正确的移植可以使μC/OS-II更好地适应不同的应用场景,提高系统的稳定性和响应速度。
看网上好多人碰到过这样的问题,移植UCOS-II后,程序总是在 B OSStartHang ,根据提示,应当永远不会到这步的。那原因是什么呢?
其实很简单,因为STM32本身的异常中断PendSV_Handler替代了UCOS的异常中断OSPendSV,使其不能正常执行。这样我们就需要更改PendSV_Handler为OSPendSV以让中断正常。
更改startup_stm32f10x_hd.s(V3.1.0版本)
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
这样就可以了。
- 碎片记录2014-07-29先看一下,谢谢
- mariaforest2012-12-25正在尝试移植,楼主的分享给了很大帮助。
- huaweiSCUT2013-08-01内容很简单,参考价值有限
- 粉丝: 0
- 资源: 7
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助