基于 STM32F103RCT6 单片机的 μC/OS-II 嵌入式操 作系统的移植、应用程序设计基于 μC/OS-II 的简易计算器设计
时间: 2024-06-08 12:05:41 浏览: 281
嵌入式系统μC/OS-II 的移植
3星 · 编辑精心推荐
移植 μC/OS-II 操作系统:
1. 下载 μC/OS-II 操作系统源码,并解压缩。
2. 打开 Keil MDK-ARM 软件,创建一个新的工程,选择单片机型号为 STM32F103RCT6。
3. 在工程目录下创建一个名为 OS 的文件夹,将 μC/OS-II 源码中的目录 core、source、port 目录拷贝到 OS 文件夹下。
4. 在 Keil 软件中,打开 Options for Target,选择 C/C++ 标签页,添加头文件搜索路径,路径为 $(ProjectDir)\OS\source\inc。
5. 在工程中添加一个名为 os_cfg.h 的文件,文件内容如下:
```
#ifndef OS_CFG_H
#define OS_CFG_H
#define OS_MAX_TASKS 16u
#define OS_MAX_EVENTS 16u
#endif
```
6. 在工程中添加一个名为 os_cpu.h 的文件,文件内容如下:
```
#ifndef OS_CPU_H
#define OS_CPU_H
#include <stdint.h>
#include "stm32f10x.h"
#define OS_STK_GROWTH 1u
#define OS_TASK_SW() OSCtxSw()
typedef uint32_t OS_CPU_SR;
#define OS_ENTER_CRITICAL() {OS_CPU_SR cpu_sr = 0u; cpu_sr = OS_CPU_SR_Save();}
#define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);}
#define OS_CRITICAL_METHOD 3u
void OSStartHighRdy(void);
void OSCtxSw(void);
#endif
```
7. 在工程中添加一个名为 os_cpu_c.c 的文件,文件内容如下:
```
#include "os_cpu.h"
void OSStartHighRdy(void)
{
__set_CONTROL(0x02u);
}
void OSCtxSw(void)
{
__asm volatile (
"PUSH {R4-R11,LR} \n\t"
"MRS R4, PSP \n\t"
"STMDB R4!, {R4-R11} \n\t"
"LDR R5, =OSTCBCurPtr \n\t"
"LDR R5, [R5] \n\t"
"STR R4, [R5] \n\t"
"LDR R4, [R5, #4] \n\t"
"LDMIA R4!, {R4-R11} \n\t"
"MSR PSP, R4 \n\t"
"POP {R4-R11,PC} \n\t"
);
}
OS_CPU_SR OS_CPU_SR_Save(void)
{
OS_CPU_SR cpu_sr;
__asm volatile (
"MRS %0, PRIMASK \n\t"
"CPSID I \n\t"
: "=r" (cpu_sr)
);
return cpu_sr;
}
void OS_CPU_SR_Restore(OS_CPU_SR cpu_sr)
{
__asm volatile (
"MSR PRIMASK, %0 \n\t"
:
: "r" (cpu_sr)
);
}
```
8. 在工程中添加一个名为 os_tick.c 的文件,文件内容如下:
```
#include "os_cpu.h"
#include "ucos_ii.h"
extern uint32_t SystemCoreClock;
void SysTick_Handler(void)
{
OS_CPU_SR cpu_sr;
OS_ENTER_CRITICAL();
OSTimeTick();
OS_EXIT_CRITICAL();
}
void OS_CPU_SysTickInit(uint32_t ticks)
{
SysTick_Config(SystemCoreClock / ticks);
}
```
9. 在工程中添加一个名为 startup_stm32f10x_md.s 的汇编启动文件。
10. 编译工程,生成可执行文件。
应用程序设计:
1. 在工程中添加一个名为 main.c 的文件,文件内容如下:
```
#include "stm32f10x.h"
#include "ucos_ii.h"
#define TASK_STK_SIZE 128u
static OS_STK Task1Stk[TASK_STK_SIZE];
static OS_STK Task2Stk[TASK_STK_SIZE];
static void Task1(void *p_arg)
{
while (1) {
GPIO_SetBits(GPIOC, GPIO_Pin_13);
OSTimeDlyHMSM(0, 0, 0, 500);
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
OSTimeDlyHMSM(0, 0, 0, 500);
}
}
static void Task2(void *p_arg)
{
while (1) {
GPIO_SetBits(GPIOC, GPIO_Pin_14);
OSTimeDlyHMSM(0, 0, 0, 200);
GPIO_ResetBits(GPIOC, GPIO_Pin_14);
OSTimeDlyHMSM(0, 0, 0, 200);
}
}
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
OSInit();
OSTaskCreate(Task1, NULL, &Task1Stk[TASK_STK_SIZE - 1], 0);
OSTaskCreate(Task2, NULL, &Task2Stk[TASK_STK_SIZE - 1], 1);
OSStart();
while (1);
}
```
2. 在 Keil 软件中,选择 Options for Target,选择 Debug 标签页,配置调试器选项,选择 ST-Link Debugger,并设置好连接方式和调试器芯片型号。
3. 编译并下载程序到 STM32 单片机中。
4. 运行程序,观察 LED 灯闪烁情况。
阅读全文