基于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移植成功。
基于IAR平台FreeRTOS移植的更多相关文章
- nRF52832 SDK15.3.0 基于ble_app_uart demo FreeRTOS移植
参考资料:https://blog.csdn.net/u010860832/article/details/86235993 这里把移植经验记录下来,供有需要的同学参考,有不对的地方也请大家批评指正. ...
- 在IAR平台建立STC8ASK64S4A12单片机工程
转载:http://www.51hei.com/bbs/forum.php?mod=viewthread&tid=168481&page=1#pid737250 一般我们使用STC单 ...
- 基于335X平台的UBOOT中交换芯片驱动移植
基于335X平台的UBOOT中交换芯片驱动移植 一.软硬件平台资料 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.UBOOT版本:U-Boot-2016.05,采用FDT和DM. 3 ...
- 基于IAR和STM32的uCOS-II移植
网上基于MDK的移植数不胜数,但是基于IAR的移植几乎没有,因为官方的例程就是基于IAR的,所以移植起来很简单,没人介绍,但还是得小心谨慎,一不小心就出错,对于新手来说,查找错误可不是那么容易的.IA ...
- 基于Linux平台的libpcap源码分析和优化
目录 1..... libpcap简介... 1 2..... libpcap捕包过程... 2 2.1 数据包基本捕包流程... 2 2.2 libpcap捕包过程... ...
- 一个基于.NET平台的自动化/压力测试系统设计简述
AutoTest系统设计概述 AutoTest是一个基于.NET平台实现的自动化/压力测试的系统,可独立运行于windows平台下,支持分布式部署,不需要其他配置或编译器的支持.(本质是一个基于协议的 ...
- 基于Zynq平台的EtherCAT主站方案实现
作者:陈秋苑 谢晓锋 陈海焕 广州虹科电子科技有限公司 摘 要:EtherCAT 是开放的实时以太网通讯协议,由德国倍福自动化有限公司研发.EtherCAT 具有高性能.低成本.容易使用等特点,目前在 ...
- 基于STM32的uCGUI移植和优化
基于STM32的uCGUI移植和优化 首先在开始这个说明之前,要简要说明下具体的环境: 编译工具:MDK4.20 开发板:安富莱v2版开发板 调试器:JLink v8盗版 移植篇 相信大家有移植经验 ...
- 基于Linux的kfifo移植到STM32(支持os的互斥访问)
基于Linux的kfifo移植到STM32(支持os的互斥访问) 关于kfifo kfifo是内核里面的一个First In First Out数据结构,它采用环形循环队列的数据结构来实现:它提供一个 ...
随机推荐
- shibie
var mStream: TMemoryStream; vcode: ..] of AnsiChar; buffer: array of AnsiChar; begin mStream := TMem ...
- Python开发工程师技术手记
Python基础篇 PythonPEP8规范 Python历史与安装 Python注释 Python变量以及类型 Python标识符和关键字 Python输出 Python输入 Python运算符 P ...
- 屏蔽F12审查元素,禁止使用右键菜单
一.屏蔽F12审查元素 <script type="text/javascript"> document.onkeydown = function() { ) { al ...
- C# 6.0:String Interpolation
在开发中经常需要对字符串进行格式化处理.我们一般使用String.Format()方法,它会将指定字符串中的每个格式项替换为相应对象的值的文本等效项.虽然这很普通,但有时会容易使人迷惑并造成错误.因为 ...
- sklearn错误
1.No module named 'sklearn.cross_validation' sklearn.cross_validation会报错,关键在于新版本的sklearn没有cross_vali ...
- hive 中间会话临时文件自动清理脚本
hive在运行过程中,我们经常会发现 hdfs /tmp/hive/hive or hdfs 目录占用空间巨大,我这里已经清理过了所以,相对较小.但是初次使用hive的用户,一定会发现 随着时间的推移 ...
- 复习python(条件判断、循环、字符串格式化)
1.条件判断: 只有一种 if: *** elif:#多个条件加elif,想加几个加几个 **** else: **** python里靠缩进来表示表示语句块,见到冒号,下行就要缩进 2.循环 两种, ...
- C语言数据结构基础学习笔记——树
树是一种一对多的逻辑结构,树的子树之间没有关系. 度:结点拥有的子树数量. 树的度:树中所有结点的度的最大值. 结点的深度:从根开始,自顶向下计数. 结点的高度:从叶结点开始,自底向上计数. 树的性质 ...
- (转)SQLServer_十步优化SQL Server中的数据访问四
原文地址:http://tech.it168.com/a2009/1125/814/000000814758_all.shtml 第八步:使用SQL事件探查器和性能监控工具有效地诊断性能问题 在SQL ...
- 贝叶斯、朴素贝叶斯及调用spark官网 mllib NavieBayes示例
贝叶斯法则 机器学习的任务:在给定训练数据A时,确定假设空间B中的最佳假设. 最佳假设:一种方法是把它定义为在给定数据A以及B中不同假设的先验概率的有关知识下的最可能假设 贝叶斯理论提供了 ...