文章目录
- 前言
- 一、uC/OS简介
- 二、工程移植
- 2.1 下载ucos源码
- 2.2 创建空白工程
- 2.3 拷贝ucosiii源码文件
- 2.3.1 UC-CONFIG
- 2.3.2 UC-CPU
- 2.3.3 UC-LIB
- 2.3.4 UC-OS3
- 2.3 添加工程文件分组及路径
- 2.4 代码首次编译
- 2.5 源码修改
- 2.5.1 cpu_cfg.h
- 2.5.2 os_cpu_c.c
- 2.5.3 lib_cfg.h
- 2.5.4 sys.h
- 2.5.5 delay.c
- 2.5.6 usart.c
- 2.5.7 os_cpu_a.asm
- 2.5.8 stm32f10x_it.c
- 2.6 再次编译
- 三、编译测试
- 3.1 添加任务调度代码
- 3.2 下载测试
- 四、源码下载
前言
在网上查阅了许多关于uC/OS操作系统移植的问题,发现真的是鱼龙混杂 稀烂,缺胳膊少腿严重,到处踩坑,于是有了这篇博客,以下是我想与大家分享如何实现从0到1的移植。
这里我移植的是目前最新版本uC/OS-Ⅲ
一、uC/OS简介
走个流程,简单介绍下uC/OS
uC/OS(Micro-Controller Operating System)是由 Micrium 公司开发的一款 实时操作系统(RTOS),专为嵌入式系统设计,广泛应用于工业控制、汽车电子、消费电子等领域。
主要特点
- 实时性强
- 可移植性好
- 模块化设计
- 低资源占用
- 高可靠性
适用场景
- 工业自动化(PLC、HMI)
- 汽车电子(ECU、车载信息娱乐系统)
- 消费电子(智能家居、穿戴设备)
- 航空航天(无人机、卫星控制)
版本分支
- uC/OS-II(经典版本,适用于 8/16/32 位 MCU)
- uC/OS-III(增强版,支持多核、时间片轮询调度)
uC/OS 因其 高实时性、稳定性和可裁剪性,成为嵌入式开发中广泛使用的 RTOS 之一。
二、工程移植
2.1 下载ucos源码
官网下载ucosiii源码(https://github.com/weston-embedded)
找到uC-OS3
、uC-CPU
、uC-LIB
下载并解压
2.2 创建空白工程
第一步:创建空白工程,用于移植ucosiii(我这里选用正点原子的led灯例程)
第二步:在项目中创建UCOSiii文件夹,并在该文件夹创建uc-CONFIG、uc-CPU、uc-LIB、uc-OS3子文件夹
2.3 拷贝ucosiii源码文件
2.3.1 UC-CONFIG
打开空白工程中创建的uc-CONFIG子文件夹,拷贝如下文件
2.3.2 UC-CPU
打开空白工程中创建的uc-CPU子文件夹,拷贝如下文件
2.3.3 UC-LIB
打开空白工程中创建的uc-LIB子文件夹,拷贝如下文件
2.3.4 UC-OS3
打开空白工程中创建的uc-OS3子文件夹,拷贝如下文件
2.3 添加工程文件分组及路径
Keil工程添加文件分组、路径
2.4 代码首次编译
完成如上操作后编译,发现54error
,别急,往下看
2.5 源码修改
2.5.1 cpu_cfg.h
打开文件cpu_cfg.h,将 #if 0修改为 #if 1
2.5.2 os_cpu_c.c
打开文件os_cpu_c.c,将#include “…/…/…/Source/os.h” 更改为 #include “os.h”
2.5.3 lib_cfg.h
打开文件lib_cfg.h,将DEF_DISABLED更改为DEF_ENABLED
2.5.4 sys.h
打开文件sys.h,打开ucos宏, 0–>1
2.5.5 delay.c
打开文件delay.c,将#include “includes.h”更改为#include”os.h”
2.5.6 usart.c
打开文件usart.c,将#include “includes.h”更改为#include”os.h”
2.5.7 os_cpu_a.asm
打开文件os_cpu_a.asm,将OS_CPU_PendSVHandler更改为PendSV_Handler
2.5.8 stm32f10x_it.c
打开文件stm32f10x_it.c,屏蔽或删除PendSV_Handler( )和SysTick_Handler( )函数
2.6 再次编译
至此,环境适配完成,准备烧录验证。
三、编译测试
3.1 添加任务调度代码
#include "sys.h"
#include "delay.h"
#include "led.h"#include "os.h"#define START_TASK_PRIO 3
#define START_STK_SIZE 128
OS_TCB StartTaskTCB;
CPU_STK START_TASK_STK[START_STK_SIZE];void start_task(void *p_arg);
#define TASK1_TASK_PRIO 4
#define TASK1_STK_SIZE 128
OS_TCB Task1_TaskTCB;
CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE];
void task1_task(void *p_arg);#define TASK2_TASK_PRIO 4
#define TASK2_STK_SIZE 128
OS_TCB Task2_TaskTCB;
CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE];
void task2_task(void *p_arg);int main(void)
{ OS_ERR err;CPU_SR_ALLOC();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);delay_init(); LED_Init(); OSInit(&err); CPU_CRITICAL_ENTER(); OSTaskCreate((OS_TCB * )&StartTaskTCB, (CPU_CHAR * )"start task", (OS_TASK_PTR )start_task, (void * )0, (OS_PRIO )START_TASK_PRIO, (CPU_STK * )&START_TASK_STK[0], (CPU_STK_SIZE)START_STK_SIZE/10, (CPU_STK_SIZE)START_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); CPU_CRITICAL_EXIT();OSStart(&err);
} void start_task(void *p_arg)
{OS_ERR err;CPU_SR_ALLOC();p_arg = p_arg;CPU_Init();CPU_CRITICAL_ENTER();OSTaskCreate((OS_TCB * )&Task1_TaskTCB, (CPU_CHAR * )"Task1 task", (OS_TASK_PTR )task1_task, (void * )0, (OS_PRIO )TASK1_TASK_PRIO, (CPU_STK * )&TASK1_TASK_STK[0], (CPU_STK_SIZE)TASK1_STK_SIZE/10, (CPU_STK_SIZE)TASK1_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,(OS_ERR * )&err); OSTaskCreate((OS_TCB * )&Task2_TaskTCB, (CPU_CHAR * )"Task2 task", (OS_TASK_PTR )task2_task, (void * )0, (OS_PRIO )TASK2_TASK_PRIO, (CPU_STK * )&TASK2_TASK_STK[0], (CPU_STK_SIZE)TASK2_STK_SIZE/10, (CPU_STK_SIZE)TASK2_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,(OS_ERR * )&err); CPU_CRITICAL_EXIT(); OSTaskDel((OS_TCB*)0,&err);
}void task1_task(void *p_arg)
{OS_ERR err;p_arg = p_arg;while(1){LED0=0;OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); }
}void task2_task(void *p_arg)
{OS_ERR err;p_arg = p_arg;while(1){LED0=1;OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); }
}
3.2 下载测试
经本人测试,实验效果过led灯闪烁,大家可下载下方源码自行验证,到此结束,谢谢。
四、源码下载
链接: https://pan.baidu.com/s/113vDqOzdq_ATz0m-14xtgg
提取码: c2h5