整个FreeRTOS源码的文件组成架构在上一篇文章已经说过了,这里就不赘述,直接文字写步骤
一、大体流程
- 建立stm32的基本工程框架文档
- 讲源码(source)拷贝到该工程目录下,并删去(portable中)不必要的部分(本次只留下keil、Memmang和RVDS三个文档)
- 打开工程文件,添加FreeRTOS的文件(manage project处)添加freertos_core和freertos_port(名字自己随便起,但注意可维护性和可读性)
- 将文件source内第一级目录下除文件夹外的所有.c文件都添加到core文件目录下
- 将portable中heap_4.c(内存管理的)添加到port文件目录下
- 将RVDS中的CM3下的文件port.c(移植接口文件(汇编+c))文件加入到port文件目录下
- 指定头文件路径(魔术棒处),将include文件夹下都包含到,以及对应地RVDS的对应文件的port.c单独对应的.h文件所存放的文件夹
- 编译,检查是否有报错
- 参考Demo文件例程stm32芯片的例程去修改错.
- 适当注释掉stm32的中断函数文件的宏(如果定义有冲突的话)(例如:PendSV_Handler和SVC_Handler)
- Systick延时函数的改写
二、中断文件的修改
Systick是stm32选择的给freeRTOS的时钟方式
在 Systick_Handler要编写freeRTOs的相关代码
可在port.c中找到void vPortSetupTimerInterrupt( void )其已经对Systick的实现了功能
只需要再stm32f10x_it.c中的SysTick_Handler(void)中对其调用即可
#include"task.h"
#include"FreeRTOS.h"
extern void xPortSysTickHandler();
void SysTick_Handler(void)
{
//判断系统是否运行
if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)
{
xPortSysTickHandler();
}
}
三、Systick文件的修改
FreeRTOS系统时钟由滴答定时器提供,所以要根据FreeRTOS的节拍来初始化滴答定时器,
configTICK_RATE_HZ这个宏定义就是RTOs的时钟节拍频率,可以自由设置,然后进行初始化
滴答定时器的时钟频率时AHB时钟的8分频,FreeRTOS将AHB作为时钟源
void SysTick_Init(u8 SYSCLK)
{
u32 reload;
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);/
fac_us=SystemCoreClock/1000000;
reload=SystemCoreClock/1000000;
reload*=1000000/configTICK_RATE_HZ;
fac_ms=1000/configTICK_RATE_HZ;
SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;
SysTick->LOAD=reload;
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;
}
两个毫秒级延时的不同
一个涉及任务调度(调用系统级的延时),一个根据滴答定时器的节拍计算。
void delay_ms(u32 nms)
{
if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)
{
if(nms>=fac_ms) //
{
vTaskDelay(nms/fac_ms);
}
nms%=fac_ms;
}
delay_us((u32)(nms*1000)); //
}
void delay_xms(u32 nms)
{
u32 i;
for(i=0;i<nms;i++) delay_us(1000);
}