每天一小步,日久一大步,将自己从2007年开始的,逐渐归类,分享。
分类: LINUX
2015-03-13 14:24:49
FreeRTOS属嵌入式实时操作系统,是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到STM32F103平台上运行。作为一个轻量级的操作系统,FreeRTOS提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能等,可基本满足较小系统的需要。FreeRTOS内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU总是让处于就绪态的、优先级最高的任务先运行。FreeRT0S内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU的使用时间。
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 );
如不同任务间可能存在参数的传递,或一个任务可能接收其它多个任务的参数传入等,就需要使用队列消息来实现这种功能。