一、下载uC/OS-III源码

官网下载地址:http://micrium.com/downloadcenter/
官网下载涉及到账号注册等比较繁琐的过程,笔者在网盘下载的。

二、准备项目文件

新建文件夹
下载好 uC/OS-III 源码文件之后,在下面所示的文件夹里新建两个文件夹 uC-BSP 和 uC-CONFIG

为 uC-BSP 文件夹添加文件
在 uC-BSP 文件夹中新建 bsp.c 和 bsp.h 空文件,后续会使用到

为 uC-CONFIG 文件夹添加文件

三、用 CubeMX 建立 工程

建立工程的过程就不多赘述,直接进行工程的配置过程
选择RCC,如图所示修改即可
选择SYS,也按图修改

配置引脚
设置 PC13 引脚为 GPIO_Output 来点亮 LED 灯

配置串口 USART1

配置完成,导出工程即可。

四、为 HAL 库工程移植文件

1. 为 HAL 工程配置 uCOS 相关文件
将 uCOS 相关文件(共 5 个)复制到 HAL 工程的 MDK-ARM 文件夹下

打开 keil5 工程,点击 Manage Project Items 添加项目
新建如下 6 个项目

BSP选择以下文件

CONFIG里的文件也同上操作

SOURCE里添加的是这个文件路径,一共有二十个

PORT同上

CPU这个分组添加的是uC-CPU文件夹里的文件

Lib分组

五、修改代码

将启动文件里这两处的PendSV_Handler和Systick_Handler改为OS_CPU_PendSVHandlerOS_CPU_SysTickHandler

includes.h里有两处修改
1.在#include <bsp.h> 后面加上

#include “gpio.h”
#include “app_cfg.h”

2.将#include <stm32f10x_lib.h> 改为

#include “stm32f1xx_hal.h”

main.c

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:*                        opensource.org/licenses/BSD-3-Clause********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"
#include "usart.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <includes.h>
#include "stm32f1xx_hal.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* 任务优先级 */
#define START_TASK_PRIO     3
#define LED0_TASK_PRIO      4
#define MSG_TASK_PRIO       5/* 任务堆栈大小  */
#define START_STK_SIZE      64
#define LED0_STK_SIZE       64
#define MSG_STK_SIZE        64//任务堆大小过大会报错,可以试着改小一点/* 任务栈 */
CPU_STK START_TASK_STK[START_STK_SIZE];
CPU_STK LED0_TASK_STK[LED0_STK_SIZE];
CPU_STK MSG_TASK_STK[MSG_STK_SIZE];
/* 任务控制块 */
OS_TCB StartTaskTCB;
OS_TCB Led0TaskTCB;
OS_TCB MsgTaskTCB;
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* 任务函数定义 */
void start_task(void *p_arg);
static  void  AppTaskCreate(void);
static  void  AppObjCreate(void);
static  void  led_pc13(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)
{OS_ERR  err;OSInit(&err);HAL_Init();SystemClock_Config();//MX_GPIO_Init(); 这个在BSP的初始化里也会初始化MX_USART1_UART_Init();  /* 创建任务 */OSTaskCreate((OS_TCB     *)&StartTaskTCB,                /* Create the start task                                */(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);/* 启动多任务系统,控制权交给uC/OS-III */OSStart(&err);            /* Start multitasking (i.e. give control to uC/OS-III). */}void start_task(void *p_arg)
{OS_ERR err;CPU_SR_ALLOC();p_arg = p_arg;/* YangJie add 2021.05.20*/BSP_Init();                                                   /* Initialize BSP functions *///CPU_Init();//Mem_Init();                                                 /* Initialize Memory Management Module */#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      OS_CRITICAL_ENTER();    //进入临界区/* 创建LED0任务 */OSTaskCreate((OS_TCB   * )&Led0TaskTCB,        (CPU_CHAR   * )"led_pc13",        (OS_TASK_PTR )led_pc13,             (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  * )&MsgTaskTCB,     (CPU_CHAR   * )"send_msg",        (OS_TASK_PTR )send_msg,             (void       * )0,                   (OS_PRIO      )MSG_TASK_PRIO,       (CPU_STK   * )&MSG_TASK_STK[0], (CPU_STK_SIZE)MSG_STK_SIZE/10,  (CPU_STK_SIZE)MSG_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);OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err);       //挂起开始任务             OS_CRITICAL_EXIT();    //进入临界区
}
/*** 函数功能: 启动任务函数体。* 输入参数: p_arg 是在创建该任务时传递的形参* 返 回 值: 无* 说    明:无*/
static  void  led_pc13 (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_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);OSTimeDlyHMSM(0, 0, 0, 500,OS_OPT_TIME_HMSM_STRICT,&err);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,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 uc/OS! 欢迎来到 RTOS 多任务环境! \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****/

六、实验效果



对于波形观察,可以参见以下链接,因为在实验时,未能拿到硬件,于是在 我和同学的合作下,通过仿真观察了波形。
参考文章
STM32F103C8T6移植uC/OS-III基于HAL库超完整详细过程
用 Saleae Logic 16 示波器测量并分析 I2C、SPI、串口的信号

学习嵌入式实时操作系统(RTOS),以uc/OS-III为例相关推荐

  1. 嵌入式系统开发16——嵌入式实时操作系统uC/OS的简介及简单应用

    本文主要介绍嵌入式实时操作系统(RTOS),并且以uc/OS为例,将其移植到stm32F103C8T6上,构建3个任务:其中两个task分别以1s和3s周期对LED灯进行点亮-熄灭的控制:另外一个ta ...

  2. 浅议实时操作系统RTOS

    ​01.什么是实时操作系统(RTOS)? 实时操作系统 (Real-Time Operating System,RTOS) 是一种为实时应用程序提供服务的操作系统,该类操作系统能快速响应并处理数据,处 ...

  3. 《嵌入式实时操作系统uC/OS-II》学习摘要

    二. 实时系统概念 1.实时系统的特点 如果逻辑和时序出现了偏差,将会引起严重后果.有两种类型的实时系统:软实时系统和硬实时系统. 在软实时系统系统中,系统的宗旨是指各个任务尽快地运行,而不要求限定某 ...

  4. 嵌入式实时操作系统μC/OS II(一)

    嵌入式实时操作系统μC/OS II 为什么要学习μC/OS-II ㈠.凡从事嵌入式系统开发工作的人,必须对嵌入式操作系统有足够的了解. ㈡.对于初学者,从μC/OS-II开始是个明智的选择. 1.μC ...

  5. 任哲《嵌入式实时操作系统uC/OS-II》 预备工具

    进入工作后,白天负责公司项目开发,晚上蹭加班绩效在公司学点别的东西.虽说待在嵌入式部门,但基本上负责的项目都是微控制器类方面的开发,所以要加强学习真正的嵌入式方面的学习.第一个坑uC/OS-II.我学 ...

  6. 《嵌入式实时操作系统 uc/OS-II 原理及应用》【任哲 主编】随书例程以及使用方法

    说明 uc/OS-II 是一款开源的实时操作系统,但是如果用于商业,是需要付费的.为了深入了解,找到任哲老师的<嵌入式实时操作系统 uc/OS-II 原理及应用>一书,总体还不错.但是书中 ...

  7. 嵌入式实时操作系统ucos-ii_「正点原子NANO STM32开发板资料连载」第三十六章 UCOSII 实验 1任务调度...

    1)实验平台:alientek NANO STM32F411 V1开发板2)摘自<正点原子STM32F4 开发指南(HAL 库版>关注官方微信号公众号,获取更多资料:正点原子 第三十六章 ...

  8. RT-Thread 创始人熊谱翔:我和 Linux、嵌入式实时操作系统 RT-Thread

    我和 Linux.嵌入式实时操作系统 RT-Thread -- RT-Thread创始人熊谱翔,2015 年 接触 Linux 说起 Linux 应该从我在校园时期说起.我是在山城--重庆邮电学院念的 ...

  9. RT-Thread创始人熊谱翔: 我和Linux、嵌入式实时操作系统RT-Thread

    本文转载至: http://www.rt-thread.org/dynamic/78.html 接触Linux 说起Linux应该从我在校园时期说起.我是在山城--重庆邮电学院念的书,1998年时宿舍 ...

  10. 嵌入式实时操作系统ucos-ii_「正点原子NANO STM32开发板资料连载」第三十八章 UCOSII 实验 3...

    1)实验平台:alientek NANO STM32F411 V1开发板2)摘自<正点原子STM32F4 开发指南(HAL 库版>关注官方微信号公众号,获取更多资料:正点原子 第三十八章 ...

最新文章

  1. stm32内部的CAN总线
  2. MySQL免安装版,遇到MSVCR120.dll文件丢失错误的解决方案
  3. windows 2012 r2 x64 安装IIS注意事项
  4. LeetCode题组:第914题-卡牌分组
  5. 我的四轴专用PID参数整定方法及原理
  6. 重写(override / overwrite)
  7. PL/SQL配置文件解析
  8. leetcode —— 133. 克隆图
  9. tomcat出现5个using_下肢深静脉血栓要警惕,出现这5个症状,马上看医生
  10. python中csv库写入表头_python的pandas工具包,保存.csv文件时不要表头的实例
  11. Python学习笔记—条件判断和循环
  12. Intellij IDEA2017破解
  13. Exploring and Distilling Posterior and Prior Knowledge for Radiology Report Generation
  14. Joplin实现样式更改
  15. redis 模糊删除keys
  16. 如何下载在线课程网站的视频
  17. 【Ansible】 Ansible 模块 setup 与 stat 模块用法
  18. ECCV 2022放榜了!1629篇论文中选,录用率不到20%...
  19. 给SwipeRefreshLayout添加上拉加载更多功能
  20. Ubuntu离线安装无线网卡驱动

热门文章

  1. excel冻结行和列_excel如何冻结首行、首列、指定的行和列,这样看数据就方便多了...
  2. python中delay__python delay函数
  3. MySQL 导入数据 时间数据 不准确 解决办法
  4. html单位pt,CSS单位之pt和px的区别是什么
  5. 手写汉字识别数据集的预处理
  6. 一个Scrapy爬虫实例
  7. w10的计算机服务在哪,w10电脑服务界面在哪里
  8. 论文阅读17 | Cross-modality Person re-identification with Shared-Specific Feature Transfer
  9. 彻底搞懂CSS层叠上下文、层叠等级、层叠顺序、z-index
  10. 计算机课做名片怎么做,小学信息技术名片DIY教案设计