开始这篇文章之前先简单说明一下,我使用的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移植成功。

基于IAR平台FreeRTOS移植的更多相关文章

  1. nRF52832 SDK15.3.0 基于ble_app_uart demo FreeRTOS移植

    参考资料:https://blog.csdn.net/u010860832/article/details/86235993 这里把移植经验记录下来,供有需要的同学参考,有不对的地方也请大家批评指正. ...

  2. 在IAR平台建立STC8ASK64S4A12单片机工程

    转载:http://www.51hei.com/bbs/forum.php?mod=viewthread&tid=168481&page=1#pid737250  一般我们使用STC单 ...

  3. 基于335X平台的UBOOT中交换芯片驱动移植

    基于335X平台的UBOOT中交换芯片驱动移植 一.软硬件平台资料 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.UBOOT版本:U-Boot-2016.05,采用FDT和DM. 3 ...

  4. 基于IAR和STM32的uCOS-II移植

    网上基于MDK的移植数不胜数,但是基于IAR的移植几乎没有,因为官方的例程就是基于IAR的,所以移植起来很简单,没人介绍,但还是得小心谨慎,一不小心就出错,对于新手来说,查找错误可不是那么容易的.IA ...

  5. 基于Linux平台的libpcap源码分析和优化

    目录 1..... libpcap简介... 1 2..... libpcap捕包过程... 2 2.1        数据包基本捕包流程... 2 2.2        libpcap捕包过程... ...

  6. 一个基于.NET平台的自动化/压力测试系统设计简述

    AutoTest系统设计概述 AutoTest是一个基于.NET平台实现的自动化/压力测试的系统,可独立运行于windows平台下,支持分布式部署,不需要其他配置或编译器的支持.(本质是一个基于协议的 ...

  7. 基于Zynq平台的EtherCAT主站方案实现

    作者:陈秋苑 谢晓锋 陈海焕 广州虹科电子科技有限公司 摘 要:EtherCAT 是开放的实时以太网通讯协议,由德国倍福自动化有限公司研发.EtherCAT 具有高性能.低成本.容易使用等特点,目前在 ...

  8. 基于STM32的uCGUI移植和优化

    基于STM32的uCGUI移植和优化 首先在开始这个说明之前,要简要说明下具体的环境: 编译工具:MDK4.20 开发板:安富莱v2版开发板 调试器:JLink  v8盗版 移植篇 相信大家有移植经验 ...

  9. 基于Linux的kfifo移植到STM32(支持os的互斥访问)

    基于Linux的kfifo移植到STM32(支持os的互斥访问) 关于kfifo kfifo是内核里面的一个First In First Out数据结构,它采用环形循环队列的数据结构来实现:它提供一个 ...

随机推荐

  1. 关闭防火墙,selinux,交互式设置IP的脚本

    脚本内容: #!/bin/bash # ens=$(cat /proc/net/dev | awk '{if($2>0 && NR > 2) print substr($1 ...

  2. 单例模式实例&多线程应用

    单例模式是指:对于一个类在内存中只能存在唯一一个对象,这种设计模式叫做单例设计模式. 单例设计模式的写法: 1. 设置私有(private)的构造方法. 2. 实例化一个该类的对象作为成员变量,并设置 ...

  3. 指定的经纬度是否落在多边形内 java版

    这个想法算法就是判断一个点向左的射线跟一个多边形的交叉点有几个,如果结果为奇数的话那么说明这个点落在多边形中,反之则不在. A: B: C: D: E: no1: no2: y1: y2: 以上的AB ...

  4. Linux运维宝典:最常用的150个命令汇总

    一.线上查询及帮助命令(2个) 二.文件和目录操作命令(18个) 三.查看文件及内容处理命令(21个) 四.文件压缩及解压缩命令(4个) 五.信息显示命令(11个) 六.搜索文件命令(4个) 七.用户 ...

  5. jumpservice使用465端口发送邮件

    阿里云.华为云等云服务器默认屏蔽掉了25端口后,内网服务器如何通过跳板机发送邮件到外网邮箱. 如果是可联网的阿里云机器,可以直接配置mailx使用465端口发送邮件.需要进行ssl验证配置. Cent ...

  6. Go 1.11 Module 介绍

    title: "Go 1.11 Module" date: 2018-10-26T23:50:56+08:00 draft: false --- Go 1.11 Module 介绍 ...

  7. paiza

    <?php $str1 = ('paiza'); $str2 = ('apple'); $str3 = ('letter'); function bigTower($str1, $str2, $ ...

  8. java中如何获得方法中的参数名

    在反射的时候我们可以通过class的getParameterNames()反射获得参数的名称,但是这个名称并不是参数的真实名称,而是类似于arg0,arg1等占位名称. 下面介绍一种方法获得参数真实名 ...

  9. 升级到 .NET Core 2.1

    从 .NET Core 2.0 升级到 .NET Core 2.1 最近在翻译 <Pro ASP.NET Core MVC 2>这本书,书中的示例是以 .NET Core 2.0 为基础的 ...

  10. Linq to SQL -- Union All、Union、Intersect和Top、Bottom和Paging和SqlMethods

    Union All/Union/Intersect操作 适用场景:对两个集合的处理,例如追加.合并.取相同项.相交项等等. Concat(连接) 说明:连接不同的集合,不会自动过滤相同项:延迟. 1. ...