stm32 移植rt_thread

来源:互联网 发布:高斯滤波器的算法 编辑:程序博客网 时间:2024/06/05 06:31

stm32f429 移植RT_Thread  

RTT作为一个中国的开源实时操作系统,经过国内一些专业人士的充实,现在其已经支持大部分MCU以及X86当然现在用的很火的STM32也不例外;RTT最大的特点就是线程数不限,支持以线程为基本调度单位的多任务系统。调度算法是基于优先级的全抢占式线程调度,支持256个线程优先级(亦可配置成32个线程优先级),0优先级代表 最高优先级,255优先级留给空闲线程使用;相同优先级上支持多个线程,这些相同优先级的线程采用可设置时间片长度的时间片轮转调度;调度器寻找下一个最 高优先级就绪线程的时间是恒定的(O(1))。系统不限制线程数量的多少,只与物理平台的具体内存相关。

现在2014.2月,RTT已经更新到1.2.0版本,当然现在STM32也出了最新的429/439,但是RTT里只支持了40X;但是40X与429/439在硬件上区别不是很大这样我们就可以用40X作为模板进行移植了。

在移植之前大家要知道,RTT是靠scons来编译和生成keil或者IAR的工程文件的,所以用scons这个工具在移植时比较方便,不必自己去找那些文件。
在此之前确保自己电脑上已经安装了Python和scons:下载的地址 Python:http://www.python.org/download/ (在此我用的是Python2.7)
scons: http://www.scons.org/download.php  选择适合自己系统版本
先安装Python;再把Python的安装路径添加到系统的PATH中;再安装scons一路next;会自动安装到:XXX\Python27\Scripts目录下,再把这路径添加到系统PATH中;弄好了后分别在cmd下运行一下Python -v,scons -v看安装是否成功。
接下来去RTT官网下载源码,一般首页的右上角就会有下载链接:下载下来后解压到一个盘的根目录:改名为RT_Thread,比如D:\RT_Thread;在系统的系统变量中添加一个RTT_ROOT 变量,把自己刚刚那个路径填进去,运行一下set RTT_ROOT,看是否成功。
再把stm32f429的库函数下载下来。
现在回到刚刚放RT_thread文件的中去:
stm32f429 移植RT_Thread - stubbron - ChinaHEAVEN
bsp里就是可以支持芯片的工程模板;里面有一个 stm32f40x目录,把它拷贝出来,为了不破坏原来的文件;之前说了RT_Thread是靠scons来编译或者建立keil工程的,和linux的Makefile有些相似之处,在这个目录下有几个比较重要的文件:
stm32f429 移植RT_Thread - stubbron - ChinaHEAVEN
 一个是rtconfig.h,就是通过这个文件添加和删减系统组件的;还有一个是template.uvproj这是生成的keil工程的模板,可不要删了。接下来用写字板打开 rtconfig.py 文件,他就是定义编译器这些的巨像Makefile,我们用的是keil,修改一下 keil 的安装路径,看看自己keil装到哪了,如果一致就不用改了。实打开每个文件夹下面都一个SConscript文件,这个就是让文件关联起来的文件,大家仔细看看就知道它是如何工作的了;
大家可以看看rtconfig.h文件,看了就知道是怎么注册一个组件,删减一个组件;默认就开了一个finsh,我们就先移植这个简单的。
打开命令行cmd ,切换到stm32f40x目录下,执行 scons --target=mdk4 –s ,这下就把keil工程建建好了,keil打开工程;大家会发现keil的设置有些问题,我们手动改一下,就是芯片选型,还有就是外部晶振。这两个改好后;我们看看工程文件:
stm32f429 移植RT_Thread - stubbron - ChinaHEAVEN比较整洁吧,比自己手动移植干净的多,打开Drivers里面的board.c/ board.h就是初始化板子,看看board.h中会发现板子用的是USART2,而且内存也不对,下边红的就要改的(如果你用的是usart就不用改),如果用的不是默认引脚,那再打开usart.c把引脚一改。
// <o> Internal SRAM memory size[Kbytes] <8-64>
// <i>Default: 64
#define STM32_SRAM_SIZE         192    //stm32f429 是 256K 在0x20000000后有192K 在0x10000000还有64k
#define STM32_SRAM_END          (0x20000000 + STM32_SRAM_SIZE * 1024)
#define RT_USING_UART1
//#define RT_USING_UART2
//#define RT_USING_UART3
// <o> Console on USART: <0=> no console <1=>USART 1 <2=>USART 2 <3=> USART 3
//  <i>Default: 1
#define STM32_CONSOLE_USART1

下一个文件夹STM32_Stperiph:这个文件改的多一点,因为和STM32F429的库文件有些不合,先把这个目录下的文件都移除;看看最后的那个startup汇编文件也不对,之前不是下载了stm32f429的库文件嘛,把429要的库文件替换STM32_Stperiph下的文件,把里面的startup_stm32f429_439xx.s替换原来的startup_stm32f4xx.s,分别在在刚刚拷贝出来的文件里stm32f40x\Libraries\STM32F4xx_StdPeriph_Driver\inc src和
stm32f40x\Libraries\CMSIS\ST\STM32F4xx\Source\Templates\arm目录下。再把这文件的文件添加到STM32_Stperiph下。
那么我们先编译一下,会发现有错误,为什么呢?因为我们忘了还有一个文件忘改了,那就是stm32f4xx_conf.h;它在stm32f4xx\drivers目录下,把新下的库文件里面的stm32f4xx_conf.h拷贝过来。
在编译一次,应该就可以通过了,下载下去就可以看见串口打印出信息了。

再次要确定自己的晶振是不是25MHz,如果是8MHz就必须在stm32f4xx_conf.h中加上:(这是在readme.txt有说)
#if defined  (HSE_VALUE)
/* Redefine the HSE value; it's equal to 8 MHz on the STM32F4-DISCOVERY Kit */
 #undef HSE_VALUE
 #define HSE_VALUE    ((uint32_t)8000000)
#endif /* HSE_VALUE */
0 0