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

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

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

3.在IAR中建立FreeRTOS的文件域,FreeRTOS文件域下建立src和inc.

4.添加FreeRTOS文件:

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

II)在src文件域下,添加\FreeRTOS\portable\IAR\ARM_CM4F中源文件

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

完成效果图:

5.制作FreeRTOSConfig.h文件

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

把源码中,FreeRTOSV8.2.3\FreeRTOS\Demo\CORTEX_M4F_STM32F407ZG-SK中的FreeRTOSConfig.h复制到 待移植的工程目录中:ACH_170727\FreeRTOS\include

将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_170727\FreeRTOS\portable\文件夹中,除了IAR 和MemMang保留,其他文件夹删除。

在\ACH_170727\FreeRTOS\portable\IAR文件夹中,除了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\r\n", 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\r\n");

}

void vTask1(void *pvParameters)

{

while (1) {

vTaskDelay(1000 / portTICK_PERIOD_MS);

GKI_Printf("vTask1\r\n");

}

}

void vTask2(void *pvParameters)

{

while (1) {

vTaskDelay(2000 / portTICK_PERIOD_MS);

GKI_Printf("vTask2\r\n");

}

}

void vTask3(void *pvParameters)

{

while (1) {

vTaskDelay(3000 / portTICK_PERIOD_MS);

GKI_Printf("vTask3\r\n");

}

}

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

最新文章

  1. .NET跨平台之旅:数据库连接字符串写法引发的问题
  2. The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files.
  3. csuoj 1337: 搞笑版费马大定理
  4. 为什么接口要规定成员变量必须是public static final的呢?(转)
  5. a、b交换与比较
  6. JVM内存结构——运行时数据区
  7. hibernate中的SessionFactory,Session分别表示什么啊?如何理解?
  8. windows ping RPi 2B
  9. poj 1681 Painter&#39;s Problem
  10. Spring中ref local与ref bean区别
  11. Uva 225 Golygons
  12. java--局部类只能访问外包方法的final局部成员
  13. HDU 1728 逃离迷宫(DFS||BFS)
  14. Count on the path
  15. redis搭建主从复用-读写分离
  16. 移植QT库的问题:QT_INSTALL/include/QtCore/qatomic_arm.h:131: Error: no such instruction: `swpb %al,
  17. list tuple
  18. HDU 5025 Saving Tang Monk
  19. php学习之mysqli的面向对象
  20. Xtreme9.0 - Mr. Pippo&#39;s Pizza 数学

热门文章

  1. java-项目中无法访问js、css等静态资源
  2. 嵌入式C语言预处理使用
  3. Rabbit MQ
  4. linux下tomcat启动慢解决方法
  5. httpd日志格式
  6. 微软MSDN原版Windows Server 2008 R2 With SP1下载
  7. 使用VISIO远程服务器上的ORACLE数据库,反向生成数据库实体关系图
  8. How do I improve my English speaking skills in a very short time?
  9. awk 正则匹配指定字段次数统计
  10. 学习MeteoInfo二次开发教程(十二)