坚持就是胜利

  • 一、UCOS简介
    • 01 简介
    • 02 uC/OS-III的任务
    • 03 其他介绍
  • 二、操作过程
    • 01 题目要求
    • 02 配置CubeMX
    • 03 下载代码
    • 04 移植代码
    • 05 效果展示
  • 三、实现三个任务代码
  • 四、三个任务效果展示
  • 五、总结
  • 源代码
  • 参考资料

一、UCOS简介

01 简介

  • uC/OS-III(Micro C OS Three 微型的C 语言编写的操作系统第3版)是一个可升级的,可固化的,基于优先级的实时内核。它对任务的个数无限制。uC/OS-III 是一个第3 代的系统内核,支持现代的实时内核所期待的大部分功能。例如资源管理,同步,任务间的通信等等。然而,uC/OS-III 提供的特色功能在其它的实时内核中是找不到的,比如说完备的运行时间测量性能,直接地发送信号或者消息到任务,任务可以同时等待多个内核对象等。
  • uC/OS-III 是一个可扩展的,可固化的,抢占式的实时内核,它管理的任务个数不受限制。它是第三代内核,提供了现代实时内核所期望的所有功能包括资源管理、同步、内部任务交流等。uC/OS-III 也提供了很多特性是在其他实时内核中所没有的。比如能在运行时测量运行性能,直接得发送信号或消息给任务,任务能同时等待多个信号量和消息队列。

02 uC/OS-III的任务

任务状态 描述
休眠态 休眠态就是任务只是以任务函数的方式存在,只是存储区中的一段代码,并未用OSTaskCreak()函数创建这个任务,不受UCOS-III管理
就绪态 任务在就绪表中已经登记,等待CPU使用权。
运行态 正在运行的任务就处于运行态
等待态 正在运行的任务需要等待某一个事件,比如信号量、消息、事件标志组等,就会暂时让出CPU使用权,进入等待事件状态。
中断服务态 一个正在执行的任务被中断打断,CPU转而执行中断服务程序,这时这个任务就会被挂起,进入中断服务态。

03 其他介绍

  1. 微雪电子
  2. uCOS-III 学习记录(3)——空闲任务和阻塞延时

笔者第一次接触这个东西,感觉好复杂。看到有些介绍讲需要读源码文件学习,真是令人头大,继续加油吧!!

二、操作过程

01 题目要求

学习嵌入式实时操作系统(RTOS),以uc/OS为例,将其移植到stm32F103上,构建至少3个任务(task):其中两个task分别以1s和3s周期对LED等进行点亮-熄灭的控制;另外一个task以2s周期通过串口发送“hello uc/OS! 欢迎来到RTOS多任务环境!”。记录详细的移植过程

02 配置CubeMX

  1. 配置RCC

  2. 配置SYS

  3. 使能串口USART1,保持默认配置

  4. 配置一个输出引脚

03 下载代码

进入官网下载:http://micrium.com/downloadcenter/(2022/11/1官网报错)
附录百度网盘链接:
链接:https://pan.baidu.com/s/10RqsDRecbmVteWmDv2oUNQ
提取码:1234

文件代码结构展示:

04 移植代码

  1. 将uCOS相关文件复制到HAL工程的MDK-ARM文件夹下

  2. 点击Manage Project Items,为项目新建文件夹如下

  3. 在每一个文件夹点击Add File…添加以下文件点击OK,看到目录结构更新。

  4. 导入文件路径

  5. 添加代码如下:

bsp.h

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

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
  1. 修改主函数如下:
/* 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);
#endifOS_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 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****/
  1. 修改start_stm32f103xb.s。将下图位置改为OS_CPU_PendSVHandlerOS_CPU_SysTickHandler

笔者第一次粗心大意,只修改了图二中间的两个,一直有报错。甚至baidu不到,很是尴尬。所以大家一定要细心,教程操作相差不大,静下心一定可以做出来。加油
把自己的报错贴出来给大家引以为鉴

  1. 修改CONFIG文件下的app_cfg.h
  2. 修改CONFIG文件下的include.h
  3. 修改CONFIG文件下的lib_cfg.h,修改为5(该处宏定义设置堆空间的大小,STM32F103C8T6的RAM只有20K,所以要改小一点 )
  4. 参数配置

05 效果展示


可以观察到PC13在闪烁,串口的发送指示灯也在闪烁。

三、实现三个任务代码

3个任务(task):
其中两个task分别以1s和3s周期对LED等进行点亮-熄灭的控制;
另外一个task以2s周期通过串口发送“hello uc/OS! 欢迎来到RTOS多任务环境!”。
gpio.c中修改代码(添加初始化PA3)

void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_GPIOD_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);/*Configure GPIO pin : PC13|PA3 */GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_3;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);}

修改主函数main.c

/* 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 LED1_TASK_PRIO      6/* 任务堆栈大小   */
#define START_STK_SIZE      96
#define LED0_STK_SIZE       64
#define MSG_STK_SIZE        64
#define LED1_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];
CPU_STK LED1_TASK_STK[LED1_STK_SIZE];/* 任务控制块 */
OS_TCB StartTaskTCB;
OS_TCB Led0TaskTCB;
OS_TCB MsgTaskTCB;
OS_TCB Led1TaskTCB;/* 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);
static  void  led_pa3(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);
#endifOS_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     * )&Led1TaskTCB,      (CPU_CHAR    * )"led_pa3",       (OS_TASK_PTR )led_pa3,             (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);                                       /* 创建MSG任务 */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, 1, 0,OS_OPT_TIME_HMSM_STRICT,&err);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);OSTimeDlyHMSM(0, 0, 1, 0,OS_OPT_TIME_HMSM_STRICT,&err);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}static  void  led_pa3 (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(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);OSTimeDlyHMSM(0, 0, 3, 0,OS_OPT_TIME_HMSM_STRICT,&err);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);OSTimeDlyHMSM(0, 0, 3, 0,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 \r\n");OSTimeDlyHMSM(0, 0, 2, 0,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****/

四、三个任务效果展示

stm32移植操作系统UCOSIII

五、总结

操作还算顺利,只是在其中遇到一点小错误,也在同学的帮助下解决掉了,笔者希望看到这篇文章的各位继续加油,有错误可以向笔者提出,或者看其他的博客文章。保持细心认真,你一定可以的。在烧录时可以发现移植代码后使用USB-TTL烧录有点耗时,而ST-Link还是速度极快的。学习嵌入式课程接近尾声,但是我们的在这门课学到的方法,以后也会一直用下去,反复操作HAL库,对其的熟练度也在不知不觉中增加,多练有益,坚持就是胜利。

源代码

Gitee仓库:UCOS-III源代码

参考资料

  1. STM32F103C8T6移植uCOS基于HAL库
  2. 什么是uC/OS

STM32移植uC/OSIII相关推荐

  1. 基于stm32移植uC/OS-III以及使用Keil仿真和逻辑分析仪抓取波形

    文章目录 一. 认识uC/OS-III 二. 将uCOSIII源码移植到STM32F103C8T6 1. 使用CubeMX建立STM32F103C8T6HAL库 2. 准备工作 (1)获取uC/OS- ...

  2. 基于stm32f103c8t6移植uc/OS-III系统

    文章目录 一.内容 二.uc/OS-III源码准备 三.使用 stm32CubeMX 建立工程 1)新建工程 2)工程配置 3)导出工程 四.项目准备 1)移植准备 2)文件移植 3)代码完善 4)参 ...

  3. 移植 uC/OS-III 到 STM32

    首先,打开 Micrium 公司官方网站(http://micrium.com/),点击"Downloads"选项卡进入下载页面,在"Brouse by MCU Manu ...

  4. STM32F103C8T6移植uC/OS-III基于HAL库超完整详细过程

    目录 一.题目要求 二.UCOSII简介 三.实验过程 1. CubeMX工程创建 2. UC/OS开源码获取 3. "移植"前期准备工作 4.移植过程 5. 构建工程任务 3. ...

  5. STM32F103C8T6移植uC/OS-III基于HAL库

    目录 一.ucos是什么 二.获取uC/OS-III源码 三.使用CubeMX建立HAL库 四.移植准备 五.移植 1.添加文件到项目 2.更改代码 3.参数配置 六.烧录 七.实验结果 八.实现三个 ...

  6. uC/OS-III系统移植STM32F103C8

    本实验是将嵌入式实时操作系统移植入STM32系列开发板,并完成一些基础的指令任务.此次实验采用的芯片为STM32F103C8 目录 一.使用STM32CUBEMX建立STM HEL 库工程 二.准备u ...

  7. 基于STM32的uc/OS系统移植及用Saleae Logic 16抓取分析波形

    文章目录 一.关于uc/OS系统 1.操作系统与裸机的区别 2.uc/OS运行流程 二.详细移植过程 1.STM32Cubex创建工程 2.为工程添加源码 3.添加头文件路径 4.添加代码 1)bsp ...

  8. uC/OS-III 的特点

    1.其中最有用的功能应该是时间片轮转法( roundrobin), 这个是 uC/OS-II 中不支持的,但是现在已经是 uC/OS-III 的一个功能了 2.uC/OS-III 被设计用于 32 位 ...

  9. uc/OS-III移植到stm32f103c8进行多任务实验

    文章目录 一.UCOSIII介绍 1.简介 2.UCOSIII中的任务 二.将uc/OS-III移植到stm32f103c8 1.创建CubeMx工程 2.进行uCOS-III的移植 三.构建三个任务 ...

最新文章

  1. thinkphp模板中使用方法
  2. Yolov5身份证检测——C++ OpenCV DNN推理
  3. 2018-03-26
  4. 【C++设计技巧】C++中的RAII机制
  5. 企业级项目实战讲解!javamap排序规则
  6. web2py的“hello world”
  7. 《C和指针》——C语言字符串操作
  8. [设计模式-行为型]状态模式(State)
  9. WPF: 共享Grid宽度或高度的方法
  10. 命题逻辑——自由之门与死亡之门
  11. java进销存管理系统设计_基于JAVA的企业进销存管理系统的设计与实现
  12. 【2018.12.28】百度网盘永久保存2T容量办法
  13. 苹果安卓鸿蒙对比,鸿蒙OS对比iOS,华为再次“超越”,流畅度大幅领先苹果!...
  14. margin与padding的区别
  15. 面试:JavaScript基础概念
  16. 震惊世界的25张照片
  17. 〖Python 数据库开发实战 - MySQL篇⑨〗- 什么是 SQL 语言、如何创建数据逻辑库及如何创建数据表
  18. linux内核态real cred,Linux内核源码分析 -- 更新当前进程的 cred -- commit_creds
  19. {经典演讲}庞加莱关于数学发现的心理学的演讲
  20. 传统隐私权及网络隐私权的界定

热门文章

  1. Java基础回归之注解Annotation【低仿ButterKnife实战篇】
  2. 产业区块链一周动态丨深圳龙华区与腾讯共建产业区块链联盟,新四板试水区块链...
  3. Detecting Insults in Social Commentary 数据分析报告(python)
  4. 只因小黑子的HTML入土过程第四章
  5. C语言学习—给学习C语言初学者的建议
  6. 【综合应用】基础PLS-SEM模型STATA实战
  7. 德国罗氏Roehrs BT40-3010090、HSK A63-3009555
  8. Android项目实战(十六):QQ空间实现(一)—— 展示说说中的评论内容并有相应点击事件...
  9. c语言贴粘,挖坟贴,多年前发的一个如何学习C语言的帖子
  10. 万能引用,引用折叠,右值变左值的情况