Freertos学习--初识任务函数
转自:http://blog.csdn.net/djjyi/article/details/6170025
Freertos泛泛看了很多相关文章,有点头绪,除了不太喜欢其变量的名字,其他的倒还可以接受。先来认识一下Freertos任务函数,看看这个系统是怎么操作任务的。(以下例子大部分来自网络)
1.任务创建
signed portBASE_TYPE xTaskCreate(
pdTASK_CODE pvTaskCode, --指向任务的入口函数
const signed portCHAR * const pcName, --任务的名字
unsigned portSHORT usStackDepth, --指定任务堆栈的大小 ,堆栈能保护变量的数目-
void *pvParameters, --指针用于作为一个参数传向创建的任务
unsigned portBASE_TYPE uxPriority, --任务的优先级
xTaskHandle *pxCreatedTask )--用于传递一个处理
例子:
xTaskCreate( StarTask , ( signed portCHAR * ) "StarTask ", 128, NULL, tskIDLE_PRIORITY, NULL );
我们先按任务创建函数设定好任务的入口名字StarTask ,任务名字StarTask ,堆栈大小128,优先级等,然后编写我们任务StarTask 的内容,下面就是任务StarTask函数:
void StarTask (void *pvParameter)
{}
2.任务删除
void vTaskDelete( xTaskHandle pxTaskToDelete )
例子:
void vOtherFunction( void )
{
xTaskHandle xHandle;
// 创建任务,存储处理
xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
// 使用处理来删除任务.
vTaskDelete( xHandle );
}
注:INCLUDE_vTaskDelete必须定义为1,这个函数才能可用
3.任务延时
void vTaskDelay( portTickType xTicksToDelay );
例子:
const portTickType xDelay = 1000/ portTICK_RATE_MS;
注:INCLUDE_vTaskDelay必须设置为1,这个函数才为可用。
4.任务延时--延时一个任务到指定时间
void vTaskDelayUntil(
portTickType *pxPreviousWakeTime, --指定一个变量来掌握任务最后开启的时间, 这个变量在第一次使用中(参考下面的例子)必须 使用当前时间来初始化
portTickType xTimeIncrement );--循环周期时间。任务将在一定时间开启 (*pxPreviousWakeTime + xTimeIncrement)
例子:
void vTaskFunction( void * pvParameters )
注:INCLUDE_vTaskDelayUntil 必须定义为1,此函数才能用。
5.获取任务优先级
unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask );
7.任务挂起或暂停
void vTaskSuspend(
xTaskHandle pxTaskToSuspend ); --处理需要挂起的任务。传递NULL将挂起调用此函数的任务。
例子:
void vAFunction( void )
{
xTaskHandle xHandle;
// 创建任务,保存句柄
xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
// ...
// 使用此句柄来挂起创建的任务
vTaskSuspend( xHandle );
// ...
// 创建的任务不会在这期间运行,除非
// 其他任务调用 vTaskResume( xHandle )
//...
// 挂起自己
vTaskSuspend( NULL );
// 不能运行到这里,除非另一个任务调用vTaskResume
}
注:设置INCLUDE_vTaskSuspend 为1,此函数才能使用。
8.任务恢复
void vTaskResume( xTaskHandle pxTaskToResume );
9.启动内核
void vTaskStartScheduler( void );
必须是调用 vTaskSuspend () 后挂起的任务,才有可能通过调用 vTaskResume ()重新运行。
例子:
注:设置INCLUDE_vTaskSuspend为1,此函数才能使用。
void vAFunction( void )
{
xTaskHandle xHandle;
// 创建任务,保存句柄
xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
// ...
// 使用此句柄来挂起创建的任务
vTaskSuspend( xHandle );
// ...
// 创建的任务不会在此期间运行,除
// 另外一个任务调用 vTaskResume( xHandle )
//...
// 唤醒自己
vTaskResume( xHandle );
}
例子:
注:设置INCLUDE_vTaskPriorityGet 为1,此函数才能用。
6.设置任务优先级
void vTaskPrioritySet(
xTaskHandle pxTask, --需要设置优先级的任务。当传递NULL,将设置调用任务的优先级
unsigned portBASE_TYPE uxNewPriority );--任务需要设置的优先级
例子:
void vAFunction( void )
{
xTaskHandle xHandle;
// 创建任务,准备处理
xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
// 使用其句柄来提高创建任务的优先级
vTaskPrioritySet( xHandle, tskIDLE_PRIORITY + 1 );
// 使用NULL处理,来提高优先级到同一个值
vTaskPrioritySet( NULL, tskIDLE_PRIORITY + 1 );
}
注:设置INCLUDE_vTaskPrioritySet为1,才能使用此函数
{
portTickType xLastWakeTime;
const portTickType xFrequency = 10;
// 使用当前时间 初始化xLastWakeTime 变量
xLastWakeTime = xTaskGetTickCount();
for( ;; )
{
// 等待下一个循环
vTaskDelayUntil( &xLastWakeTime, xFrequency );
// 执行区域
}
}
for( ;; )
{
/* 简单的每 500ms触发LED, .在每两次触发间挂起*/
vONLED();
vTaskDelay( xDelay );
}
xTicksToDelay 是指延时的时间片个数,
void vAFunction( void )
{
xTaskHandle xHandle;
// 创建任务,准备处理
xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
// / 使用 tskIDLE_PRIORITY创建, 但是可能改
if( uxTaskPriorityGet( xHandle ) != tskIDLE_PRIORITY )
{
// 任务已经改变了其优先级
}
}