Chinaunix首页 | 论坛 | 博客
  • 博客访问: 44971
  • 博文数量: 15
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 110
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-31 09:11
个人简介

每天一小步,日久一大步,将自己从2007年开始的,逐渐归类,分享。

文章分类
文章存档

2015年(14)

2014年(1)

我的朋友

分类: LINUX

2015-03-13 14:24:49

FreeRTOS属嵌入式实时操作系统,是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到STM32F103平台上运行。作为一个轻量级的操作系统,FreeRTOS提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能等,可基本满足较小系统的需要。FreeRTOS内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU总是让处于就绪态的、优先级最高的任务先运行。FreeRT0S内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU的使用时间。

STM32F103

FreeRTOS的内核可根据用户需要设置为可剥夺型内核或不可剥夺型内核。当FreeRTOS被设置为可剥夺型内核时,处于就绪态的高优先级任务能剥夺低优先级任务的CPU使用权,这样可保证系统满足实时性的要求;当FreeRTOS被设置为不可剥夺型内核时,处于就绪态的高优先级任务只有等当前运行任务主动释放CPU的使用权后才能获得运行,这样可提高CPU的运行效率。

由于FreeRTOS的这种优越性,在编写应用软件时,基于FreeRTOS进行工作开展,不仅能得到一个较好的应用软件,而且还可以大大地提高软件开发的效率及软件的可维护性。因此,我们基于HOM3103嵌入式系统移植了FreeRTOS操作系统。这里将介绍,如何基于我们已移植好的系统软件框架,开发相应的应用软件。

在这个软件框架中,一共实现了三个任务:vTSK1、vTSK2、vTSK3。在这三个任务中,分别从串口输出"Task1 "、"Task2 "、"Task3 "。代码如下所示:

/* -----------------------声明三个任务函数名----------------------------------*/

static void vTSK1( void *pvParameters );

static void vTSK2( void *pvParameters );

static void vTSK3( void *pvParameters );

//1、定义任务Handle变量

xTaskHandle T1,T2,T3;

//2、创建任务vTSK1

xReturn=xTaskCreate( vTSK1 , "vTSK1" , 120 , &pTmp2 , 2 , &T1 );

if(xReturn==pdPASS)

printf("task1 OK\r\n");  

//创建任务vTSK2

xReturn=xTaskCreate( vTSK2 , "vTSK2" , 120 , &pTmp2 , 2 , &T2 );

if(xReturn==pdPASS)

printf("task2 OK\r\n");  

//创建任务vTSK3

xReturn=xTaskCreate( vTSK3 , "vTSK3" , 120 , &pTmp2 , 2 , &T3 );

if(xReturn==pdPASS)

printf("task3 OK\r\n");  

vTaskStartScheduler(); //3、启动已成功创建的任务

//三个任务的实现过程

static void vTSK1( void *pvParameters )

{

while(1)

    {

printf("Task1 ");

           vTaskDelay(300);//如是死循环的任务,必需加入该语句,参数>0即可。

    }

}

static void vTSK2( void *pvParameters )

{

while(1)

    {

printf("Task2 ");

           vTaskDelay(700);

    }

}

static void vTSK3( void *pvParameters )

{

while(1)

    {

printf("Task3 ");

           vTaskDelay(3000);

    }

}

创建任务的基本流程说明:

1、 创建任务:

xReturn=xTaskCreate( vTSK1 , "vTSK1" , 120 , &pTmp2 , 2 , &T1 );

vTSK1:创建的任务的函数名

“vTSK1”:创建任务时,所命名的任务名字以识别

120:该任务堆栈的深度

&pTmp2:建创任务的输出参数。可以为NULL

2:任务的优先级

&T1:所创建的任务的有效指针

xReturn:创建任务所返回的状态,以判断任务创建是否成功

2、启动任务:

vTaskStartScheduler();

该函数调用后,则永远不会返回。

3、完成任务实体代码,这就在正常的程序要实现的功能的部份代码:

static void vTSK1( void *pvParameters )

{

    while(1)

    {

           printf("Task1 ");

           vTaskDelay(300);

    }

}

经上速三步,基本任务即创建并启动,如要创建设更多的任务,可按这个格式进行创建。在提供的测试工程例子中,应用程序的基本运行流程如下:

l 系统运行参数启始化

l 系统信息log输出

l 创建任务vTSK1

l 创建任务vTSK2

l 创建任务vTSK3

l 启动任务

注:如需要删除已创建的任务,则调用vTaskDelete()函数即可,如要删除任务vTSK1,则:

vTaskDelete( &T1 );

如不同任务间可能存在参数的传递,或一个任务可能接收其它多个任务的参数传入等,就需要使用队列消息来实现这种功能。

阅读(4547) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~