基于IAR平台FreeRTOS移植

   开始这篇文章之前先简单说明一下,我使用的MCU是我们公司自主研发的ACH1180芯片,和STM32差不多,都是Cortex-M4的核,所以移植的过程参考了STM32移植的步骤。

1.解压FreeRTOSV8.2.3到本地目录(FreeRTOS的源码在官网上有,目前是9.0.0版本,据说8版本稳定,但未做考证)

2.FreeRTOSV8.2.3FreeRTOS中的Source文件夹复制到待移植的代码工程中,并且重新命名为“FreeRTOS

 

3.IAR中建立FreeRTOS的文件域,FreeRTOS文件域下建立srcinc.

  

4.添加FreeRTOS文件: 

 I)src文件域下,添加FreeRTOS文件夹中源文件

 

 II)src文件域下,添加FreeRTOSportableIARARM_CM4F中源文件

 

 III)src文件域下,添加FreeRTOS/portable/MemMang下的源文件 

 

完成效果图:

 

  

5.制作FreeRTOSConfig.h文件 

    由于ACH的核和STM32F4XX系列的核都是ARM CM4F的核,所以可以参考STM32F4XXFreeRTOSConfig.h的文档. 

把源码中,FreeRTOSV8.2.3FreeRTOSDemoCORTEX_M4F_STM32F407ZG-SK中的FreeRTOSConfig.h复制到 待移植的工程目录中:ACH_170727FreeRTOSinclude

FreeRTOSConfig.h添加到IAR工程中,FreeRTOS  inc文件域下。(这步仅仅为了编辑代码方便) 

将待修改FreeRTOSConfig信息: 

#define configUSE_IDLE_HOOK 1 

#define configUSE_TICK_HOOK 1 

#define configCHECK_FOR_STACK_OVERFLOW 2 

#define configUSE_MALLOC_FAILED_HOOK     1 

修改为: 

#define configUSE_IDLE_HOOK 0 

#define configUSE_TICK_HOOK 0 

#define configCHECK_FOR_STACK_OVERFLOW 0 

#define configUSE_MALLOC_FAILED_HOOK     0

以下为ACH订制修改方案: 

将:#define configMAX_PRIORITIES ( 5 ) 

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

修改为: 

  #define configMAX_PRIORITIES (12) 

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

6.添加编译路径 

I)添加C文件编译路径 

  

II)添加汇编文件编译路径 

  

完成以上步骤,可以编译了,若编译没有错误,表示FreeRTOSconfig文件修改正确。 

7.删除FreeRTOS中多余的库文件。

     ACH_170727FreeRTOSportable文件夹中,除了IAR MemMang保留,其他文件夹删除。 

 

  

ACH_170727FreeRTOSportableIAR文件夹中,除了ARM_CM4F保留,其他文件夹删除。 

 

8.引入系统时钟 

GKI_SetSystemCoreClock函数中,把sulSystemClcok变量复制给SystemCoreClcok

 

9.编写测试代码。 

测试代码如下: 

/* Scheduler includes. */ 

#include <stdio.h> 

#include "FreeRTOS.h" 

#include "task.h" 

#include "queue.h" 

#include "semphr.h" 

#define TASK1_PRIORITY  2 

#define TASK2_PRIORITY  3 

#define TASK3_PRIORITY  4 

void vTask1( void *pvParameters ); 

void vTask2( void *pvParameters ); 

void vTask3( void *pvParameters ); 

void FreeRTOS_test(void) 

{

     printf("portTICK_PERIOD_MS = %d ", portTICK_PERIOD_MS); 

    xTaskCreate( vTask1, "Task1", 512, NULL, TASK1_PRIORITY, NULL );

    xTaskCreate( vTask2, "Task2", 512, NULL, TASK2_PRIORITY, NULL ); 

    xTaskCreate( vTask3, "Task3", 512, NULL, TASK3_PRIORITY, NULL ); 

    vTaskStartScheduler(); 

    GKI_Printf("FreeRTOS Failed "); 

void vTask1(void *pvParameters)

    while (1) { 

        vTaskDelay(1000 / portTICK_PERIOD_MS);

         GKI_Printf("vTask1 ");

    } 

}

  

void vTask2(void *pvParameters)

    while (1) { 

        vTaskDelay(2000 / portTICK_PERIOD_MS); 

        GKI_Printf("vTask2 "); 

    } 

}

 void vTask3(void *pvParameters)

{

     while (1) { 

        vTaskDelay(3000 / portTICK_PERIOD_MS); 

        GKI_Printf("vTask3 ");

    }

Uart0端可以看到vTask1 vTask2 vTask3 在指定的时间片上打印,表示FreeRTOS移植成功。

 

原文地址:https://www.cnblogs.com/mfc1207/p/8616185.html