UCOSIII移植——學習筆記1

?本文是筆者在學習?正點原子官方?的《【正點原子】手把手教你學UCOS-III實時操作系統》系列視頻時整理的筆記。
視頻講解清晰透徹,非常感謝UP主的無私奉獻!原課程鏈接如下:
👉 B站視頻鏈接:【正點原子】手把手教你學UCOS-III實時操作系統_嗶哩嗶哩_bilibili

目錄

1、添加UCOSIII源碼

2、修改SYSTEM文件

3、修改中斷相關文件

4、修改四個頭文件

5、測試移植是否成功


1、添加UCOSIII源碼

①復制內存管理實驗到我們新創建的統一存放UCOSIII的文件夾下:

②去官網下載好這三個源代碼

鏈接:https://github.com/weston-embedded/

③將“內存管理實驗”的文件夾名修改為“UCOSIII移植”,并在里面新建一個名為“uC-OS3”文件夾,

將剛下載好的三個源代碼解壓后全部放在“uC-OS3”文件夾內。

④打開實驗工程,創建下面4個分組

⑤從“uC-OS3”文件中的CPU和OS3文件夾中分別添加這兩個文件到這個BSP分組上。

后面這些類似步驟,將下面的文件添加到對應的分組即可。

⑥添加路徑


2、修改SYSTEM文件

sys.h里將宏置1

usart.c里將包含的頭文件"include.h"修改成“os.h"

③delay.c

(1)修改頭文件

(2)從定義的變量后面開始刪到delay_ostimedly()函數為止(包括該函數)。

(3)修改systick中斷服務函數

(4)修改延遲初始化的函數

(5)修改微秒延遲的函數

(6)修改毫秒延遲的函數


3、修改中斷相關文件

stm32f10x_it.cstm32f10x_it.h

重復定義了注釋掉

startup_stmf10x_hd.s


4、修改四個頭文件

因為要修改的宏比較多,所以直接復制粘貼了移植成功后的實驗的相關頭文件。

要修改的頭文件路徑如圖所示:


5、測試移植是否成功

編譯之后發現有很多錯誤,集中錯誤顯示在ucos_ii.h文件,顯示變量未定義。

但是我們要用的是ucosIII的,不需要原來的關于UCOSII的文件,把這三個分組的刪掉并且把相關路徑刪掉問題就解決了。

編譯0錯誤0警告之后,將移植成功后的實驗的demo文件加進去,下載編譯后0錯誤0警告。

demo代碼如下:

/******************************************************************************************************* @file        uc-os3_demo.c* @author      正點原子團隊(ALIENTEK)* @version     V1.0* @date        2022-04-13* @brief       uC/OS-III 移植實驗* @license     Copyright (c) 2020-2032, 廣州市星翼電子科技有限公司***************************************************************************************************** @attention** 實驗平臺:正點原子 探索者 F407開發板* 在線視頻:www.yuanzige.com* 技術論壇:www.openedv.com* 公司網址:www.alientek.com* 購買地址:openedv.taobao.com******************************************************************************************************/#include "uc-os3_demo.h"
#include "usart.h"
#include "led.h"
#include "delay.h"
/*uC/OS-III*********************************************************************************************/
#include "os.h"
#include "cpu.h"/******************************************************************************************************/
/*uC/OS-III配置*///UCOSIII中以下優先級用戶程序不能使用,ALIENTEK
//將這些優先級分配給了UCOSIII的5個系統內部任務
//優先級0:中斷服務服務管理任務 OS_IntQTask()
//優先級1:時鐘節拍任務 OS_TickTask()
//優先級2:定時任務 OS_TmrTask()
//優先級OS_CFG_PRIO_MAX-2:統計任務 OS_StatTask()
//優先級OS_CFG_PRIO_MAX-1:空閑任務 OS_IdleTask()
//技術支持:www.openedv.com
//淘寶店鋪:http://eboard.taobao.com  
//廣州市星翼電子科技有限公司  
//作者:正點原子 @ALIENTEK//任務優先級
#define START_TASK_PRIO		3
//任務堆棧大小	
#define START_STK_SIZE 		512
//任務控制塊
OS_TCB StartTaskTCB;
//任務堆棧	
CPU_STK START_TASK_STK[START_STK_SIZE];
//任務函數
void start_task(void *p_arg);//任務優先級
#define LED0_TASK_PRIO		4
//任務堆棧大小	
#define LED0_STK_SIZE 		128
//任務控制塊
OS_TCB Led0TaskTCB;
//任務堆棧	
CPU_STK LED0_TASK_STK[LED0_STK_SIZE];
void led0_task(void *p_arg);//任務優先級
#define LED1_TASK_PRIO		5
//任務堆棧大小	
#define LED1_STK_SIZE 		128
//任務控制塊
OS_TCB Led1TaskTCB;
//任務堆棧	
CPU_STK LED1_TASK_STK[LED1_STK_SIZE];
//任務函數
void led1_task(void *p_arg);//任務優先級
#define FLOAT_TASK_PRIO		6
//任務堆棧大小
#define FLOAT_STK_SIZE		128
//任務控制塊
OS_TCB	FloatTaskTCB;
//任務堆棧
__align(8) CPU_STK	FLOAT_TASK_STK[FLOAT_STK_SIZE];
//任務函數
void float_task(void *p_arg);
/******************************************************************************************************//*** @brief       uC/OS-III例程入口函數* @param       無* @retval      無*/void uc_os3_demo(void)
{OS_ERR err;OSInit(&err);		//初始化UCOSIII//創建開始任務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,					//任務內部消息隊列能夠接收的最大消息數目,為0時禁止接收消息(OS_TICK	  )0,					//當使能時間片輪轉時的時間片長度,為0時為默認長度,(void   	* )0,					//用戶補充的存儲區(OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任務選項(OS_ERR 	* )&err);				//存放該函數錯誤時的返回值OSStart(&err);  //開啟UCOSIII
}/*** @brief       start_task* @param       p_arg : 傳入參數(未用到)* @retval      無*/
//開始任務函數
void start_task(void *p_arg)
{OS_ERR err;p_arg = p_arg;CPU_Init();
#if OS_CFG_STAT_TASK_EN > 0uOSStatTaskCPUUsageInit(&err);  	//統計任務                
#endif#ifdef CPU_CFG_INT_DIS_MEAS_EN		//如果使能了測量中斷關閉時間CPU_IntDisMeasMaxCurReset();	
#endif#if	OS_CFG_SCHED_ROUND_ROBIN_EN  //當使用時間片輪轉的時候//使能時間片輪轉調度功能,時間片長度為1個系統時鐘節拍,既1*5=5msOSSchedRoundRobinCfg(DEF_ENABLED,1,&err);  
#endif		OSSchedRoundRobinCfg(OS_TRUE, 0, &err);//創建LED0任務OSTaskCreate((OS_TCB 	* )&Led0TaskTCB,		(CPU_CHAR	* )"led0 task", 		(OS_TASK_PTR )led0_task, 			(void		* )0,					(OS_PRIO	  )LED0_TASK_PRIO,     (CPU_STK   * )&LED0_TASK_STK[0],	(CPU_STK_SIZE)LED0_STK_SIZE/10,	(CPU_STK_SIZE)LED0_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);				//創建LED1任務OSTaskCreate((OS_TCB 	* )&Led1TaskTCB,		(CPU_CHAR	* )"led1 task", 		(OS_TASK_PTR )led1_task, 			(void		* )0,					(OS_PRIO	  )LED1_TASK_PRIO,     	(CPU_STK   * )&LED1_TASK_STK[0],	(CPU_STK_SIZE)LED1_STK_SIZE/10,	(CPU_STK_SIZE)LED1_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 	* )&FloatTaskTCB,		(CPU_CHAR	* )"float test task", 		(OS_TASK_PTR )float_task, 			(void		* )0,					(OS_PRIO	  )FLOAT_TASK_PRIO,     	(CPU_STK   * )&FLOAT_TASK_STK[0],	(CPU_STK_SIZE)FLOAT_STK_SIZE/10,	(CPU_STK_SIZE)FLOAT_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);								 		 OSTaskDel((OS_TCB *)0, &err);
}//led0任務函數
void led0_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); //延時500msLED0=1;OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延時500ms}
}//led1任務函數
void led1_task(void *p_arg)
{OS_ERR err;p_arg = p_arg;while(1){LED1=~LED1;OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延時500ms}
}//浮點測試任務
void float_task(void *p_arg)
{static float float_num=0.01;while(1){float_num+=0.01f;printf("float_num的值為: %.4f\r\n",float_num);delay_ms(500);			//延時500ms}
}

最后下載觀察現象,移植成功了!!!!

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

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

相關文章

SpringBootCodeGenerator使用JSqlParser解析DDL CREATE SQL 語句

🧠 使用 JSqlParser 解析 CREATE TABLE SQL 語句詳解在數據庫開發中,我們常常需要從 SQL 中提取表結構信息,比如字段名、類型、注釋等。相比使用正則表達式,JSqlParser 提供了更可靠的方式來解析 SQL 語句,尤其適用于復…

css3新增-網格Grid布局

目錄flex彈性布局Gird布局開啟網格布局定義網格中的行和列長度值百分比值新單位fr關鍵字函數minmax(min, max)函數-repeatauto-fill vs auto-fit舉例說明grid-template-areasgapgrid-auto-columns和grid-auto-rowsjustify-contentalign-contentjustify-contentalign-contentjus…

最新最強新太極工具3.6 支持Windows和不支持mac電腦,支持免改碼,和改碼,支持12—18系統

溫馨提示:文末有資源獲取方式最新最強太極工具3.6支持Windows和Mac計算機,支持無代碼更改和代碼更改,支持12-18個系統 支持A7-A11芯片、Apple 5s x、iPad A7至A11芯片,支持所有者鎖定、激活鎖定、無法激活(密碼界面和禁…

深入淺出 C++20:新特性與實踐

C20 是 C 編程語言的一次重要更新,引入了許多新特性和改進,旨在提升代碼的簡潔性、安全性和性能。本文將詳細介紹 C20 的一些核心特性,并通過示例代碼幫助讀者理解這些特性的應用場景。C20 新特性總結 以下是 C20 的主要新特性及其簡要描述&a…

CSS 屬性概述

CSS 屬性概述 CSS 屬性用于控制 HTML 元素的樣式和行為,包括布局、顏色、字體、動畫等。以下是常用的 CSS 屬性分類及示例: 布局相關屬性 display: 控制元素的顯示方式,如 block、inline、flex、grid。position: 定義元素的定位方式&#…

--- 統一請求入口 Gateway ---

spring cloud gateway 官方文檔 Spring Cloud Gateway 中文文檔 什么是api網關 對于微服務的每個接口,我們都需要校驗請求的權限是否足夠,而微服務把項目細化除了許多個接口,若這些接口都要對服務進行權限校驗的話,那么無疑加重…

返利app的消息隊列架構:基于RabbitMQ的異步通信與解耦實踐

返利app的消息隊列架構:基于RabbitMQ的異步通信與解耦實踐 大家好,我是阿可,微賺淘客系統及省賺客APP創始人,是個冬天不穿秋褲,天冷也要風度的程序猿! 在返利app的業務流程中,用戶下單、返利計算…

Vue3 響應式失效 debug:Proxy 陷阱導致數據更新異常的深度排查

人們眼中的天才之所以卓越非凡,并非天資超人一等而是付出了持續不斷的努力。1萬小時的錘煉是任何人從平凡變成超凡的必要條件。———— 馬爾科姆格拉德威爾 🌟 Hello,我是Xxtaoaooo! 🌈 “代碼是邏輯的詩篇&#xff0…

【貪心算法】day10

📝前言說明: 本專欄主要記錄本人的貪心算法學習以及LeetCode刷題記錄,按專題劃分每題主要記錄:(1)本人解法 本人屎山代碼;(2)優質解法 優質代碼;&#xff…

LeetCode算法日記 - Day 42: 島嶼數量、島嶼的最大面積

目錄 1. 島嶼數量 1.1 題目解析 1.2 解法 1.3 代碼實現 2. 島嶼的最大面積 2.1 題目解析 2.2 解法 2.3 代碼實現 1. 島嶼數量 https://leetcode.cn/problems/number-of-islands/ 給你一個由 1(陸地)和 0(水)組成的的二維…

短波紅外相機在機器視覺檢測方向的應用

短波紅外相機在機器視覺檢測方向的應用短波紅外相機:機器視覺的“低成本突破者”一、打破成本困局:短波紅外的“平民化”革新二、核心技術:有機材料的“硬核創新”1. 材料革命:有機感光層的優勢2. 工藝兼容:嫁接成熟CM…

【數據結構與算法】圖 Floyd算法

相關題目: 1334. 閾值距離內鄰居最少的城市 - 力扣(LeetCode) 資料 : Floyd算法原理及公式推導 - 知乎 Floyd 算法是一種經典的動態規劃算法,用與求解圖中所有頂點之間的最短短路路徑。它由Robert Floyd 于1962…

衛星通信天線的指向精度,含義、測量和計算

衛星通信天線的指向精度,含義、測量和計算我們在衛星通信天線的技術規格書中,都會看到天線指向精度這個指標。一般來說,技術規格書上的天線指向精度的參數是這么寫的:“天線指向精度≤1/10半功率波束帶寬”今天這個文章&#xff0…

基于LSTM與3秒級Tick數據的金融時間序列預測實現

數據加載模塊解析 def load_data(filepath):df pd.read_csv(filepath)return df該函數承擔基礎數據采集職責,通過Pandas庫讀取CSV格式的高頻交易數據(典型如股票分筆成交明細)。輸入參數為文件路徑字符串,輸出結構化DataFrame對象…

C# --- Field and Property

C# --- Field and Property字段 (Field) vs. 屬性 (Property)Property的聲明初始化方法單例類property錯誤初始化導致線程泄漏字段 (Field) vs. 屬性 (Property) 字段 (Field) - 數據的存儲容器 字段是直接在類或結構中聲明的變量。它是存儲數據的地方,是對象狀態的…

【Python】實現一個文件夾快照與比較工具

1. 工具簡介 在日常開發、項目管理或備份場景中,我們經常需要知道某個文件夾中的文件是否發生變化,例如: 項目源碼是否新增或修改文件?數據集是否被不小心刪除或篡改?備份文件夾是否和上次一致? 本教程將教…

LINUX913 shell:set ip [lindex $argv 0],\r,send_user,spawn ssh root@ip “cat “

問題 獲取公鑰 [codesamba ~]$ cat pub.sh #!/bin/usr/expect set ip "$1" set password 123456 set timeout 20 spawn ssh root192.168.235.100:cat ~/.ssh/id_rsa.pub expect { "yes/no" {send "yes/r";exp_continue} "password:" {…

Acwing算法基礎課--鏈表

一、單鏈表 AcWing 826. 單鏈表 代碼 N 100010 idx 0 e [0] * N ne [0] * N head -1def init():global idx,headidx 0head -1def add_head(x):global idx,heade[idx] xne[idx] headhead idxidx 1def delete(k):ne[k] ne[ne[k]]def add_k(k,x):global idxe[idx] …

AI表征了西方的有界,AI+體現了東方的無界

AI表征了西方的有界,AI體現了東方的無界,試圖通過文化差異的視角來對比傳統AI(AI)與增強型或融合型AI(AI)的特征。一、“AI表征了西方的有界”西方的“有界”可以理解為:1、邏輯清晰、結構嚴謹&…

LabVIEW泵輪檢測

?在現代制造業蓬勃發展的浪潮下,汽車行業也迎來了高速發展期。液力變矩器作為實現車輛自動變速的關鍵零件產品,在汽車動力系統中扮演著不可或缺的角色。泵輪作為液力變矩器的核心組成部分,其生產質量直接影響著液力變矩器的性能。因此&#…