文章目錄
- 前言
- 一、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