?本文是筆者在學習?正點原子官方?的《【正點原子】手把手教你學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.c和stm32f10x_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}
}
最后下載觀察現象,移植成功了!!!!