一、嵌入式实时操作系统(RTOS)
嵌入式实时操作系统(RTOS)是专为嵌入式系统设计的操作系统,它能够满足实时性和可预测性的要求。uc/OS-III(MicroC/OS-III)是一种广泛使用的开源嵌入式实时操作系统之一。
1. uc/OS-III 简介:
1.1 特点:
实时性:uc/OS-III设计用于支持实时系统应用。
多任务支持:支持多任务处理,可以同时执行多个任务。
内核对象:提供了诸如任务、信号量、消息队列等内核对象。
可裁剪性:可以根据应用需求选择性地裁剪功能,以减小内存占用。
1.2 内核对象:
任务(Task):用于执行实际的工作。
信号量(Semaphore):用于任务间的同步和互斥。
消息队列(Message Queue):任务之间通过消息进行通信。
事件标志组(Event Flag Group):用于任务同步。
互斥量(Mutex):提供互斥访问共享资源的机制。
1.3 任务调度:
uc/OS-III使用抢占式优先级调度算法,高优先级任务可以抢占低优先级任务的执行。
2. 使用 uc/OS-III 的基本步骤:
2.1 创建任务:
使用uc/OS-III API创建需要执行的任务。
2.2 初始化内核对象:
初始化信号量、消息队列等内核对象。
2.3 启动 uc/OS-III 内核:
启动uc/OS-III内核后,它将开始执行预定义的任务。
2.4 任务编写:
在任务中编写具体的应用逻辑。
2.5 任务同步和通信:
使用信号量、消息队列等机制进行任务之间的同步和通信。
二、使用STM32CubeMX配置项目
1.在STM32CubeMX中选择相应芯片
这里使用STM32F103C8芯片进行实现
2.配置RCC
3.配置SYS
4.配置USART1
5.配置引脚
6.在项目设置中进行如下设置
设置完成后,点击右上角GENERATE CODE 进行输出。
三、在keil中进行编程
1.添加文件
1.在文件夹中粘贴文件
2.在项目中创建文件夹
3.在CPU中导入以下文件
4.在LIB中导入以下文件
5.在PORT中导入以下文件
6.在SOURCE中导入以下文件
7.在CONFIG中导入以下文件
8.在BSP中导入以下文件
9.在BSP中导入以下文件
10.添加路径
2.修改代码
1.编写bsp.h
2.编写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()