上一次,我们简单的测试了FreeRTOS的基于IAR EWARM v6.4和STM32F103VET6平台的Demo,对其有了一个基本认识。接下来我们开始自己移植FreeRTOS的过程。

1、创建一个“FreeRTOSTestProject”项目文件夹,并在其下创建FreeRTOS、Libraries、Project、User文件夹。

与无操作系统的项目一样User中存放应用文件;Project中存放项目文件;Libraries中存放STM32F1xx标准库文件。而在FreeRTOS文件夹中存放操作系统文件。

将\FreeRTOSv9.0.0\FreeRTOS\Source目录下的6个源文件及include文件夹复制到新建项目的FreeRTOS文件夹。

将\FreeRTOSv9.0.0\FreeRTOS\Source\portable\IAR\ARM_CM3目录下的三个文件也复制到新建项目的FreeRTOS文件夹。

将FreeRTOSv9.0.0\FreeRTOS\Source\portable\MemMang目录下的heap_4.c文件复制到新建项目的FreeRTOS文件夹。

对于内存管理的几个文件的大致内容如下:

  • heap_1.c:这是所有实现中最简单的一个。一旦分配内存之后,它甚至不允许释放分配的内存。
  • heap_2.c:和heap_1不同,这个方案使用一个最佳匹配算法,它允许释放之前分配的内存块。它不会把相邻的空闲块合成一个更大的块,可能会造成内存碎片。
  • heap_3.c:简单的包装了标准库中的malloc()和free()函数,包装后的malloc()和free()函数具备线程保护。
  • heap_4.c:这个方案使用一个最佳匹配算法,但不像方案2那样。它会将相邻的空闲内存块合并成一个更大的块。
  • heap_5.c:这个方案同样实现了heap_4.c中的合并算法,并且允许堆栈跨越多个非连续的内存区。

将\FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_IAR目录下的FreeRTOSConfig.h文件复制到新建项目的FreeRTOS文件夹。

至此,全部用于移植的文件准备完成。

2、在IAR EWARM中新建workspace,再一个项目,取名为FreeRTOSTest,并添加组:

并向个组中添加相应的文件。

3、配置项目选项

项目的属性选项配置与误操作系统时一样,需要说一下的是在Assembler中的Preprocessor标签下添加$PROJ_DIR$\..\..\User\inc路径,因为在会变文件中有对FreeRTOSConfig.h文件的引用。

4、修改FreeRTOSConfig.h 配置文件,这个根据需要修改,目前只定义如下3个宏定义,避免去修改启动文件:

#define vPortSVCHandler         SVC_Handler

#define xPortPendSVHandler     PendSV_Handler

#define xPortSysTickHandler     SysTick_Handler

如果仅作次修改,编译时会报警说重复定义,所以还需要注释掉stm32f10x_it.c文件中对三个函数的定义。

5、编写测试应用

在main.c文件中添加相应的代码,声明如下函数及代码(我计划4个任务):

/***************************************************************************

函数声明

***************************************************************************/

static void vTask1(void *pvParameters);

static void vTask2(void *pvParameters);

static void vTask3(void *pvParameters);

static void vTask4(void *pvParameters);

static void AppTaskCreate (void);

/***************************************************************************

变量声明

***************************************************************************/

static TaskHandle_t xHandleTask1 = NULL;

static TaskHandle_t xHandleTask2 = NULL;

static TaskHandle_t xHandleTask3 = NULL;

static TaskHandle_t xHandleTask4 = NULL;

任务创建函数如下:

static void AppTaskCreate (void)

{

  xTaskCreate( vTask1, "vTask1",, NULL,, &xHandleTask1);

  xTaskCreate( vTask2, "vTask2",, NULL,, &xHandleTask2);

  xTaskCreate( vTask3, "vTask3",, NULL,, &xHandleTask3);

  xTaskCreate( vTask4, "vTask4",, NULL,, &xHandleTask4);

}

主函数如下:

int main(void)

{

  /* 创建任务 */

  AppTaskCreate();

  /* 启动任务调度,开始执行任务 */

  vTaskStartScheduler();

}

编译无错误4个任务同时运行。移植初步测试成功。

FreeRTOS学习及移植笔记之二:在IAR和STM32F103VET上移植FreeRTOS的更多相关文章

  1. hadoop2.5.2学习及实践笔记(二)—— 编译源代码及导入源码至eclipse

    生产环境中hadoop一般会选择64位版本,官方下载的hadoop安装包中的native库是32位的,因此运行64位版本时,需要自己编译64位的native库,并替换掉自带native库. 源码包下的 ...

  2. i2c设备驱动移植笔记(二)

    说明:上一篇博客写了我在移植android驱动之TEF6606的苦逼遭遇,即驱动层向应用层提供接口支持,查找了两天的资料,不得不放弃,转而进行IIC下移植RTC设备的实验. 第一步:查找设备的数据手册 ...

  3. C语言学习及应用笔记之二:C语言static关键字及其使用

    C语言有很多关键字,大多关键字使用起来是很明确的,但有一些关键字却要相对复杂一些.我们这里要说明的static关键字就是如此,它的功能很强大,相应的使用也就更复杂. 一般来说static关键字的常见用 ...

  4. 学习Python函数笔记之二

    ---恢复内容开始--- 1.内置函数:取绝对值函数abs() 2.内置函数:取最大值max(),取最小值min() 3.内置函数:len()是获取序列的长度 4.内置函数:divmod(x,y),返 ...

  5. 学习Python函数笔记之二(内置函数)

    ---恢复内容开始--- 1.内置函数:取绝对值函数abs() 2.内置函数:取最大值max(),取最小值min() 3.内置函数:len()是获取序列的长度 4.内置函数:divmod(x,y),返 ...

  6. 学习javscript函数笔记(二)

    定义: 函数包含一组语句,他们是JavaScript的基础模块单元,用于代码复用.信息隐藏和组合调用.函数用于指定对象的行为. 1.函数对象 JavaScript中的函数就是对象,函数对象连接到Fun ...

  7. ARM-Linux内核移植之(二)——Linux2.6.22内核移植

    平台:mini2440  交叉工具链:arm-linux-gcc-4.3.2 一.内核移植基本知识 移植内核也叫构建BSP(boardsupprot packet).BSP的作用有两个:一是为内核运行 ...

  8. hadoop2.5.2学习及实践笔记(四)—— namenode启动过程源码概览

    对namenode启动时的相关操作及相关类有一个大体了解,后续深入研究时,再对本文进行补充 >实现类 HDFS启动脚本为$HADOOP_HOME/sbin/start-dfs.sh,查看star ...

  9. FreeRTOS学习及移植笔记之一:开始FreeRTOS之旅

    1.必要的准备工作 工欲善其事,必先利其器,在开始学习和移植之前,相应的准备工作必不可少.所以在开始我们写要准备如下: 测试环境:我准备在STM32F103平台上移植和测试FreeRTOS系统 准备F ...

随机推荐

  1. golang使用yaml格式解析构建配置文件

    现在主流的配置文件格式有这么几种,xml.yaml.config…  xml就算了,太挫了,太土, 太繁琐… config 就是mysql,apache my.cnf的那种格式,这个格式适合功能分层, ...

  2. Synchronized

    1. 在编写一个类时,如果该类中的代码可能运行与多线程环境下,就要考虑同步问题了. 会同时被多个线程访问的资源,就是竞争资源,也称为竞争条件.对于多线程共享的资源我们必须进行同步,以避免一个线程的改动 ...

  3. GRE与Vxlan网络详解

    1. GRE 1.1 概念 GRE全称是Generic Routing Encapsulation,是一种协议封装的格式,具体格式内容见:https://tools.ietf.org/html/rfc ...

  4. Google调用explorer.exe打开本地文件

    给IE浏览器地址栏输个本地文件路径,会自动用explorer.exe打开,这个挺好的,但是IE对jQuery稍微高点的版本不怎么待见,只好自己给Google折腾一个调用explorer的功能----- ...

  5. Python 从零学起(纯基础) 笔记 之 迭代器、生成器和修饰器

    Python的迭代器. 生成器和修饰器 1. 迭代器是访问集合元素的一种方式,从第一个到最后,只许前进不许后退. 优点:不要求事先准备好整个迭代过程中的所有元素,仅仅在迭代到某个元素时才计算该元素,而 ...

  6. 海思h264解码库

    海思的dll,解码h264  解码后转出yuv12 dll自己百度下载  hi_h264dec.dll   hi_h264dec_w.dll   调用方法: if (H264Dec.Hi264DecA ...

  7. JVM大端判断

    JVM采用大端方式存多字节的数据,判断方法如下: public static void bytesToInt() throws IOException { /** * 将字节数组(byte[])转为整 ...

  8. java 实现文件下载

    需求:把每天产生的日志文件,从服务器上下载下来 File file = new File(path); // 根据路径,获取File String filename = file.getName(); ...

  9. 10 件有关 JavaScript 让人费解的事情

    JavaScript 可算是世界上最流行的编程语言,它曾被 Web 开发设计师贴上噩梦的标签,虽然真正的噩梦其实是 DOM API,这个被大量的开发与设计师随手拈来增强他们的 Web 前端的脚本语言, ...

  10. golang笔记——并发

    go语言中的main函数也是运行在一个单独的goroutine中的,一般称为 main goroutine,main函数结束时,会打断其它 goroutine 的执行,但是其它 goroutine 不 ...