微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32学习记录13 ucosII移植

STM32学习记录13 ucosII移植

时间:11-13 来源:互联网 点击:
关于如何移植,建立工程的问题已经有很多文档说明了,此处只是说明一下需要修改的文件及修改的原因。

1:os_cpu.h

我们需要对此文件进行修改:

1) void OS_CPU_PendSVHandler(void) 需替换成 void PendSV_Handler(void) 一般我们自己开发基于 stm32 芯片的软件,都会使用标准外设库 CMSIS 中提供的启动文件,比如 startup_stm32f10x_hd.s,而 Micrium 官方没有用 ST 的标准启动文件,而且分开写成了两个.s 文件,即 init.s 和 vectors.s

(Micrium\Software\EvalBoards\ST\STM3210B-EVAL\RVMDK) init.s 负责进入 main(),vectors.s 设置中断向量 由于 OS_CPU_PendSVHandler 这个中断向量就是在 vectors.s 中被设置的,且我们使用的是startup_stm32f10x_hd.s 作为启动文件的,而在 startup_stm32f10x_hd.s 文件中,PendSV 的中断向量名为 PendSV_Handler,所以只需用 PendSV_Handler 替换掉相应文件的OS_CPU_PendSVHandler,其中函数声明在 OS_CPU_C.h 中,具体的中断服务函数原型在OS_CPU_A.ASM 中,后面也将对其进行修改。 这样子,替换后的 PendSV_Handler 函数在 OS_CPU_C.h 中有声明,在 OS_CPU_A.ASM 中有具体的中断服务函数代码,与 startup_stm32f10x_hd.s 中的向量地址就对应上了。

2) 注释掉最后三个关于 SysTick 服务函数

void OS_CPU_SysTickHandler(void);

void OS_CPU_SysTickInit(void);

INT32U OS_CPU_SysTickClkFreq(void);

其中,OS_CPU_SysTickHandler 函数在 ST 标准库 stm32f10x_it.c 中已定义,此处不需要;

其中,OS_CPU_SysTickInit 定义在 os_cpu_c.c 中,依赖于 OS_CPU_SysTickClkFreq,用于初始化 SysTick 定时器,需注释掉;其中,OS_CPU_SysTickClkFreq 定义在官方 EvalBoards 的 BSP.c中,需解除依赖,若需要,我们可以在 bsp.c 中实现。

2: stm32f10x_it.c

由于1.2的原因,需要修改

SysTick 作为 OS 的“心跳”,可称为滴答时钟,本质上来说就是一个定时器,和 PendSV 中断一样,在 startup_stm32f10x_hd.s 中 SysTick 的中断向量名为 SysTick_Handler,且因为 ST标准库已经有相关库函数,所以我们只需作如下修改:

打开 os_cpu_c.c 文件,找到 void OS_CPU_SysTickHandler(void)的内容代码

OS_CPU_SR cpu_sr;

OS_ENTER_CRITICAL();

OSIntNesting++;

OS_EXIT_CRITICAL();

OSTimeTick();

OSIntExit();

复制到 stm32f10x_it.c 文件中的 SysTick_Handler (void)函数内;

void SysTick_Handler(void)

{

OS_CPU_SR cpu_sr;

OS_ENTER_CRITICAL();

OSIntNesting++;

OS_EXIT_CRITICAL();

OSTimeTick();

OSIntExit();

}

并且在文件头部添加:#include

3:os_cup_a.asm

由于1.1的原因,OS_CPU_PendSVHandler 中断服务函数的原型在此文件中,我们需要用PendSV_Handler 将其替换,以实现在 startup_stm32f10x_hd.s 中的中断向量的匹配。

1) 注释掉 EXPORT OS_CPU_PendSVHandler,并修改成 EXPORT PendSV_Handler,

2) 找到 OS_CPU_PendSVHandler 程序原型,并重命名为 PendSV_Handler

这样 PendSV_Handler 中断服务函数就成功建立了,同时,我们需要注释掉 stm32f10x_it.h 和stm32f10x_it.c 中的相关 PendSV_Handler 的声明和定义,以防止冲突。

4:os_cpu_c.c

由于1.2做一下修改:

1) 把最后 OS_CPU_SysTickHandler(), OS_CPU_SysTickInit()这两个函数的内容代码注释掉;

2) 禁用以下宏定义,因为他们涉及到上一步注释的 Systick 服务函数

#define OS_CPU_CM3_NVIC_ST_CTRL (*((volatile INT32U *)0xE000E010))

#define OS_CPU_CM3_NVIC_ST_RELOAD (*((volatile INT32U *)0xE000E014))

#define OS_CPU_CM3_NVIC_ST_CURRENT (*((volatile INT32U *)0xE000E018))

#define OS_CPU_CM3_NVIC_ST_CAL (*((volatile INT32U *)0xE000E01C))

#define OS_CPU_CM3_NVIC_ST_CTRL_COUNT 0x00010000

#define OS_CPU_CM3_NVIC_ST_CTRL_CLK_SRC 0x00000004

#define OS_CPU_CM3_NVIC_ST_CTRL_INTEN 0x00000002

#define OS_CPU_CM3_NVIC_ST_CTRL_ENABLE 0x00000001

5:os_cfg.h

此文件为配置内核的头文件,在这个文件,我们可以禁用信号量、互斥信号量、邮箱、队列、信号量集、定时器、内存管理,调试模式:

#define OS_FLAG_EN 0 //禁用信号量集

#define OS_MBOX_EN 0 //禁用邮箱

#define OS_MEM_EN 0 //禁用内存管理

#define OS_MUTEX_EN 0

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top