• FreeRTOS学习及移植笔记之二:在IAR和STM32F103VET上移植FreeRTOS


    上一次,我们简单的测试了FreeRTOS的基于IAR EWARM v6.4和STM32F103VET6平台的Demo,对其有了一个基本认识。接下来我们开始自己移植FreeRTOS的过程。

    1、创建一个“FreeRTOSTestProject”项目文件夹,并在其下创建FreeRTOS、Libraries、Project、User文件夹。

    与无操作系统的项目一样User中存放应用文件;Project中存放项目文件;Libraries中存放STM32F1xx标准库文件。而在FreeRTOS文件夹中存放操作系统文件。

    将FreeRTOSv9.0.0FreeRTOSSource目录下的6个源文件及include文件夹复制到新建项目的FreeRTOS文件夹。

     

    将FreeRTOSv9.0.0FreeRTOSSourceportableIARARM_CM3目录下的三个文件也复制到新建项目的FreeRTOS文件夹。

     

    将FreeRTOSv9.0.0FreeRTOSSourceportableMemMang目录下的heap_4.c文件复制到新建项目的FreeRTOS文件夹。

     

    对于内存管理的几个文件的大致内容如下:

    • heap_1.c:这是所有实现中最简单的一个。一旦分配内存之后,它甚至不允许释放分配的内存。
    • heap_2.c:和heap_1不同,这个方案使用一个最佳匹配算法,它允许释放之前分配的内存块。它不会把相邻的空闲块合成一个更大的块,可能会造成内存碎片。
    • heap_3.c:简单的包装了标准库中的malloc()和free()函数,包装后的malloc()和free()函数具备线程保护。
    • heap_4.c:这个方案使用一个最佳匹配算法,但不像方案2那样。它会将相邻的空闲内存块合并成一个更大的块。
    • heap_5.c:这个方案同样实现了heap_4.c中的合并算法,并且允许堆栈跨越多个非连续的内存区。

     将FreeRTOSv9.0.0FreeRTOSDemoCORTEX_STM32F103_IAR目录下的FreeRTOSConfig.h文件复制到新建项目的FreeRTOS文件夹。

     

    至此,全部用于移植的文件准备完成。

    2、在IAR EWARM中新建workspace,再一个项目,取名为FreeRTOSTest,并添加组:

     

    并向个组中添加相应的文件。

    3、配置项目选项

    项目的属性选项配置与误操作系统时一样,需要说一下的是在Assembler中的Preprocessor标签下添加$PROJ_DIR$....Userinc路径,因为在会变文件中有对FreeRTOSConfig.h文件的引用。

     

    4、修改FreeRTOSConfig.h 配置文件,这个根据需要修改,目前只定义如下3个宏定义,避免去修改启动文件:

    #define vPortSVCHandler         SVC_Handler

    #define xPortPendSVHandler     PendSV_Handler

    #define xPortSysTickHandler     SysTick_Handler

    如果仅作次修改,编译时会报警说重复定义,所以还需要注释掉stm32f10x_it.c文件中对三个函数的定义。

    5、编写测试应用

    在main.c文件中添加相应的代码,声明如下函数及代码(我计划4个任务):

    /***************************************************************************
    
    函数声明
    
    ***************************************************************************/
    
    static void vTask1(void *pvParameters);
    
    static void vTask2(void *pvParameters);
    
    static void vTask3(void *pvParameters);
    
    static void vTask4(void *pvParameters);
    
    static void AppTaskCreate (void);
    
    /***************************************************************************
    
    变量声明
    
    ***************************************************************************/
    
    static TaskHandle_t xHandleTask1 = NULL;
    
    static TaskHandle_t xHandleTask2 = NULL;
    
    static TaskHandle_t xHandleTask3 = NULL;
    
    static TaskHandle_t xHandleTask4 = NULL;
    
     
    
    任务创建函数如下:
    
    static void AppTaskCreate (void)
    
    {
    
      xTaskCreate( vTask1, "vTask1",512, NULL,1, &xHandleTask1);
    
      xTaskCreate( vTask2, "vTask2",512, NULL,1, &xHandleTask2);
    
      xTaskCreate( vTask3, "vTask3",512, NULL,1, &xHandleTask3);
    
      xTaskCreate( vTask4, "vTask4",512, NULL,1, &xHandleTask4);
    
    }
    
    主函数如下:
    
    int main(void)
    
    {
    
      /* 创建任务 */
    
      AppTaskCreate();
    
      /* 启动任务调度,开始执行任务 */
    
      vTaskStartScheduler();
    
    }

    编译无错误4个任务同时运行。移植初步测试成功。

  • 相关阅读:
    利用jmeter进行数据库测试
    oracle创建/删除表空间、创建/删除用户并赋予权限
    在linux环境下安装JDK并配置环境变量
    本地与在线图片转Base64及图片预览
    html标签页图标
    Eclipse启动时卡死解决方法
    Java创建目录 mkdir与mkdirs的区别
    Java 获取距离最近一段时间的时间点
    data URI
    JavaScript input file上传前获取文件名、文件类型、文件大小等信息
  • 原文地址:https://www.cnblogs.com/foxclever/p/5784326.html
Copyright © 2020-2023  润新知