关于怎么移植,树立工程的问题已经有许多文档阐明晰,此处仅仅阐明一下需求修正的文件及修正的原因。
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 //禁用互斥信号量
#define OS_Q_EN 0 //禁用行列
#define OS_SEM_EN 0 //禁用信号量
#define OS_TMR_EN 0 //禁用定时器
#define OS_DEBUG_EN 0 //禁用调试
也能够禁用应用软件的钩子函数和多重事情操控
#define OS_APP_HOOKS_EN 0
#define OS_EVENT_MULTI_EN 0
这些所做的修正主要是把一些功用给去掉,削减内核巨细,也利于编译调试。等用到的时分,再敞开相应的功用。