【FreeRTOS操作系统教程】第5章 FreeRTOS操作系统移植(MDK版)(下)

标签:
fatfsfreertosstemwinstm32usb |
分类: FreeRTOS |
第5章 FreeRTOS操作系统移植(MDK版)(下)
本章教程将为大家介绍基于MDK的FreeRTOS操作系统移植。移植工作比较简单,只需要用户添加需要的源码文件,不需要做任何的底层工作,再添加三个宏定义即可。
本章教程含Cortex-M3内核的STM32F103的移植和Cortex-M4内核的STM32F407以及F429的移植。
5.1
5.2
5.3
5.4
5.5
5.4 STM32F429移植FreeRTOS系统
5.4.1 FreeRTOS操作系统移植
首先准备好一个简单的裸机工程模板,工程模板的制作就不做讲解了,这里的重点是教大家移植FreeRTOS系统。准备好的工程模板如下图5.3所示(大家也可以制作其它任意的工程模板,不限制):
图5.3
准备好工程模板后,就可以开始移植了。首先要做的就是将所有需要的源码文件放到工程模板里面。下面分六步和大家进行说明,当然,不限制必须使用下面的方法添加源码到工程,只要将需要的文件添加到工程模板即可。
u
FreeRTOSV8.2.3.zip和FreeRTOSV8.2.3.exe内容是一样的,只是后缀为exe的压缩率更高些。下载后解压出来。
u
u
l
复制到刚刚创建的FreeRTOS文件夹下。
l
文件FreeRTOSConfig.h文件在FreeRTOSV8.2.3软件包中的中的路径:
FreeRTOSV8.2.3\ FreeRTOS\Demo\CORTEX_M4F_STM32F407ZG-SK,其实就是官方整理好的配置文件(官方没有F429的例子,使用F407的即可,配置是相同的)。
u
添加后的效果如下:
其中heap_4.c文件路径:FreeRTOS\ Source\portable\MemMang
port.c和portmacro.h文件的路径:FreeRTOS\ Source\portable\RVDS\ARM_CM4F,由于STM32F429是M4内核的,所以移植文件也要添加M4内核的。
u
这样做的好处是引用头文件的时候,只添加这个头文件就可以了。includes.h文件放在了User文件夹中。然后再将这个文件也添加到MDK工程项目中(将.h文件添加到工程的好处是方便查看和修改)
Includes.h文件中的内容如下:
#ifndef
#define
#include
#include
#include
#include
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "croutine.h"
#include
#endif
u
u
l
l
修改后在这个文件的末尾加上Systick,PendSV和SVC中断函数的宏定义,目的是将FreeRTOS移植文件port.c文件里面的中断服务程序映射到CMSIS定义的标准名称,这样就不需要用户去修改工程启动代码中这几个中断的名字了,很方便就实现了两个函数的统一。(移植过uCOS-II或者III的用户,对于这个问题估计深有体会,因为uCOS要修改启动文件,其实采用这里的方式更方便)
#define
vPortSVCHandler
#define
xPortPendSVHandler
#define xPortSysTickHandler SysTick_Handler
其中vPortSVCHandler,xPortPendSVHandler和xPortSysTickHandler是在port.c文件里面定义的。SVC_Handler,PendSV_Handler和SysTick_Handler在startup_stm32f10x_hd.s文件里面进行了定义。
下面是FreeRTOSConfig.h配置文件的完整内容:
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H
#define
configUSE_PREEMPTION
#define
configUSE_IDLE_HOOK
#define
configUSE_TICK_HOOK
#define
configCPU_CLOCK_HZ
#define
configTICK_RATE_HZ
#define
configMAX_PRIORITIES
#define
configMINIMAL_STACK_SIZE
#define
configTOTAL_HEAP_SIZE
#define
configMAX_TASK_NAME_LEN
#define
configUSE_TRACE_FACILITY
#define
configUSE_16_BIT_TICKS
#define
configIDLE_SHOULD_YIELD
#define
configUSE_CO_ROUTINES
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
#define
INCLUDE_vTaskPrioritySet
#define
INCLUDE_uxTaskPriorityGet
#define
INCLUDE_vTaskDelete
#define
INCLUDE_vTaskCleanUpResources
#define
INCLUDE_vTaskSuspend
#define
INCLUDE_vTaskDelayUntil
#define
INCLUDE_vTaskDelay
#ifdef __NVIC_PRIO_BITS
#else
#endif
#define
configLIBRARY_LOWEST_INTERRUPT_PRIORITY
#define
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
#define
configKERNEL_INTERRUPT_PRIORITY
#define
configMAX_SYSCALL_INTERRUPT_PRIORITY
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
#endif
至此,FreeRTOS的移植工作就完成了,剩下就是系统配置和应用了。其中系统配置,会在第7章专门进行讲解。
5.4.2 FreeRTOS操作系统应用实例
FreeRTOSConfig.h配置文件里面几个重要选项说明:
u
使能抢占式调度器
u
系统主频168MHz。
u
系统时钟节拍1KHz,即1ms。
u
定义可供用户使用的最大优先级数,如果这个定义的是5,那么用户可以使用的优先级号是0,1,2,3,4,
不包含5,对于这一点,初学者要特别的注意。
u
定义堆大小,FreeRTOS内核,用户动态内存申请,任务栈等都需要用这个空间。
---------------------------------------------------------------------------------------------------
经过上面的移植和配置之后,在main.c文件中添加如下代码,代码中简单的创建了四个用户任务:
vTaskTaskUserIF任务:接口消息处理,这里用作LED闪烁。
AppTaskLED任务 :LED闪烁。
vTaskMsgPro任务:消息处理,这里用作LED闪烁。
AppTaskStart任务:启动任务,也是最高优先级任务,这里实现LED闪烁。
#include "includes.h"
static void vTaskTaskUserIF(void *pvParameters);
static void vTaskLED(void *pvParameters);
static void vTaskMsgPro(void *pvParameters);
static void vTaskStart(void *pvParameters);
static void AppTaskCreate (void);
static TaskHandle_t xHandleTaskUserIF = NULL;
static TaskHandle_t xHandleTaskLED = NULL;
static TaskHandle_t xHandleTaskMsgPro = NULL;
static TaskHandle_t xHandleTaskStart = NULL;
int main(void)
{
}
static void vTaskTaskUserIF(void *pvParameters)
{
}
static void vTaskLED(void *pvParameters)
{
}
static void vTaskMsgPro(void *pvParameters)
{
}
static void vTaskStart(void *pvParameters)
{
}
static void AppTaskCreate (void)
{
}
除了创建的4个用户任务以外,还有空闲任务,这个任务是系统创建的。至此,FreeRTOS的工程就可以运行了,可以看到4个LED在闪烁。
5.5 总结
本章节为大家讲解了FreeRTOS的移植方法,移植比较简单。另一个重要内容是系统文件配置,在教程的第7章会为大家详细讲解这一部分。