转自: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 ) { // 任务已经改变了其优先级 } }
|
|