STM32学习记录13 ucosII移植
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
由于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
STM32学习记录ucosII移 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)