1,获取华大开发包
2,获取FreeRTOS文件
首先我的IAR开发环境是IAR8,使用 HC32L136K8TA开发板
然后使用华大开发包的gpio_output工程,一个简单的点灯工程,为了好看一点,特意调整了一下工程路径 ,需要改动四个地方
第一个是C/C++ Compiler -> Preprocessor 更改.h路径
第二个是Debugger -> Setup -> Device description file 更改svd路径
第三个是当前工程目录下/flashloader/FlashHC32L13X.flash 更改烧写路径
第四个是把左边工程文件删除之后,在重新添加,到此为止工程已经整理好了
开始移植FreeRTOS
我选择 FreeRTOSV9.0.0,尽管现在 FreeRTOS 的版本已经更新到 V10.0.1 了,但是我还是选择 V9.0.0,因为内核很稳定,并且网上资料很多,因为 V10.0.0 版本之后是亚马逊收购了 FreeRTOS 之后才出来的版本,主要添加了一些云端组件,所以采用 V9.0.0 版本足以。
提取FreeRTOS所需文件
1,FreeRTOSv9.0.0\FreeRTOS\Source\include下所有文件(.h文件)
2,FreeRTOSv9.0.0\FreeRTOS\Source\portable\MemMang下heap_4.c文件
3,FreeRTOSv9.0.0\FreeRTOS\Source\portable\IAR\ARM_CM0下所有文件
4,FreeRTOSv9.0.0\FreeRTOS\Source下所有文件(.c文件)
5,FreeRTOSv9.0.0\FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_IAR\FreeRTOSConfig.h
提取完毕
设置IAR
1,IAR设置FreeRTOS路径
,2,IAR汇编设置路径
3,C/C++ Compiler -> Diagnostics 加入
Pm117,Pm119,Pm154,Pm113,Pm058,Pm003,Pm121,Pm008,Pm049,Pm139,Pm142,Pm081,Pm043,Pm069,Pm127,Pe167,Pm071防止编译器报错
4,FreeRTOSConfig.h最后面加入
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
并且屏蔽SysTick_Handler
5,FreeRTOSConfig.h设置滴答定时器的中断时间,时钟频率为32M,systick定时器1ms中断一次
#define configCPU_CLOCK_HZ ( ( unsigned long ) SystemCoreClock )
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
6,HC32L136的SRAM大小为8KByte,可通过手册查看到
IAR设置堆栈空间 Linker -> Config ->Edit
这个芯片的堆栈加起来最大可以设为0x2000,8k字节
FreeRTOSConfig.h设置FreeRTOS空间大小,用了3K字节,FreeRTOS实际就是定义了一个3K字节的数组
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 3 * 1024 ) )
7,port.c屏蔽static void prvSetupTimerInterrupt( void )里面的内容
在初始化里面加入 SysTick_Config(configCPU_CLOCK_HZ/configTICK_RATE_HZ);
void prvSetupTimerInterrupt( void )其实就是实现Systick定时器中断,因为懒得调所以直接把它屏蔽了
8,然后创建任务
9,然后就能看到灯一闪一闪了
移植FreeRTOS花了我两天时间,踩了不少坑,其实只要一步一步慢慢调试,在debug窗口上查看数据,莫心急,就能搞出来了。