其他分享
首页 > 其他分享> > uc/OS系统移植

uc/OS系统移植

作者:互联网

目录

一、使用CubeMX建立STM32F103C8T6HAL库

a、配置RCC

图片1

b、配置SYS

图片2

c、设置PC13为GPIO_Output用于电亮LED灯

图片3

d、设置串口USART1

图片4

e、设置工程

图片5

图片6

f、生成工程并打开

g、在main函数中的while循环里添加语句

图片7

while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
HAL_Delay(500);

}
/* USER CODE END 3 */

二、准备uCOSIII源码

进入官网下载:http://micrium.com/downloadcenter/

三、移植前准备

1、给文件夹uC-CONFIG添加以下文件(从以下路径复制过来)

图片8

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

图片9

图片10

四、开始移植

1.将uCOS文件添加到项目

图片11

2、 点击CPU–>Add Files…,选中以下文件,Add

图片12

图片13

图片14

图片15

图片16

图片17

图片18

图片19

图片20

图片21

3、导入文件路径

图片22

4、为bsp.c和bsp.h添加代码

// bsp.h
#ifndef __BSP_H__
#define __BSP_H__

#include "stm32f1xx_hal.h"

void BSP_Init(void);

#endif

// 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、修改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 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 */
/**

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

/**

}

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); //统计任务

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(); //进入临界区
/* 创建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(); //进入临界区

}
/**

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

}

/**

}

/* USER CODE END 4 */

/**

/* USER CODE END Error_Handler_Debug */
}

#ifdef USE_FULL_ASSERT
/**

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

5、修改其余代码

图片23

图片24

图片25

图片26

图片27

图片28

图片29

图片30

6、参数配置

图片31

图片32

图片33

五、运行实现

六、实现三个任务

1、3个任务
a、1s周期对LED等进行点亮-熄灭的控制

b、3s周期对LED等进行点亮-熄灭的控制

c、以2s周期通过串口发送“hello uc/OS! 欢迎来到RTOS多任务环境!“
2、代码修改

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

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

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

/**

}

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); //统计任务

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(); //进入临界区 /* 创建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);
``

​ ``
OS_CRITICAL_EXIT(); //进入临界区

}
/**

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

}

/**

}

/* USER CODE END 4 */

/**

/* USER CODE END Error_Handler_Debug */
}

#ifdef USE_FULL_ASSERT
/**

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

3、代码实现

七、总结

​ 本次实验内容较多,网上的教程还是非常全面,在整个实验实现过程中还是较少遇到问题,但是在实验过程中一定得注意要认真仔细,无论是添加问价修改代码还是硬件连接,不然就会出现代码无法运行或者无法正常烧录。

参考博客: (19条消息) STM32F103C8T6移植uCOS基于HAL库_机智的橙子的博客-CSDN博客

标签:CODE,void,STK,uc,OS,CPU,移植,RCC
来源: https://www.cnblogs.com/hahahahahao/p/15652219.html