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