一:要求
学习嵌入式实时操作系统(RTOS),以uc/OS为例,将其移植到stm32F103上,构建至少3个任务(task):其中两个task分别以1s和3s周期对LED灯进行点亮-熄灭的控制;另外一个task以2s周期通过串口发送“hello uc/OS! 欢迎来到RTOS多任务环境!”。记录详细的移植过程。
二.获取uCOS-III源码
点击以下连接可以下载https://github.com/weiji217/no9/blob/main/Software.zip
三.任务
1、移植文件
将下载好的文件复制粘贴到工程的MDK-ARM里面
如图所示
随后打开keil工程,点击上面的“品”
先创建如图几个文件,随后点击右下角的Add Files
①.cpu添加
添加的文件就是刚刚我们下载进来的,点击uC-CPU
②LIB部分
随后同理
③.PORT部分
点击uCOS-III\Ports\ARM-Cortex-M3\Generic\RealView
找到文件
④SOURCE部分
点击MDK-ARM\uCOS-III\Source
把这些所有文件都添加进去。
⑤CONFIG部分
点击MDK-ARM\uC-CONFIG
添加
⑥BSP部分
点击MDK-ARM\uC-BSP
添加
添加完成点击OK。
导入路径。
点击仙女棒,随后按如图所示添加路径即可。
2…代码
1)启动文件.
①打开startup_stm32f103xb.s
文件
将75-76行将如图两行代码分别更改为
OS_CPU_PendSVHandler
OS_CPU_SysTickHandler
174、175行和178、179行也这样操作
②打开app_cfg.h
文件
将42行代码后面代为 DEF_DISABLED
随后在85行更改为 #define APP_TRACE(void)
③打开includes.h
文件
在69行插入以下代码
#include "gpio.h"
#include "app_cfg.h"
87行将#include <stm32f10x_lib.h>
改为
#include “stm32f1xx_hal.h”
④lib_cfg.h
文件
打开
将此处改为5u
⑤usart.c
文件
打开
在文件尾部加入代码
/* USER CODE BEGIN 1 */
typedef struct __FILE FILE;
int fputc(int ch,FILE *f){
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xffff);
return ch;
}
/* USER CODE END 1 */
⑥初始化管脚
在gpio.c文件的第一个函数,改为如图所示
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);
}
⑦为bsp.c和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()