本帖最后由 吉帅虎 于 2018-9-12 09:42 编辑
通过在RT-Thread内核和外设学习营群一周的学习,基本理解了RT-Thread内核的运行原理,并功能把RT-Thread内核移植到自己的STM32F103VC板卡上。现经移植步骤分享如下1、准备内容
自用STM32F103VCT6板卡
RT-Thread最新内核文件(rt-thread-3.0.3.zip)下载地址:
参考资料:keil下搭载RT_Thread最小系统工程
https://www.rt-thread.org/docume ... al/project/project/ 2、准备裸跑最小工程
这一步不是必须的,参考资料里面也没有这一步,但是这一步却很重要,因为作为一个陌生的OS,移植过程中难免会出现各种问题,没有基本的最小功能很难检测移植是否正常。最小系统一般用最简单的LED指示灯周期闪烁即可。见下图

3、按参考资料复制内核文件
如果对内核的文件结构不熟悉,最好按照参考资料里的建议新建文件夹,内核文件中复制到工程文件夹下。参考资料里用了HAL库,我用的是STD库,这一点在复制BSP文件夹下文件的时候略有差别。如下图

4,调整工程文件
按照参考资料的文件树结构把复制到文件下的文件添加到工程文件中,并添加响应的头文件路径。keil中添加文件组、文件、头文件路径的过程不再赘述,既然使用keil学习RT-Thread的话肯定熟悉了keil的基本操作,不了解的话可以通过其他途径学习。其他设置参考上面提到的文件,但不要迷信,对keil的一些设置是根据自己的工程的实际情况确定的,要灵活掌握。把相关文件添加进来后,编译,一般都会有些错误,最常见的就是找不到头文件,解决方法除了参考上面的资料,还可以在工程文件文下查找响应文件,然后查看路径,把相应的路径添加进来即可。再一个就是变量未定义或者重复定义。未定义变量最常见的元件就是文件添加有误,仔细确定文件是否正确即可。重复定义一般就是文件的重复添加,或者自己定义的文件和库文件里有内容重复的内容,通过全部变量搜索到重复的内容,删除不用的即可。在我的移植过程中,最终只有一个变量问题没有定义。见下图

此变量所在的函数是确定操作系统的Systick周期的。SystemCoreClock的意思也很明白,是系统内核时钟频率。通过全局变量,查找不到这个变量的定义。根据上下文,我们知道rt_hw_board_init函数的功能是初始化板卡硬件。我们可以把此段代码修改成如下

SystemInit()函数是STD库的系统初始化函数,系统内核时钟具体是多少在STD库的system_stm32f10x.c文件内定义的,我用的是板卡内核时钟频率为72MHz,为了简单,我在此处直接写了72000000,为了方便日后移植,可以把此值定义成一个常量,便于以后统一修改。
5、完成上述杀虫操作后,编译没有问题了。可以先用仿真环境下调试运行,结果很无语,系统没有运行起来。
问题的查找应该一步一步进行,根据一般常识(即便不了解RT_Thread也一样),一个完整的系统肯定要初始化系统时钟,硬件端口等内容。因此我们可以在这些地方设置断点进出问题查找。想到这一点,我们去查找 rt_hw_board_init()函数,发现程序并未执行到这里,并且一直没有执行到。于是往上查找,即调用 rt_hw_board_init()的地方,如此可以找到函数的最初入口处,如下

通过上下文我们可以知道,如果没有定义RT_USING_MAIN,代码即不会执行到此处。查到此处,解决办法就很简单了,在rtconfig.h中定义RT_USING_MAIN重新编译,调试,一切正常。

修改调试方式,下载到硬件板卡上。一切正常

6、经验分享
首先就是重复学习RT-Thread的代码结构,了解每一部分代码的实现的功能,了解内核运行的机理。这样对移植过程中文件位置的分配会有所帮助,一般情况下,要严格按照官方的文件路径放置文件,虽然这些不是必须的,只要满足编译器的规则即可。但是合理的放置文件在使用和移植,迁移过程都会有所帮助。
其次是Debug能力,移植过程中一般很难做到一次性成功,要充分利用编译器编译过程中的错误提示,能快速定位 问题所在,便于快速解决问题。对于一些警告信息,要引起重视,忽略不影响功能的警告,必须处理影响功能的警告,不明白的警告可以通过网络渠道查找原因。
接下来是 分析代码的能力,通过程序的流程,联系上下文查找问题,并定位问题,最终便可解决。
对于OS的移植,关键是对OS的理解,并细心分析查找。另外参考一个成功的例程也会有所帮助。希望大家在日后的学习中都有所收获。
查看更多