其他分享
首页 > 其他分享> > STM32F103C8T6移植uC/OS-III基于HAL库

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

作者:互联网

文章目录

一、获取uC/OS-III源码

链接:https://pan.baidu.com/s/1Btj7foEXdXjjJWoZQsN-OQ
提取码:mleh
在这里插入图片描述

二、建立stm32 hal库工程

配置PA5和PA6为GPIO_Output,和配置串口1,
可根据LED现象作为我们是否移植成功的依据。
在这里插入图片描述
在这里插入图片描述

三、复制uC/OS-III文件到工程文件夹

1.在生成的keil工程文件夹f103c8_uCOSIII_1_test中新建一个 UCOSIII 的文件夹,将我们下载的源代码中三个文件夹: Uc-CPU、 uC-LIB、 Ucos-III 复制到我们新建的文件夹中:

在这里插入图片描述
2.在Src文件夹下新建一个OS文件夹
在这里插入图片描述
3.将刚才下载源码打开,将路径:\EvalBoards\Micrium\uC-Eval-STM32F107\uCOS-III 下的文件:
app.c 、 app_cfg.h 、 cpu_cfg.h 、 includes.h 、 lib_cfg.h 、 os_app_hooks.c 、os_app_hook.h、os_cfg.h、os_cfg_app.h复制到上一步建立的OS文件夹中,同时新建三个空白文件: bsp.c、bsp.h、app.h
在这里插入图片描述

四、添加工程组件和头文件路径

4.1 添加工程分组

打开f103c8_uCOSIII_1_test工程, 按照如图所示添加六个新的组: bsp、uCOSIII_CPU、 uCOSIII_LIB、 uCOSIII_Ports、 uCOSIII_Source、 OS_cfg

在这里插入图片描述

4.2 添加文件到分组

文件目录是: Src/OS,将其中 bsp.c 和 bsp.h文件添加至 bsp 组中,将 app.c 添加进 Application/User 组中
在这里插入图片描述
uCOSIII_CPU 组件, 点击 Add Files…按钮,将文件目录跳转至: UCOSIII/uC-CPU, 选择 ALL files 文件类型,将其中的三个文件点击 Add 添加, 然后再打开: ARM-Cortex-M3\RealView, 同样选择 ALL files 文件类型,将三个文件添加进 uCOSIII_CPU 组
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
添加 uCOSIII_LIB 组件文件:选择 uCOSIII_LIB 组,点击 Add Files…按钮, 将文件目录跳转至: UCOSIII/uCLIB,选择 ALL files 文件类型,将其中的九个文件添加进 uCOSIII_LIB 组;然后继续打开: Ports/ARM-Cortex-M3/Realview, 添加 lib_mem_a.asm 文件
在这里插入图片描述
选择 uCOSIII_Ports 组,点击 Add Files…按钮, 将文件目录调整至: UCOSIII/UcosIII/Ports/RAM-Cortex-M3/Generic/RealView。选择 ALL files 文件类型, 将其中三个文件添加进 uCOSIII_Ports 组
在这里插入图片描述
选择uCOSIII_Sourc组,点击Add Files…按钮, 将文件目录调整至: UCOSIII/UcosIII/Source。选择 ALL files 文件类型, 将其中二十个文件添加进 uCOSIII_Sourc 组。

在这里插入图片描述
选择 OS_cfg 组,点击 Add Files…按钮, 将文件目录调整至: Src/OS。选择 ALLfiles 文件类型, 将图中的八个文件添加进 uCOSIII_Sourc 组

在这里插入图片描述

4.3添加头文件路径

在这里插入图片描述
在这里插入图片描述

五、修改文件内容

1 .启动文件
改为下面:
在这里插入图片描述
在这里插入图片描述
2. app_cfg.h

第一处修改:
修改前:

#define APP_CFG_SERIAL_EN DEF_ENABLED

修改后

#define APP_CFG_SERIAL_EN DEF_DISABLED

第二处修改:
修改前

#define APP_TRACE BSP_Ser_Printf

修改后

#define APP_TRACE (void)

3. includes.h
第一处修改: 添加相关头文件

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

第二处修改: 添加HAL 库
修改前:

#include <stm32f10x_lib.h>

修改后:

#include "stm32f1xx_hal.h"

4. bsp.c和bsp.h
直接复制下面的代码:

// 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;
	#else
		cnts = cpu_clk_freq/(CPU_INT32U)OS_TICKS_PER_SEC;
	#endif
	OS_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
#ifndef  __BSP_H__
#define  __BSP_H__

#include "stm32f1xx_hal.h"

void BSP_Init(void);

#endif

5. app.c和app.h

// app.c
#include <includes.h>
// app.h
#ifndef  __APP_H__
#define  __APP_H__

#include <includes.h>

#endif /* __APP_H__ */

6. lib_cfg.h

这里需要将堆空间改小一点,我改成了5K

#define  LIB_MEM_CFG_HEAP_SIZE          5u * 1024u

7.配置
在这里插入图片描述

8. main.c

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"
#include "usart.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 */
/* 任务优先级 */

#define Led1_TASK_PRIO  3
#define Led2_TASK_PRIO  4
#define MSG_TASK_PRIO		5

/* 任务堆栈大小	*/

#define Led1_STK_SIZE 		64
#define Led2_STK_SIZE 		64
#define MSG_STK_SIZE 		64//任务堆大小过大会报错,可以试着改小一点

//任务控制块
static  OS_TCB   AppTaskStartTCB;
static  OS_TCB Led1TaskTCB;
static  OS_TCB Led2TaskTCB;
static  OS_TCB MsgTaskTCB;
//任务堆栈
static  CPU_STK  AppTaskStartStk[APP_TASK_START_STK_SIZE];
static  CPU_STK Led1_TASK_STK[Led1_STK_SIZE];
static  CPU_STK Led2_TASK_STK[Led2_STK_SIZE];
static  CPU_STK MSG_TASK_STK[MSG_STK_SIZE];
/* 私有函数原形 --------------------------------------------------------------*/
static  void  AppTaskCreate(void);
static  void  AppObjCreate(void);
static  void  AppTaskStart(void *p_arg);
static  void  Led1(void *p_arg);
static  void  Led2(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 */
 MX_USART1_UART_Init();
  /* 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;
	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 > 0u
   OSStatTaskCPUUsageInit(&err);  		//统计任务                
#endif
	
#ifdef CPU_CFG_INT_DIS_MEAS_EN			//如果使能了测量中断关闭时间
    CPU_IntDisMeasMaxCurReset();	
#endif

#if	OS_CFG_SCHED_ROUND_ROBIN_EN  		//当使用时间片轮转的时候
	 //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms
	OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);  
#endif		
	
	OS_CRITICAL_ENTER();	//进入临界区
	/* 创建LED1任务 */
	OSTaskCreate((OS_TCB 	* )&Led1TaskTCB,		
				 (CPU_CHAR	* )"Led1_A5", 		
                 (OS_TASK_PTR )Led1, 			
                 (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);	
	/* 创建LED2任务 */
	OSTaskCreate((OS_TCB 	* )&Led2TaskTCB,		
				 (CPU_CHAR	* )"Led2_A6", 		
                 (OS_TASK_PTR )Led2, 			
                 (void		* )0,					
                 (OS_PRIO	  )Led2_TASK_PRIO,     	
                 (CPU_STK   * )&Led2_TASK_STK[0],	
                 (CPU_STK_SIZE)Led2_STK_SIZE/10,	
                 (CPU_STK_SIZE)Led2_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);	
	/* 创建Send任务 */
	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*)&AppTaskStart,&err);		//挂起开始任务			 
	OS_CRITICAL_EXIT();	//进入临界区

}
static  void  Led1 (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 > 0u
  OSStatTaskCPUUsageInit(&err);                               /* Compute CPU capacity with no task running            */
#endif

  CPU_IntDisMeasMaxCurReset();

  AppTaskCreate();                                            /* Create Application Tasks                             */

  AppObjCreate();                                             /* Create Application Objects                           */

  while (DEF_TRUE)
  {
		HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin, GPIO_PIN_RESET);
		OSTimeDlyHMSM(0, 0, 2, 0,
                  OS_OPT_TIME_HMSM_STRICT,
                  &err);
		HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin, GPIO_PIN_SET);
		OSTimeDlyHMSM(0, 0, 2, 0,
                  OS_OPT_TIME_HMSM_STRICT,
                  &err);
  }
  /* USER CODE END 3 */
}
static  void  Led2 (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 > 0u
  OSStatTaskCPUUsageInit(&err);                               /* Compute CPU capacity with no task running            */
#endif

  CPU_IntDisMeasMaxCurReset();

  AppTaskCreate();                                            /* Create Application Tasks                             */

  AppObjCreate();                                             /* Create Application Objects                           */

  while (DEF_TRUE)
  {
		HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_RESET);
		OSTimeDlyHMSM(0, 0, 3, 0,
                  OS_OPT_TIME_HMSM_STRICT,
                  &err);
		HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_SET);
		OSTimeDlyHMSM(0, 0, 3, 0,
                  OS_OPT_TIME_HMSM_STRICT,
                  &err);
  }
  /* 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 > 0u
  OSStatTaskCPUUsageInit(&err);                               /* Compute CPU capacity with no task running            */
#endif

  CPU_IntDisMeasMaxCurReset();


  while (DEF_TRUE)
  {
		printf("hello uc/OS! 欢迎来到RTOS多任务环境\r\n");
	  //延时2秒
		OSTimeDlyHMSM(0, 0, 2, 0,
                  OS_OPT_TIME_HMSM_STRICT,
                  &err);
  }

}


/* 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****/

六、实现三个任务

其中两个task分别以1s和3s周期对LED等进行点亮-熄灭的控制;另外一个task以2s周期通过串口发送“hello uc/OS! 欢迎来到RTOS多任务环境!”(上述代码已经实现)

创建三个任务:

/* 创建LED1任务 */
	OSTaskCreate((OS_TCB 	* )&Led1TaskTCB,		
				 (CPU_CHAR	* )"Led1_A5", 		
                 (OS_TASK_PTR )Led1, 			
                 (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);	
	/* 创建LED2任务 */
	OSTaskCreate((OS_TCB 	* )&Led2TaskTCB,		
				 (CPU_CHAR	* )"Led2_A6", 		
                 (OS_TASK_PTR )Led2, 			
                 (void		* )0,					
                 (OS_PRIO	  )Led2_TASK_PRIO,     	
                 (CPU_STK   * )&Led2_TASK_STK[0],	
                 (CPU_STK_SIZE)Led2_STK_SIZE/10,	
                 (CPU_STK_SIZE)Led2_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);	
	/* 创建Send任务 */
	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);

函数功能实现:

static  void  Led1 (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 > 0u
  OSStatTaskCPUUsageInit(&err);                               /* Compute CPU capacity with no task running            */
#endif

  CPU_IntDisMeasMaxCurReset();

  AppTaskCreate();                                            /* Create Application Tasks                             */

  AppObjCreate();                                             /* Create Application Objects                           */

  while (DEF_TRUE)
  {
		HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin, GPIO_PIN_RESET);
		OSTimeDlyHMSM(0, 0, 2, 0,
                  OS_OPT_TIME_HMSM_STRICT,
                  &err);
		HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin, GPIO_PIN_SET);
		OSTimeDlyHMSM(0, 0, 2, 0,
                  OS_OPT_TIME_HMSM_STRICT,
                  &err);
  }
  /* USER CODE END 3 */
}
static  void  Led2 (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 > 0u
  OSStatTaskCPUUsageInit(&err);                               /* Compute CPU capacity with no task running            */
#endif

  CPU_IntDisMeasMaxCurReset();

  AppTaskCreate();                                            /* Create Application Tasks                             */

  AppObjCreate();                                             /* Create Application Objects                           */

  while (DEF_TRUE)
  {
		HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_RESET);
		OSTimeDlyHMSM(0, 0, 3, 0,
                  OS_OPT_TIME_HMSM_STRICT,
                  &err);
		HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_SET);
		OSTimeDlyHMSM(0, 0, 3, 0,
                  OS_OPT_TIME_HMSM_STRICT,
                  &err);
  }
  /* 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 > 0u
  OSStatTaskCPUUsageInit(&err);                               /* Compute CPU capacity with no task running            */
#endif

  CPU_IntDisMeasMaxCurReset();


  while (DEF_TRUE)
  {
		printf("hello uc/OS! 欢迎来到RTOS多任务环境\r\n");
	  //延时2秒
		OSTimeDlyHMSM(0, 0, 2, 0,
                  OS_OPT_TIME_HMSM_STRICT,
                  &err);
  }

}

实现效果:
在这里插入图片描述
在这里插入图片描述

七、参考链接

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

标签:TASK,HAL,err,void,STK,STM32F103C8T6,OS,CPU
来源: https://blog.csdn.net/qq_55691662/article/details/121674249