有个小项目,用什么MCU无所谓,所以我想试试已经1年多没用的STM32,这么长时间没关注她,竟然多出来那么多系列,我还是使用103系列,这次我用的是STM32F103VCT6,主要是因为她有DAC,我需要,还因为她有USB,虽然我的小项目目前没有用到,但我想以后扩展功能,需要用到,再加上她不到20元,这么便宜,我不用都感觉自己吃亏了。。。
FreeRTOS官网上有STM32的移植,但固件库的版本太低了,竟然没有DAC的固件库,而且新老版本固件兼容性不是很好,我在想是把固件库移植到FreeRTOS的例程上,还是把FreeRTOS移植到固件库的例程上,为此我内心挣扎了好久,再加上我是个OS新手,uCOS才用了不到1年,此前我尝试过把uCos-III、RTT等移植到最新的固件库上,但都未果,为啥未果,我也来说道说道。。。
uCOS-III的官方移植是基于107的,我用的是103,我着手改动,发现丫的竟然把STM32的固件库给改了一部分,这加深了我往103移植的难度和风险,因为我不能把全部代码看完,以确定他哪些改了哪些没改,而且他改了以后,固件库对各个CPU的兼容性支持较差,本来定义一个宏,就可以支持不同型号的STM32,所以放弃。。。
后来考虑过RTT,听说这是国产的,想支持下国货,由于我现在这个小项目不是正式产品,我可以随意使用我喜欢的OS,稳定性什么的不是很重要(呃。。。不要怀疑,是这样的)而且中文资料比较全,但文档看了一半开始退缩了,他开始跟我讲面向对象,讲C++的好处,我看了一年的VC都没学会,我这么笨的人,这么缺乏面向对象概念的人,怎么可能学会一个用C++思想的OS,所以放弃。。
终于可以进入正题了,需要准备两个东西,一个是STM32固件库V3.5.0,另一个是FreeRTOS源代码V7.0.2,都是目前最新版的,我加入了链接,如果你是转发我的**,可能这个链接就没了,所以转发注明出处
解压固件库,目录“..STM32F10x_StdPeriph_Lib_V3.5.0ProjectSTM32F10x_StdPeriph_TemplateMDK-ARM” 下打开工程文件,由于我用的是STM32F03VCT6,所以选择“STM3210E-EVAL”,同时打开解压FreeRTOS,打开关于103的例程keil版本,在这个目录下“..FreeRTOSv7.0.2FreeRTOSv7.0.2DemoCORTEX_STM32F103_Keil”
这个是以VCT6为例移植,其他型号一样
1、 参照FreeRtos中的STM32F10x.s修改startup_stm32f10x_hd.s(我用的是103VCT6所以选择这个文件,用其他CPU用其他启动文件)
添加:
1 IMPORT xPortPendSVHandler2 IMPORT xPortSysTickHandler3 IMPORT vPortSVCHandler4 //IMPORT vUARTInterruptHandler5 //IMPORT vTimer2IntHandler
后两个不要添加,因为这不是FreeRTOS核心代码,是他demo用到的,我们不需要
对应后面的中断入口地址需要更改
DCD vPortSVCHandler ; SVC_Handler
...
DCD xPortPendSVHandler ; PendSV_Handler
DCD xPortSysTickHandler ; SysTick_Handler
复制代码
两者还有一点小小的不同是复位时进入main函数之前的那段代码,新版本固件库的启动代码中,在进入main()函数之前执行函数SystemInit()初始化了时钟,这个根据目标板不同,注意此段代码
2、把..FreeRTOSv7.0.2 文件夹下的Source文件夹复制到..STM32F10x_StdPeriph_Lib_V3.5.0Libraries 并重命名为FreeRTOS
3、FreeRTOSConfig.h复制到“..STM32F10x_StdPeriph_Lib_V3.5.0UtilitiesSTM32_EVALSTM3210E_EVAL”下
4、参照FreeRTOS例程在STM32的固件库例程中加入组FreeRTOS,并加入文件,我截个图吧
5、当然,在Keil里该包含的文件要包含,也截图吧
就这么简单,呃。。。我应该没落下什么东西吧。。。把原来的main函数修改一下,执行我的代码,我的任务已经可以调度了
补充一句,我很喜欢FreeRTOS变量和函数的命名风格
本来想把我改的工程传上来,这附件怎么限制2M啊。。。固件库好几十兆,我这样看能看懂吧
**有不对的地方请留言,也可以email我arm-cortex#qq.com
转载请注明出处。。。来自青岛小庄。。。2011.11.28。。。。arm-cortex#qq.com |