STM32關于uc/OS-III的多任務程序

目錄

一、UCOS-III源碼獲取

二、HAL庫工程的建立

1.RCC配置

2.SYS配置

3.USART1配置

4.GPIO配置

5.時鐘配置

6.項目配置

三、KEil文件添加

1.文件復制

2.KEil工程添加

3.添加文件路徑

四、代碼修改

1.

2.修改文件app_cfg.h中代碼

3.修改include.h的代碼

4.修改bsp.c和bsp.h的代碼

5.修改文件lib_cfg.h中的代碼

6.修改文件app.c

7.main.c代碼編寫

五、實驗效果


嵌入式實時操作系統是一個特殊的程序,是一個支持多任務的運行環境。嵌入式實時操作系統最大的特點就是“實時性”,如果有一個任務需要執行,實時操作系統會立即執行該任務,不會有較長的延時。

這次實驗我們學習嵌入式實時操作系統(RTOS),以uc/OS為例,將其移植到stm32F103上,構建至少3個任務(task):

其中兩個task分別以1s和3s周期對LED等進行點亮-熄滅的控制;

另外一個task以2s周期通過串口發送“hello uc/OS! 歡迎來到RTOS多任務環境!”。記錄詳細的移植過程。

一、UCOS-III源碼獲取

鏈接: 百度網盤 請輸入提取碼

提取碼: 6666

二、HAL庫工程的建立

1.RCC配置

2.SYS配置

3.USART1配置

配置NVIC:

4.GPIO配置

配置PB0,PB1為輸出管腳。

5.時鐘配置

6.項目配置

三、KEil文件添加

1.文件復制

(1)首先我們在剛配置好的項目文件中添加對應的文件夾OS和UCOSIII

(2)在UCOSIII文件夾中添加uCOS-III源碼包中的下列三個文件

(3)在文件路徑為\uCOS-III源碼包\UCOSIII 3.04\Micrium\Software\EvalBoards\ST\STM32F429II-SK\uCOS-III中的找到下圖的文件添加到OS文件夾中。

并新增三個空文件app.h;bsp.c;bsp.h。

2.KEil工程添加

(1)打開工程,添加如圖的六個組

(2)導入文件

在Application/User/Core添加app.c文件

將OS文件夾中的bsp.cbsp.h添加到文件夾bsp中

UCOSIII/uC-CPU中的cpu_core.ccpu_core.hcpu_def.h添加進CPU組中,同時將UCOSIII/uC-CPU/ARM-Cortex-M3/RealView中的三個文件添加到該

UCOSIII/uC-LIB中的9個文件添加到LIB組中,同時將UCOSIII/uC-LIB/Ports/ARM-Cortex-M3/Realview中的lib_mem_a.asm添加到該組

UCOSIII/UcosIII/Ports/ARM-Cortex-M3/Generic/RealView中的3個文件添加的Ports組中

UCOSIII/UcosIII/Source中的20個文件添加到Source組中:

OS文件夾中下圖的8個文件添加到OS_cfg組中

3.添加文件路徑

點擊魔法棒,選擇C/C++,添加如下7個文件夾的路徑

四、代碼修改

1.

將代碼

 ? ? ? ? ? ? ?  DCD ? ? PendSV_Handler ? ? ? ? ? ? ; PendSV HandlerDCD ? ? SysTick_Handler ? ? ? ? ?  ; SysTick Handler

改為:

 ? ? ? ? ? ? ?  DCD ? ? OS_CPU_PendSVHandler ? ;? ? ? ?DCD ? ? OS_CPU_SysTickHandler ? ? ;

2.修改文件app_cfg.h中代碼

(1)將

#define APP_CFG_SERIAL_EN  DEF_ENABLED

改為

#define APP_CFG_SERIAL_EN  DEF_DISABLED

(2)

#define APP_TRACE  BSP_Ser_Printf

改為

#define APP_TRACE  (void)

3.修改include.h的代碼

(1)

#include <stm32f10x_lib.h>

改為

#include "stm32f1xx_hal.h"

(2)添加頭文件

#include "gpio.h"
#include "app_cfg.h"
#include "app.h"

4.修改bsp.c和bsp.h的代碼

將bsp.c代碼全部改為:

// bsp.c
#include "includes.h"#define  DWT_CR      *(CPU_REG32 *)0xE0001000
#define  DWT_CYCCNT  *(CPU_REG32 *)0xE0001004
#define  DEM_CR      *(CPU_REG32 *)0xE000EDFC
#define  DBGMCU_CR   *(CPU_REG32 *)0xE0042004#define  DEM_CR_TRCENA                   (1 << 24)
#define  DWT_CR_CYCCNTENA                (1 <<  0)CPU_INT32U  BSP_CPU_ClkFreq (void)
{return HAL_RCC_GetHCLKFreq();
}void BSP_Tick_Init(void)
{CPU_INT32U cpu_clk_freq;CPU_INT32U cnts;cpu_clk_freq = BSP_CPU_ClkFreq();#if(OS_VERSION>=3000u)cnts = cpu_clk_freq/(CPU_INT32U)OSCfg_TickRate_Hz;#elsecnts = cpu_clk_freq/(CPU_INT32U)OS_TICKS_PER_SEC;#endifOS_CPU_SysTickInit(cnts);
}void BSP_Init(void)
{BSP_Tick_Init();MX_GPIO_Init();
}#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
void  CPU_TS_TmrInit (void)
{CPU_INT32U  cpu_clk_freq_hz;DEM_CR         |= (CPU_INT32U)DEM_CR_TRCENA;                /* Enable Cortex-M3's DWT CYCCNT reg.                   */DWT_CYCCNT      = (CPU_INT32U)0u;DWT_CR         |= (CPU_INT32U)DWT_CR_CYCCNTENA;cpu_clk_freq_hz = BSP_CPU_ClkFreq();CPU_TS_TmrFreqSet(cpu_clk_freq_hz);
}
#endif#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
CPU_TS_TMR  CPU_TS_TmrRd (void)
{return ((CPU_TS_TMR)DWT_CYCCNT);
}
#endif#if (CPU_CFG_TS_32_EN == DEF_ENABLED)
CPU_INT64U  CPU_TS32_to_uSec (CPU_TS32  ts_cnts)
{CPU_INT64U  ts_us;CPU_INT64U  fclk_freq;fclk_freq = BSP_CPU_ClkFreq();ts_us     = ts_cnts / (fclk_freq / DEF_TIME_NBR_uS_PER_SEC);return (ts_us);
}
#endif#if (CPU_CFG_TS_64_EN == DEF_ENABLED)
CPU_INT64U  CPU_TS64_to_uSec (CPU_TS64  ts_cnts)
{CPU_INT64U  ts_us;CPU_INT64U  fclk_freq;fclk_freq = BSP_CPU_ClkFreq();ts_us     = ts_cnts / (fclk_freq / DEF_TIME_NBR_uS_PER_SEC);return (ts_us);
}
#endif

將bsp.h代碼全部改為:

// bsp.h
#ifndef  __BSP_H__
#define  __BSP_H__#include "stm32f1xx_hal.h"void BSP_Init(void);#endif

5.修改文件lib_cfg.h中的代碼

添加如下代碼:

#define  LIB_MEM_CFG_HEAP_SIZE ? ? ? ?  10u * 1024u

6.修改文件app.c

添加如下代碼:

#include "includes.h"

7.main.c代碼編寫

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <includes.h>
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV */
//?????
static  OS_TCB   AppTaskStartTCB;//????
static  CPU_STK  AppTaskStartStk[APP_TASK_START_STK_SIZE];/* ?????? --------------------------------------------------------------*/
static  void  AppTaskCreate(void);
static  void  AppObjCreate(void);
static  void  AppTaskStart(void *p_arg);
static  void  send_msg (void *p_arg);
/* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/**Initializes the CPU, AHB and APB busses clocks */RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/**Initializes the CPU, AHB and APB busses clocks */RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 */OS_ERR  err;/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */
//  HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */
//  SystemClock_Config();/* USER CODE BEGIN SysInit */OSInit(&err);    /* USER CODE END SysInit *//* Initialize all configured peripherals */
//  MX_GPIO_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE *//* ???? */OSTaskCreate((OS_TCB     *)&AppTaskStartTCB,                /* Create the start task                                */(CPU_CHAR   *)"App Task Start",(OS_TASK_PTR ) AppTaskStart,(void       *) 0,(OS_PRIO     ) APP_TASK_START_PRIO,(CPU_STK    *)&AppTaskStartStk[0],(CPU_STK_SIZE) APP_TASK_START_STK_SIZE / 10,(CPU_STK_SIZE) APP_TASK_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);/* ???????,?????uC/OS-III */OSStart(&err);            /* Start multitasking (i.e. give control to uC/OS-III). */}/*** ????: ????????* ????: p_arg ?????????????* ? ? ?: ?* ?    ?:?*/
static  void  AppTaskStart (void *p_arg)
{OS_ERR      err;(void)p_arg;BSP_Init();                                                 /* Initialize BSP functions                             */CPU_Init();Mem_Init();                                                 /* Initialize Memory Management Module                  */#if OS_CFG_STAT_TASK_EN > 0uOSStatTaskCPUUsageInit(&err);                               /* Compute CPU capacity with no task running            */
#endifCPU_IntDisMeasMaxCurReset();AppTaskCreate();                                            /* Create Application Tasks                             */AppObjCreate();                                             /* Create Application Objects                           */while (DEF_TRUE){HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_SET);OSTimeDlyHMSM(0, 0, 0, 500,OS_OPT_TIME_HMSM_STRICT,&err);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}static  void  send_msg (void *p_arg)
{OS_ERR      err;(void)p_arg;BSP_Init();                                                 /* Initialize BSP functions                             */CPU_Init();Mem_Init();                                                 /* Initialize Memory Management Module                  */#if OS_CFG_STAT_TASK_EN > 0uOSStatTaskCPUUsageInit(&err);                               /* Compute CPU capacity with no task running            */
#endifCPU_IntDisMeasMaxCurReset();AppTaskCreate();                                            /* Create Application Tasks                             */AppObjCreate();                                             /* Create Application Objects                           */while (DEF_TRUE){printf("hello world \r\n");OSTimeDlyHMSM(0, 0, 0, 500,OS_OPT_TIME_HMSM_STRICT,&err);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/* USER CODE BEGIN 4 */
/*** ????: ??????* ????: p_arg ?????????????* ? ? ?: ?* ?    ?:?*/
static  void  AppTaskCreate (void)
{}/*** ????: uCOSIII??????* ????: ?* ? ? ?: ?* ?    ?:?*/
static  void  AppObjCreate (void)
{}
/* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state *//* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{ /* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

五、實驗效果

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

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

相關文章

【傳知代碼】DETR[端到端目標檢測](論文復現)

前言&#xff1a;想象一下&#xff0c;當自動駕駛汽車行駛在繁忙的街道上&#xff0c;DETR能夠實時識別出道路上的行人、車輛、交通標志等目標&#xff0c;并準確預測出它們的位置和軌跡。這對于提高自動駕駛的安全性、減少交通事故具有重要意義。同樣&#xff0c;在安防監控、…

【二進制部署k8s-1.29.4】十、coredns的安裝部署

文章目錄 簡介 一.下載并修改coredns配置文件二.安裝coredns三.驗證coredns的安裝 簡介 本章節主要講解安裝coredns-v1.11.1的安裝&#xff0c;并進行驗證。 第一章.安裝前軟件準備及系統初始化階段 第二章.證書及配置文件的準備 一.下載并修改coredns配置文件 下載地址&#x…

未來已來:Angular、React、Vue.js——前端框架的三大巨頭

目錄 前言 一、Angular框架 特點和優勢 核心技術和應用場景 二、React框架 特點和優勢 核心技術和應用場景 三、Vue.js框架 特點和優勢 核心技術和應用場景 總結&#xff1a; 前言 在Web前端開發領域&#xff0c;隨著技術的不斷發展&#xff0c;出現了眾多優秀的框…

APP開發技術的變遷史

隨著移動互聯網的迅猛發展&#xff0c;APP&#xff08;應用程序&#xff09;已經成為人們日常生活中不可或缺的一部分。從最初的簡單工具到如今的智能平臺&#xff0c;APP開發技術在這十年間經歷了翻天覆地的變化。本文將從多個維度探討近十年來APP開發技術的變遷史&#xff0c…

【Python學習路線(課程大綱+Python視頻教程+下載地址)_python 教程下載。】

目前Python已經成為最受歡迎的程序設計語言之一。Python的設計哲學是“優雅”、“明確”、“簡單”。 學習Python具有多重顯著的好處。首先&#xff0c;Python的語法簡潔易讀&#xff0c;降低了編程的入門門檻&#xff0c;使初學者能夠更快地掌握編程的基本概念。其次&#xff…

OpenCV 4.10 發布

OpenCV 4.10 JPEG 解碼速度提升 77%&#xff0c;實驗性支持 Wayland、Win ARM64 根據 “OpenCV 中國團隊” 介紹&#xff0c;從 4.10 開始 OpenCV 對 JPEG 圖像的讀取和解碼有了 77% 的速度提升&#xff0c;超過了 scikit-image、imageio、pillow。 4.10 版本的一些亮點&…

限流定義、算法、實施方案

限流定義 1、 時間 &#xff0c; 基于某段時間或某個時間點&#xff0c;即&#xff1a;時間窗口 2、資源&#xff1a; 對可用資源進行限制&#xff1a; QPS/連接數/傳輸速率/黑白名單等 分布式環境下&#xff0c;主流限流方案&#xff1a; 網關層限流&#xff1a;流量入口Ngi…

web 前端開發培訓:深入探索與實戰應用

web 前端開發培訓&#xff1a;深入探索與實戰應用 在數字化時代&#xff0c;Web前端開發已成為互聯網行業的熱門職業之一。然而&#xff0c;要想成為一名優秀的Web前端開發者&#xff0c;不僅需要掌握扎實的技術基礎&#xff0c;還需要具備豐富的實戰經驗和創新思維。本文將從…

點云庫tops(point cloud library)

pcl GitHub - PointCloudLibrary/pcl: Point Cloud Library (PCL) GitHub - HuangCongQing/pcl-learning: &#x1f525;PCL&#xff08;Point Cloud Library&#xff09;點云庫學習記錄 draco GitHub - google/draco: Draco is a library for compressing and decompress…

固定數量點云采樣算法

pcl::random_sample 使用案例 算法原理 /** \brief b RandomSample applies a random sampling with uniform probability.* Based off Algorithm A from the paper "Faster Methods for Random Sampling"* by Jeffrey Scott Vitter. The algorithm runs in O(N) an…

深入理解Python:面向對象編程與實踐

深入理解Python:面向對象編程與實踐 Python是一種功能強大且靈活的編程語言,廣泛應用于Web開發、數據分析、人工智能等領域。本文將深入探討Python中的面向對象編程(OOP)概念,并通過實際代碼示例展示其應用。 目錄 面向對象編程概述類與對象繼承與多態封裝與私有化類與對…

Unity2D游戲制作入門 | 12(之人物受傷和死亡的邏輯動畫)

上期鏈接&#xff1a;Unity2D游戲制作入門 | 11(之人物屬性及傷害計算)-CSDN博客 上期我們聊到了人物的自身屬性和受傷時的計算&#xff0c;我們先給人物和野豬掛上屬性和攻擊屬性的代碼&#xff0c;然后通過觸發器觸發受傷的事件。物體&#xff08;人物也好敵人也行&#xff…

思考、學習、創造、越來越有趣

程序員應該有什么職業素養&#xff1f; 對于程序員而言&#xff0c;把復雜的事情變簡單是最重要的能力&#xff01; 方向一&#xff1a;專業精神 程序的本質是算法&#xff0c;無論復雜或不復雜&#xff1b;程序員就是幫助使用者把重復的工作交給代碼。所以程序員最本質的能力…

2024 IDEA最新永久使用碼教程(2099版)

本篇文章我就來分享一下2024年當前最新版 IntelliJ IDEA 最新注冊碼&#xff0c;教程如下&#xff0c;可免費永久&#xff0c;親測有效&#xff0c;適合Windows和Mac。 本教程適用于 J B 全系列產品&#xff0c;包括 Pycharm、IDEA、WebStorm、Phpstorm、Datagrip、RubyMine、…

Vue基礎知識:插槽——默認插槽,插槽的后備內容,具名插槽,作用域插槽的認識與使用。(slot,#default,row的認識)

1.插槽的基本認識&#xff1a; 作用&#xff1a;讓組件內部的一些結構支持自定義 插槽的分類&#xff1a; 1.默認插槽&#xff08;組件內只能定制一處結構&#xff09; 2.具名插槽&#xff08;組件內可以定制多次結構&#xff09; 簡單而言&#xff1a;就是你希望封裝一個…

09-數組的含義以及零長數組變長數組與多維數組

09-數組的含義以及零長數組變長數組與多維數組 文章目錄 09-數組的含義以及零長數組變長數組與多維數組一、數組名的含義1.1 表示整個數組的首地址1.2 表示整個數組首元素的首地址 二、數組下標字符串常量 三、零長數組3.1 示例 四、變長數組4.1 示例 五、多維數組5.1 定義與初…

nodejs---fs模塊,文件讀寫操作詳解,自定義一個文件寫入方法

fs模塊導入 Node.js 同時支持 CommonJS 和 ES 模塊系統&#xff08;自 Node.js v12 以來&#xff09; // 兩種模塊導入方式 import * as fs from fs;// Es6:這種方式需要在package.json中配置"type": "module" const fs require(fs);// commonJs:如果你…

golang協程工作池處理多任務示例

1. 工作方法實現 // 工作線程 // id : 線程號 // jobs : 任務通道 (chan) // results: 完成結果通道 (chan) func worker(id int, jobs <-chan int, results chan<- int) {//遍歷任務for j : range jobs {fmt.Println("工作協程: ", id, "啟動任務: &quo…

oracle中如何查詢特定日期?

1. select last_day(to_date(20230101,YYYYMMDD)) from dual; select last_day(to_date(V_END_DATE,YYYYMMDD)) from dual; --查詢任意一天 當月的最后一天 2. select to_char(to_date(20230101,YYYYMMDD)-1,YYYYMMDD) INTO V_START_DATE FROM DUAL; select to_char(to_dat…

vscode輸出控制臺中文顯示亂碼最有效解決辦法

當VSCode的輸出控制臺中文顯示亂碼時&#xff0c;一個有效的解決辦法是通過設置環境變量來確保編碼的正確性。以下是解決方式&#xff1a; 首先&#xff0c;設置環境變量以修正亂碼問題&#xff1a; 如果上述方法沒有解決亂碼問題&#xff0c;請繼續以下步驟&#xff1a; 右鍵…