×
嵌入式 > 嵌入式开发 > 详情

ucOS学习笔记(4)——一步一步移植ucOS到STM32

发布时间:2020-08-10 发布时间:
|
准备工作:
1.到micrium官网下载最新的 OS在stm32上的移植资料。 

2.平台搭建:
a.将1下载得到的文件解压得到micrium文件夹,并在Micrium\Software\ OS-II下用UV4创建一个 OS工程,配置CPU为STM32F101C8

b.建立如图1所示的工程目录结构。其中APP层用于放置应用程序, OS用于放置所有 OS与处理器无关的源码,PORT用于放置移植 OS需要改动的文件,而BSP则用于放置系统的驱动程序,LIB为系统调用的库支持。该目录组织依据来源于micrium公布的 OS移植文档,图2是该移植文档的系统软件结构图供参考。

图1 OS的目录结构

图2 OS系统软件结构
c.工程建立完毕以后将Micrium\Software\ OS-II\Source目录下的所有文件(包括h文件)添加到 OS组,将Micrium\Software\ OS-II\Ports\ARM-Cortex-M3\Generic\RealView目录下的所有文件添加到PORT组

d.完成以上工作后进行一次编译,我们可以发现出现错误提示
.Source\os_core.c(26): error: #5: cannot open source input file " os_ii.h": No s h file or directory
该问题是包含文件路径引起的, os_ii.h文件实际上存在于Micrium\Software\ OS-II\Source目录下。因此我们需要在工程设置中的C/C++选项卡手动增加头文件路径,针对以上错误我们应该增加的头文件路径未.\Source

e.再次编译发生错误
.\Source\ os_ii.h(44): error: #5: cannot open source input file "app_cfg.h": No s h file or directory
这个问题应该不是原生 OS导致的,是micrium移植系统的时候修改了源文件,在其中增加了一些配置选项,这个配置选项保存在app_cfg.h中,但是micrium发布移植文件包的时候该文件又没有包含在内,因此需要我们自己写一个配置文件。本文为了方便就不细致研究文件内容,直接从micrium的开发板STM3210B-EVAL源码包中拷贝该文件放置于工程目录下的APP文件夹中,并设置相应的包含路径。

f.再次编译发生错误
.\Source\ os_ii.h(45): error: #5: cannot open source input file "os_cfg.h": No s h file or directory
在micrium的移植文件包中也没有这个文件,但是在目录Micrium\Software\ OS-II\Source下存在一个文件名为os_cfg_r.h的文件,将该文件名后的r去掉解决。

g.再次编译发生错误
.\Source\ os_ii.h(46): error: #5: cannot open source input file "os_cpu.h": No s h file or directory
该文件实际上存在于Micrium\Software\ OS-II\Ports\ARM-Cortex-M3\Generic\RealView目录下,因此可以通过修改文件包含路径解决。

h.再次编译发生错误
.\OUTPUT\ OSII.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.
点击该错误提示出现以下内容:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00010000 { ; load region size_region
ER_IROM1 0x08000000 0x00010000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00002800 { ; RW data
.ANY (+RW +ZI)
}
}
实际上这个错误发生在连接阶段,从点击错误得到的信息看表示连接的时候找不到一个标号为RESET的段,而keil默认连接是从RESET段开始的,因此出现了这个错误。对于这个错误的解决方法我们可以通过e的方式,将开发板软件包内的init.s文件拷贝到APP目录,并添加到工程中,同时把init.s文件中第一个段改名由INIT为RESET解决。

i.再次编译发现在连接的时候很多以hook结尾的代码找不到实体,但是有声明。错误示例如下:
.\OUTPUT\ OSII.axf: Error: L6218E: Undefined symbol App_TCBInitHook (referred from os_cpu_c.o).
这些函数实际上都是 OS为了方便用户监视系统运行过程而保留的钩子函数, OS内部的函数名实际上是OSTCBInitHook,micrium在移植过程中为了层次清晰,在 OS钩子函数内部增加了相应的APP***HOOK调用,同时通过功能开关OS_APP_HOOKS_EN来控制是否启用这些功能。我们当前的代码除了 OS系统代码,其他什么应用代码都还没有,因此编译会出错。这种情况下我们需要暂时关闭这个功能将在OS_CFG.h中的OS_APP_HOOKS_EN配置为0。

j.再次编译发现系统提示没有main函数,增加一个main.c文件解决。

k.再次编译发生错误:
.\OUTPUT\ OSII.axf: Error: L6218E: Undefined symbol OS_CPU_SysTickClkFreq (referred from os_cpu_c.o).
这个错误时系统找不到OS_CPU_SysTickClkFreq这个函数实体。查阅相关资料发现micrium增加这个函数的目的是获取系统当前的时钟频率,于是我们在工程中的BSP组增加一个bsp.c文件,同时实现这个OS_CPU_SysTickClkFreq函数即可。未测试需要,本函数简单写为
INT32U OS_CPU_SysTickClkFreq(void)
{
return 8000000;
}

l.再次编译已经没有错误发生,只有一个警告信息
.\OUTPUT\ OSII.axf: Warning: L6305W: Image does not have an entry point. (Not specified or not set d to multiple choices.)
通过查阅资料,大致意思就是说keil不知道整个代码的入口在哪儿,根据init.s中的代码
ENTRY
ResetHndlr

;******************************************************************************
; SETUP STACK POINTERS
;******************************************************************************


;******************************************************************************
; MOVE TO MAIN
;******************************************************************************
ldr r0, =__main
bx r0 ; Save this in register for possible long jump ;

ALIGN
END
可以看到我们的入口在标号为ResetHndlr的地方,因此我们通过指定入口解决该问题。指定入口的方法是在编译器选项的linker页增加命令
--entry ResetHndlr

至此第一步编译算是完成了。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32 TIMx 配置