加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2016-08-13 16:04:45)
标签:

fatfs

freertos

stemwin

stm32

usb

分类: FreeRTOS

第6章        FreeRTOS操作系统移植(IAR版)(下)

本章教程为大家介绍基于IARFreeRTOS操作系统移植,移植工作比较简单,只需要用户添加需要的源码文件,不需要做任何的底层工作,再添加三个宏定义即可。

本章教程包含Cortex-M3内核的STM32F103的移植和Cortex-M4内核的STM32F407以及F429的移植。

6.1   移植前准备工作说明

6.2   STM32F103移植FreeRTOS系统

6.3   STM32F407移植FreeRTOS系统

6.4   STM32F429移植FreeRTOS系统

6.5    总结


6.4  STM32F429移植FreeRTOS系统

6.4.1     FreeRTOS操作系统移植

首先准备好一个简单的裸机工程模板,工程模板的制作就不做讲解了,这里的重点是教大家移植FreeRTOS系统。准备好的工程模板如下图6.3所示(大家也可以制作其它任意的工程模板,不限制):

 

【FreeRTOS操作系统教程】第6章 <wbr>FreeRTOS操作系统移植(IAR版)(下)

6.3 工程模板

准备好工程模板后,就可以开始移植了。首先要做的就是将所有需要的源码文件放到工程模板里面。下面分六步给大家进行说明,当然,不限制必须使用下面的方法添加源码到工程,只要将需要的文件添加到工程模板即可。

u  1步:从网址https://sourceforge.net/projects/freertos/files/FreeRTOS/V8.2.3/ 下载V8.2.3版本,这个是8.X系列里面最高版本了,9.0版本还处于测试阶段,我们暂不使用。

【FreeRTOS操作系统教程】第6章 <wbr>FreeRTOS操作系统移植(IAR版)(下)

 

FreeRTOSV8.2.3.zipFreeRTOSV8.2.3.exe内容是一样的,只是后缀为exe的压缩率更高些。下载后解压出来。

u  2步:在工程模板创建FreeRTOS文件夹

【FreeRTOS操作系统教程】第6章 <wbr>FreeRTOS操作系统移植(IAR版)(下)

 

u  3步:添加源码文件到相应文件夹

l  FreeRTOSV8.2.3软件包中路径:FreeRTOSV8.2.3\FreeRTOS\Source里面如下所有文件

【FreeRTOS操作系统教程】第6章 <wbr>FreeRTOS操作系统移植(IAR版)(下)

 

复制到刚刚创建的FreeRTOS文件夹下。

l  文件夹User中还需要添加如下文件:

【FreeRTOS操作系统教程】第6章 <wbr>FreeRTOS操作系统移植(IAR版)(下)

 

文件FreeRTOSConfig.h文件FreeRTOSV8.2.3软件包中的中的路径:

FreeRTOSV8.2.3\ FreeRTOS\Demo\CORTEX_M4F_STM32F407ZG-SK,其实就是官方整理好的配置文件(官方没有F429的例子,使用F407的即可,配置是相同的)。

u  3步:将源码文件添加到IAR的工程项目中,添加后的效果如下:

【FreeRTOS操作系统教程】第6章 <wbr>FreeRTOS操作系统移植(IAR版)(下)

 

其中heap_4.c文件路径:FreeRTOS\ Source\portable\MemMang

port.cportasm.hportmacro.h文件的路径:FreeRTOS\ Source\portable\RVDS\ARM_CM4F,由于STM32F429M4内核的,所以移植文件也要添加M4内核的。

u  4步:新创建一个includes.h文件,将所有的头文件都集中到这个头文件下。

这样做的好处是引用头文件的时候,只添加这个头文件就可以了。includes.h文件放在了User文件夹中。然后再将这个文件也添加到MDK工程项目中(.h文件添加到工程的好处是方便查看和修改)

【FreeRTOS操作系统教程】第6章 <wbr>FreeRTOS操作系统移植(IAR版)(下)

 

Includes.h文件中的内容如下:

 

#ifndef  __INCLUDES_H__

#define  __INCLUDES_H__

 

 

#include  

#include  

#include  

#include  

 

 

 

 

 

 

#include "FreeRTOS.h"

#include "task.h"

#include "queue.h"

#include "croutine.h"

 

 

 

 

 

 

 

#include  

 

 

#endif

 

 

u  5步:添加相应的头文件路径,在原来工程模板的基础上新添加的两个路径:

【FreeRTOS操作系统教程】第6章 <wbr>FreeRTOS操作系统移植(IAR版)(下)

 

C/C++选项中添加了路径后,Assembler汇编选项也是要添加路径的,这里的路径就是FreeRTOSConfig.h文件所在的路径,这么做是因为portasm.s汇编文件中有引用到这个文件。

【FreeRTOS操作系统教程】第6章 <wbr>FreeRTOS操作系统移植(IAR版)(下)

 

u  6步:最后一步,同时也是最重要的一步,修改FreeRTOSConfig.h配置文件(用户根据自己的配置进行修改,不修改也是没问题的,我们这里进行修改主要是为了方便初学者学习),主要修改了以下两个方面:

l  添加宏定义__NVIC_PRIO_BITSSTM32系列产品优先级仅使用4位。

l  修改优先级相关的几个宏定义,具体修改了哪个可以对比原始文件查看。

修改后在这个文件的末尾加上SystickPendSVSVC中断函数的宏定义,目的是将FreeRTOS移植文件port.c文件里面的中断服务程序映射到CMSIS定义的标准名称,这样就不需要用户去修改工程启动代码中这几个中断的名字了,很方便就实现了两个函数的统一。(移植过uCOS-II或者III的用户,对于这个问题估计深有体会,因为uCOS要修改启动文件,其实采用这里的方式更方便

 

#define vPortSVCHandler     SVC_Handler 

#define xPortPendSVHandler  PendSV_Handler

#define xPortSysTickHandler SysTick_Handler

其中vPortSVCHandlerxPortPendSVHandlerxPortSysTickHandler是在port.c文件里面定义的。SVC_HandlerPendSV_HandlerSysTick_Handlerstartup_stm32f10x_hd.s文件里面进行了定义。

下面是FreeRTOSConfig.h配置文件的完整内容:

#ifndef FREERTOS_CONFIG_H

#define FREERTOS_CONFIG_H

 

 

 

#define configUSE_PREEMPTION         1

#define configUSE_IDLE_HOOK          0

#define configUSE_TICK_HOOK          0

#define configCPU_CLOCK_HZ           ( ( unsigned long ) 168000000 ) 

#define configTICK_RATE_HZ           ( ( TickType_t ) 1000 )

#define configMAX_PRIORITIES         ( 5 )

#define configMINIMAL_STACK_SIZE      ( ( unsigned short ) 128 )

#define configTOTAL_HEAP_SIZE        ( ( size_t ) ( 30 * 1024 ) )

#define configMAX_TASK_NAME_LEN      ( 16 )

#define configUSE_TRACE_FACILITY      0

#define configUSE_16_BIT_TICKS       0

#define configIDLE_SHOULD_YIELD      1

 

 

#define configUSE_CO_ROUTINES            0

#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

 

 

 

#define INCLUDE_vTaskPrioritySet          1

#define INCLUDE_uxTaskPriorityGet         1

#define INCLUDE_vTaskDelete               1

#define INCLUDE_vTaskCleanUpResources      0

#define INCLUDE_vTaskSuspend              1

#define INCLUDE_vTaskDelayUntil           1

#define INCLUDE_vTaskDelay                1

 

 

#ifdef __NVIC_PRIO_BITS

     

     #define configPRIO_BITS              __NVIC_PRIO_BITS

#else

     #define configPRIO_BITS                     

#endif

 

 

#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY       0x0f

 

 

#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY    0x01

 

 

#define configKERNEL_INTERRUPT_PRIORITY        ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

 

#define configMAX_SYSCALL_INTERRUPT_PRIORITY   ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

    

 

#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }

    

 

#define vPortSVCHandler SVC_Handler

#define xPortPendSVHandler PendSV_Handler

#define xPortSysTickHandler SysTick_Handler

 

 

#endif

至此,FreeRTOS的移植工作就完成了,剩下就是系统配置和应用了。其中系统配置,会在第7章专门进行讲解。

6.4.2     FreeRTOS操作系统应用实例

FreeRTOSConfig.h配置文件里面几个重要选项说明:

u  #define configUSE_PREEMPTION        1

使能抢占式调度器

u  #define configCPU_CLOCK_HZ     ( ( unsigned long ) 168000000 ) 

系统主频168MHz

u  #define configTICK_RATE_HZ                     ( ( TickType_t ) 1000 )

系统时钟节拍1KHz,即1ms

u  #define configMAX_PRIORITIES          ( 5 )

定义可供用户使用的最大优先级数,如果这个定义的是5,那么用户可以使用的优先级号是0,1,2,3,4不包含5,对于这一点,初学者要特别的注意。

u  #define configTOTAL_HEAP_SIZE        ( ( size_t ) ( 30 * 1024 ) )

定义堆大小,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)

{

     

     __set_PRIMASK(1); 

    

     

     bsp_Init();

    

     

     AppTaskCreate();

    

    

    vTaskStartScheduler();

 

     

     while(1);

 

}

 

 

static void vTaskTaskUserIF(void *pvParameters)

{

    while(1)

    {

         bsp_LedToggle(1);

         vTaskDelay(100);

     }

}

 

 

static void vTaskLED(void *pvParameters)

{

    while(1)

    {

         bsp_LedToggle(2);

        vTaskDelay(200);

    }

}

 

 

static void vTaskMsgPro(void *pvParameters)

{

    while(1)

    {

        bsp_LedToggle(3);

        vTaskDelay(300);

    }

}

 

 

static void vTaskStart(void *pvParameters)

{

    while(1)

    {

         

        bsp_LedToggle(4);

        vTaskDelay(400);

    }

}

 

 

static void AppTaskCreate (void)

{

    xTaskCreate( vTaskTaskUserIF,   

                 "vTaskUserIF",     

                 512,               

                 NULL,              

                 1,                 

                 &xHandleTaskUserIF );  

    

    

     xTaskCreate( vTaskLED,           

                 "vTaskLED",         

                 512,                

                 NULL,               

                 2,                  

                 &xHandleTaskLED ); 

    

     xTaskCreate( vTaskMsgPro,            

                 "vTaskMsgPro",           

                 512,                     

                 NULL,                    

                 3,                       

                 &xHandleTaskMsgPro );  

    

    

     xTaskCreate( vTaskStart,             

                 "vTaskStart",            

                 512,                     

                 NULL,                    

                 4,                       

                 &xHandleTaskStart );   

}

 

除了创建的4个用户任务以外,还有空闲任务,这个任务是系统创建的。至此,FreeRTOS的工程就可以运行了,可以看到4LED在闪烁。

6.5  总结

本章节为大家讲解了FreeRTOS的移植方法,移植比较简单。另一个重要内容是系统配置文件,在教程的第7章会为大家详细讲解这一部分。

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有