RTOS Programming--Transplant uC/OS

Table of contents

1. Experimental principle

1.HAL library establishment

1) New construction

2) Set up the serial port

3) Internal clock

4) Project settings

2. Port uC/OS

1) Prepare uC/OS-lll source code

2) Start porting

3) Import path

4) Write the corresponding program

5) Source code

6) Modify part of the code

3. Parameter configuration

4. Compile and run

5. Burn and run

2. Summary

1. Experimental principle

1.HAL library establishment

1) New construction

STM32F103T8C6 chip, configuration parameters

RCC

SYS

set output pin

2) Set up the serial port

3) Internal clock

 

4) Project settings

 

2. Port uC/OS

1) Prepare uC/OS-lll source code

Download from the official website: http://micrium.com/downloadcenter/

Baidu network disk link: https://pan.baidu.com/s/1ji_DDVra2FApNYmOJ8iRFA

Extraction code: 8888

Open the downloaded file, find the uC-BSP file, open it and check if there are bsp.c and bsp.h files (if not, add them yourself)

2) Start porting

Copy the following files to the MDK-ARM folder of the HAL library project just generated

 

(1) Add corresponding items

Click on Manage Project Items

Create the following folders for the project

Note: Be sure to remember to click OK.

Add files for new folders

 

 

Double-click the LIB folder (or right-click the LIB folder, click Add Existing...) select the following files and click Add

 

Double-click the PORT folder (or right-click the PORT folder, click Add Existing...) select the following files and click Add

 

Double-click the SOURCE folder (or right-click the SOURCE folder, click Add Existing...) select the following files and click Add

Double-click the CONFIG folder (or right-click the CONFIG folder, click Add Existing...) select the following files and click Add

 

 

Double-click the BSP folder (or right-click the BSP folder, click Add Existing...) select the following files and click Add

 

Double-click the CPU folder (or right-click the CPU folder, click Add Existing...) select the following files and click Add

 

3) Import path

 

 

 

4) Write the corresponding program

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;
    #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

5) Source code

main.c

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* task priority */
#define START_TASK_PRIO     3
#define LED0_TASK_PRIO      4
#define MSG_TASK_PRIO       5
#define LED1_TASK_PRIO      6
​
/* task stack size   */
#define START_STK_SIZE      96
#define LED0_STK_SIZE       64
#define MSG_STK_SIZE        64
#define LED1_STK_SIZE       64
​
/* task stack */   
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];
​
/* mission control block */
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 */
​
/* Task function definition */
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(); This is also initialized in the initialization of BSP
  MX_USART1_UART_Init();    
    /* Create a task */
    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);
    /* Start the multitasking system and hand over control to 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 > 0u
   OSStatTaskCPUUsageInit(&err);        //Statistical Tasks .
#endif
    
#ifdef CPU_CFG_INT_DIS_MEAS_EN //If measurement interrupt off time is enabled
    CPU_IntDisMeasMaxCurReset();    
#endif
​
#if OS_CFG_SCHED_ROUND_ROBIN_EN //When using time slice rotation
     //Enable the time slice round robin scheduling function, the length of the time slice is 1 system clock tick, that is, 1*5=5ms
    OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);  
#endif      
    
    OS_CRITICAL_ENTER();    //enter the critical section
    /* Create LED0 task */
    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);       
​
/* Create LED1 task */
    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);                                        
                 
    /* Create MSG 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*)&StartTaskTCB,&err);        //Suspend start task             
    OS_CRITICAL_EXIT(); //enter the critical section
}
/**
  * Function: Start the task function body.
  * Input parameters: p_arg is the formal parameter passed when the task was created
  * Return value: None
  * Description: none
  */
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 > 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(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 > 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(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 > 0u
  OSStatTaskCPUUsageInit(&err);                               /* Compute CPU capacity with no task running            */
#endif
​
  CPU_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 */
/**
  * Function: Create application tasks
  * Input parameters: p_arg is the formal parameter passed when the task was created
  * Return value: None
  * Description: none
  */
static  void  AppTaskCreate (void)
{
  
}
​
​
/**
  * 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 */

6) Modify part of the code

Open startup...

Change PendSV_Handler and SysTick_Handler to OS_CPU_PendSVHandler and OS_CPU_SysTickHandler at

 

OS_CPU_PendSVHandler
OS_CPU_SysTickHandler

Open the CONFIG file, find the app_cfg.h file and open it, change the following code

 

 

Find includes.h to open

 

Find lib_cfg.h to open

 

Change to 5u * 1024u

Find the Application/User/Core file and open the usart.c file

"stdio.h" needs to be introduced here, because FILE needs to be used below

 

 

Find gpio.c to modify (initialize 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);
​
}
​

3. Parameter configuration

 

 

4. Compile and run

5. Burn and run

2. Summary

This learning process is rather cumbersome, and you need to be very careful to avoid errors that lead to compilation failures. Start all over again, and the overall is relatively smooth.

Tags: stm32 Embedded system Single-Chip Microcomputer

Posted by interpim on Fri, 04 Nov 2022 18:08:30 +0530