嵌入式RTOS實戰:uC/OS-III最新版移植指南(附項目源碼)

文章目錄

  • 前言
  • 一、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-OS3uC-CPUuC-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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/78828.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78828.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/78828.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TypeScript中的函數類型定義與類型約束

函數類型定義與類型約束 一、核心概念:類型別名與函數類型 1. 類型別名(Type Alias) 定義 類型別名使用 type 關鍵字為現有類型創建一個新名稱,可以用于: 基礎類型(如 string、number)&…

相機DreamCamera2錄像模式適配尺寸

在開發中遇到 一個問題,相機切換視頻模式時,預覽時,界面不能充滿屏幕兩側有黑邊,客戶要求修改,在此記錄 一問題現象: 系統相機在視頻模式下預覽時如下現象如圖1,期望現象如圖2: 圖1 …

SpringCloud組件——Gateway

一.網關 1.問題提出 我們通過Eureka,Nacos解決了服務注冊,服務發現的問題,使用SpringCloud LoadBalance解決了負載均衡的問題,使用OpenFeign解決了遠程調用的問題。 但是當前所有微服務的接口都是直接對外暴露的,可…

C#中構造器及屬性的加載順序

一.基本原則: 先加載靜態構造函數和靜態字段,后加載普通構造函數和普通字段;先加載基類再加載子類; 二.具體的加載順序: 父類靜態字段--->父類靜態構造函數--->子類靜態字段--->子類靜態構造函數--->父類實例字段---> 父類實例構造函數--->子類實例字段-…

Python面試問題

一、Python 基礎 1. Python 的特點 動態類型:變量無需聲明類型。解釋型語言:逐行解釋執行。支持多種編程范式(面向對象、函數式、過程式)。 2. 列表(List)與元組(Tuple)的區別 特…

計算機視覺進化論:YOLOv12、YOLOv11與Darknet系YOLOv7的微調實戰對比

摘要 YOLO系列作為實時目標檢測領域的重要里程碑,持續引領速度與精度的平衡發展。本文圍繞YOLOv7(基于Darknet框架)、YOLOv11及YOLOv12,系統、深入地對比了三款模型的架構創新、微調策略、核心技術及應用場景。我們詳細解析了三者…

SQL Server 存儲過程開發規范

SQL Server 存儲過程開發規范(高級版) 1. 總則 1.1 目標 本規范旨在: 提高存儲過程的事務一致性、異常可追蹤性、錯誤透明度。 統一日志記錄、錯誤碼管理、鏈路追蹤(Trace ID)。 支持復雜事務場景(嵌套…

opendds的配置

配置的使用 文檔中說明有4種使用配置的方式: 環境變量 命令行參數(將覆蓋環境變量中的配置) 配置文件(不會覆蓋環境變量或命令行參數中的配置) 用戶調用的 API(將覆蓋現有配置) 這里對開發…

(Go Gin)上手Go Gin 基于Go語言開發的Web框架,本文介紹了各種路由的配置信息;包含各場景下請求參數的基本傳入接收

1. 路由 gin 框架中采用的路優酷是基于httprouter做的 HttpRouter 是一個高性能的 HTTP 請求路由器,適用于 Go 語言。它的設計目標是提供高效的路由匹配和低內存占用,特別適合需要高性能和簡單路由的應用場景。 主要特點 顯式匹配:與其他路由…

Marin說PCB之----板材的替換注意事項

由于最近很多武林上的主流門派都需要采用將的本方案,小編所在的宗門古族也是不例外了,宗門大長老韓立現在想把之前一直在用的板材EM370Z替換成生益的Autolad3,讓我去拿資料分析一下是否可以替換。下圖所示是就是小編我做的一個表格關于兩家板…

4月28日信息差全景:國際局勢、科技突破與市場震蕩一、國際政治與安全:俄烏沖突關鍵轉折

一、國際政治與安全:俄烏沖突關鍵轉折 1. 烏克蘭反攻進展與情報差異 前線動態: 俄國防部稱在頓涅茨克擊退烏軍三次進攻,摧毀12輛坦克;烏方則宣布在巴赫穆特南部推進2公里,雙方戰報存在顯著差異。 信息差根源:戰場信息管控導致西方媒體與俄媒報道截然不同。 國際援助: 美…

關系數據的可視化

目錄 【實驗目的】 【實驗原理】 【實驗環境】 【實驗步驟】 一、安裝Python所需要的第三方模塊 二、實驗 【實驗總結】 【實驗目的】 1.掌握關系數據在大數據中的應用 2.掌握關系數據可視化方法 3. python 程序實現圖表 【實驗原理】 在傳統的觀念里面&#xff0…

夏季道路安全的AI革命:節省人力、提升效率

AI夏季道路安全:用智能算法守護每一條街道 背景:夏季道路安全的挑戰與機遇 夏季是道路安全事件的高發期。高溫天氣容易導致駕駛員疲勞、行人行為異常(如跌倒或中暑),同時,車流量增加、夜間活動頻繁…

HTML標記語言_@拉鉤教育【筆記】

目錄 1.文本標簽 2.格式化標簽 3.圖片標簽 4.超鏈接標簽 5.表格標簽 6表單標簽 6.1 6.2 6.3 7.行內框架(超鏈接內套一個頁面) 8.多媒體標簽(音/視頻) 1.文本標簽 2.格式化標簽 3.圖片標簽 4.超鏈接標簽 5.表格標簽 6表單標簽 6.1 6.2 6.3 7.行內框架(超鏈接內套一個…

Python 中調用方法內部定義的類詳解(類在方法中的各種操作)

更多內容請見: python3案例和總結-專欄介紹和目錄 文章目錄 一、基本概念1.1 方法內部定義類概述1.2 方法內部定義類的特點1.3 替代方案二、基本使用2.1 直接在方法內部使用2.2 返回類定義供外部使用2.3 返回類的實例2.4 作為閉包使用(訪問外部變量)三、高級用法3.1 動態類創…

第36課 常用快捷操作——用“鼠標右鍵”退出當前命令

概述 在AD 20軟件中,很多的命令都是可以一直連續下去的,比方說放置一個元器件符號,如果你當中不取消的話,那就可以一直執行下去,放完一個接著放下一個,放完一個接著放下一個…… 想要退出這種連續進行的命…

FFTW3.3.10庫與QT結合的使用

FFTW(Fastest Fourier Transform in the West)是世界上最快的FFT, 實測計算長度為10000的double數組, 單次運行時間在2ms左右。為了詳細了解FFTW以及為編程方便,特將用戶手冊看了一下,并結合手冊制作了以下…

服務器異地備份,服務器異地備份有哪些方法?

服務器異地備份是應對區域性災難(如地震、火災、洪水)或人為事故(如誤刪除、勒索病毒攻擊)的關鍵策略,其核心在于將數據副本存儲在物理隔離的地理位置,確保主數據中心故障時仍可恢復業務。 以下是主流的異地…

導軌表面硬化處理有哪些?

導軌是機器工作的重要組成部分,它與滑塊緊密配合,保證機器的運轉精度和定位精度。為了提高導軌的耐磨性能和使用壽命,通常在導軌表面加工硬化層。硬化層一般是在導軌表面形成一層高硬度和高強度的薄層,有效地提高了導軌的耐磨性能…

Android Compose vs 傳統View系統:全面對比與選型指南

Android Compose vs 傳統View系統:全面對比與選型指南 一、引言 隨著Android Jetpack Compose的正式發布,Android開發迎來了全新的聲明式UI框架。本文將全面對比Compose與傳統View系統的差異,幫助開發者做出合理的技術選型。 二、核心架構…