STM32F103C8T6 porting uC/OS-III based on HAL Library

1, Get uC/OS-III source code

Link: https://pan.baidu.com/s/1Btj7foEXdXjjJWoZQsN-OQ
Extraction code: mleh

2, Building stm32 hal database project

Configure PA5 and PA6 as GPIO_Output, and configure serial port 1,
The LED phenomenon can be used as the basis for our successful transplantation.

3, Copy the uC/OS-III file to the project folder

1. In the generated keil project folder f103c8_ UCOSIII_ 1_ Create a new folder of UCOSIII in test, and copy the three folders in the downloaded source code: UC CPU, UC lib and UCOS III to our new folder:


2. Create an OS folder under Src folder

3. Open the source code just downloaded, and the file under the path: \ 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_ Copy app.h to the OS folder created in the previous step, and create three blank files: bsp.c, bsp.h and app.h

4, Add project component and header file path

4.1 adding project groups

Open f103c8_uCOSIII_1_test project, add six new groups as shown in the figure: bsp and uCOSIII_CPU, uCOSIII_LIB, uCOSIII_Ports, uCOSIII_Source, OS_cfg

4.2 adding files to groups

The file directory is Src/OS. Add the bsp.c and bsp.h files to the bsp group, and add app.c to the Application/User group

uCOSIII_CPU component, click the Add Files... Button, jump the file directory to: ucosiiii / UC CPU, select ALL files file type, click Add to add three files, and then open: ARM-Cortex-M3\RealView. Similarly, select ALL files file type to add three files to uCOSIII_CPU group



Add uCOSIII_LIB component file: select uCOSIII_LIB group, click the Add Files... Button, jump the file directory to: UCOSIII/uCLIB, select the ALL files file type, and add nine files into uCOSIII_LIB group; Then continue to open Ports/ARM-Cortex-M3/Realview and add lib_mem_a.asm file

Select ucosiii_ In the ports group, click the Add Files... Button to adjust the file directory to: ucosiiii / ucosiii / ports / ram-cortex-m3 / generic / RealView. Select the ALL files file type and add three of them to uCOSIII_Ports group

Select uCOSIII_Sourc group, click the Add Files... Button to adjust the file directory to: UCOSIII/UcosIII/Source. Select the ALL files file type and add twenty of them to uCOSIII_Sourc group.


Select OS_cfg group, click the Add Files... Button to adjust the file directory to: Src/OS. Select the all files file type and add the eight files in the figure to uCOSIII_Sourc formation

4.3 add header file path


5, Modify file content

1. Startup documents
Replace with the following:


2. app_cfg.h

First Amendment:
Before modification:

#define APP_CFG_SERIAL_EN DEF_ENABLED

After modification

#define APP_CFG_SERIAL_EN DEF_DISABLED

Second amendment:
Before modification

#define APP_TRACE BSP_Ser_Printf

After modification

#define APP_TRACE (void)

3. includes.h
The first modification: add the relevant header file

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

The second modification: add HAL Library
Before modification:

#include <stm32f10x_lib.h>

After modification:

#include "stm32f1xx_hal.h"

4. bsp.c and bsp.h
Directly copy the following code:

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

We need to reduce the heap space here. I changed it to 5K

#define  LIB_MEM_CFG_HEAP_SIZE          5u * 1024u

7. Configuration

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

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

/* Task stack size	*/

#define Led1_STK_SIZE 		64
#define Led2_STK_SIZE 		64
#define MSG_STK_SIZE  		 64 / / if the task heap size is too large, an error will be reported. You can try to make it smaller

//Task control block
static  OS_TCB   AppTaskStartTCB;
static  OS_TCB Led1TaskTCB;
static  OS_TCB Led2TaskTCB;
static  OS_TCB MsgTaskTCB;
//task stack 
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];
/* Private function prototype--------------------------------------------------------------*/
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 */
                                                                                 
	/* Create task */
	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);
	
	/* Start the multitasking system and give control to uC/OS-III */
	OSStart(&err);            /* Start multitasking (i.e. give control to uC/OS-III). */
               
}


/**
  * Function function: start the task function body.
  * Input parameter: p_arg is the formal parameter passed when the task was created
  * Return value: None
  * Description: None
  */
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);  		//Statistical tasks                
#endif
	
#ifdef CPU_CFG_INT_DIS_MEAS_EN 			// If enabled, measure the interrupt off time
    CPU_IntDisMeasMaxCurReset();	
#endif

#if 	 OS_CFG_SCHED_ROUND_ROBIN_EN   		// When using time slice rotation
	 //Enable the time slice rotation scheduling function. The time slice length is 1 system clock beat, i.e. 1*5=5ms
	OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);  
#endif		
	
	OS_CRITICAL_ENTER();	//Enter critical zone
	/* Create LED1 task */
	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);	
	/* Create LED2 task */
	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);	
	/* Create Send task */
	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);		//Suspend start task			 
	OS_CRITICAL_EXIT();	//Enter critical zone

}
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! Welcome to RTOS Multitasking environment\r\n");
	  //Delay 2 seconds
		OSTimeDlyHMSM(0, 0, 2, 0,
                  OS_OPT_TIME_HMSM_STRICT,
                  &err);
  }

}


/* USER CODE BEGIN 4 */
/**
  * Function function: create application task
  * Input parameter: p_arg is the formal parameter passed when the task was created
  * Return value: None
  * Description: None
  */
static  void  AppTaskCreate (void)
{
  
}


/**
  * Function function: uCOSIII kernel object creation
  * Input parameters: None
  * Return value: None
  * Description: None
  */
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****/

6, Achieve three tasks

Two tasks control the LED on-off in 1s and 3s cycles respectively; Another task sends "hello uc/OS! Welcome to RTOS multitasking environment!" through the serial port in a 2s cycle (the above code has been implemented)

Create three tasks:

/* Create LED1 task */
	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);	
	/* Create LED2 task */
	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);	
	/* Create Send task */
	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);

Function implementation:

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! Welcome to RTOS Multitasking environment\r\n");
	  //Delay 2 seconds
		OSTimeDlyHMSM(0, 0, 2, 0,
                  OS_OPT_TIME_HMSM_STRICT,
                  &err);
  }

}

Effect achieved:

7, Reference link

STM32F103C8T6 porting uC/OS-III based on HAL Library

Tags: Single-Chip Microcomputer stm32

Posted on Thu, 02 Dec 2021 16:44:54 -0500 by pplexr