java系统找不到指定文件怎么解决
393
2022-10-23
FreeRTOS任务控制API函数介绍
1. 相对延时
1.1 函数描述
vTaskDelay()指定的延时时间是从调用vTaskDelay()后开始计算的相对时间。比如vTaskDelay(100),那么从调用vTaskDelay()后,任务进入阻塞状态,经过100个系统时钟节拍周期,任务解除阻塞。因此,vTaskDelay()并不适用与周期性执行任务的场合。此外,其它任务和中断活动,会影响到vTaskDelay()的调用(比如调用前高优先级任务抢占了当前任务),因此会影响任务下一次执行的时间。API函数vTaskDelayUntil()可用于固定频率的延时,它用来延时一个绝对时间。
1.2 参数描述
xTicksToDelay:延时时间总数,单位是系统时钟节拍周期。
1.3 用法举例
2. 绝对延时
2.1 函数描述
void vTaskDelayUntil( TickType_t *pxPreviousWakeTime,const TickType_txTimeIncrement ); 任务延时一个指定的时间。周期性任务可以使用此函数,以确保一个恒定的频率执行。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskDelayUntil 必须设置成1,此函数才有效。
这个函数不同于vTaskDelay()函数的一个重要之处在于:vTaskDelay()指定的延时时间是从调用vTaskDelay()之后(执行完该函数)开始算起的,但是vTaskDelayUntil()指定的延时时间是一个绝对时间。 调用vTaskDelay()函数后,任务会进入阻塞状态,持续时间由vTaskDelay()函数的参数指定,单位是系统节拍时钟周期。因此vTaskDelay()并不适用于周期性执行任务的场合。因为调用vTaskDelay()到任务解除阻塞的时间不总是固定的并且该任务下一次调用vTaskDelay()函数的时间也不总是固定的(两次执行同一任务的时间间隔本身就不固定,中断或高优先级任务抢占也可能会改变每一次执行时间)。
2.2 参数描述
pxPreviousWakeTime:指针,指向一个变量,该变量保存任务最后一次解除阻塞的时间。第一次使用前,该变量必须初始化为当前时间。之后这个变量会在vTaskDelayUntil()函数内自动更新。 xTimeIncrement:周期循环时间。当时间等于(*pxPreviousWakeTime + xTimeIncrement)时,任务解除阻塞。如果不改变参数xTimeIncrement的值,调用该函数的任务会按照固定频率执行。
2.3 用法举例
每10次系统节拍执行一次
void vTaskFunction( void * pvParameters ) { static portTickType xLastWakeTime; const portTickType xFrequency = 10; // 使用当前时间初始化变量xLastWakeTime xLastWakeTime = xTaskGetTickCount(); for( ;; ) { //等待下一个周期 vTaskDelayUntil( &xLastWakeTime,xFrequency ); // 需要周期性执行代码放在这里 } }
3. 获取任务优先级
3.1 函数描述
UBaseType_t uxTaskPriorityGet(TaskHandle_t xTask ); 获取指定任务的优先级。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskPriorityGet必须设置成1,此函数才有效。
3.2 参数描述
xTask:任务句柄。NULL表示获取当前任务的优先级。
3.3 返回值
返回指定任务的优先级。
3.4 用法举例
voidvAFunction( void ) { xTaskHandlexHandle; // 创建任务,保存任务句柄 xTaskCreate( vTaskCode, “NAME”,STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); // 。。.
// 使用句柄获取创建的任务的优先级 if( uxTaskPriorityGet( xHandle ) !=tskIDLE_PRIORITY ) { // 任务可以改变自己的优先级 } // // 当前任务优先级比创建的任务优先级高? if( uxTaskPriorityGet( xHandle ) 《uxTaskPriorityGet( NULL ) ) { // 当前优先级较高 } }
4. 设置任务优先级
4.1 函数描述
void vTaskPrioritySet( TaskHandle_txTask,UBaseType_tuxNewPriority ); 设置指定任务的优先级。如果设置的优先级高于当前运行的任务,在函数返回前会进行一次上下文切换。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskPrioritySet 必须设置成1,此函数才有效。
4.2 参数描述
xTask:要设置优先级任务的句柄,为NULL表示设置当前运行的任务。 uxNewPriority:要设置的新优先级。
4.3 用法举例
voidvAFunction( void ) { xTaskHandlexHandle; // 创建任务,保存任务句柄。 xTaskCreate( vTaskCode, “NAME”,STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
// // 使用句柄来提高创建任务的优先级 vTaskPrioritySet( xHandle,tskIDLE_PRIORITY + 1 ); // // 使用NULL参数来提高当前任务的优先级,设置成和创建的任务相同。 vTaskPrioritySet( NULL, tskIDLE_PRIORITY +1 ); }
5. 任务挂起
5.1 函数描述
void vTaskSuspend( TaskHandle_txTaskToSuspend ); 挂起指定任务。被挂起的任务绝不会得到处理器时间,不管该任务具有什么优先级。 调用vTaskSuspend函数是不会累计的:即使多次调用vTaskSuspend ()函数将一个任务挂起,也只需调用一次vTaskResume ()函数就能使挂起的任务解除挂起状态。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskSuspend必须设置成1,此函数才有效。
5.2 参数描述
xTaskToSuspend:要挂起的任务句柄。为NULL表示挂起当前任务。
5.3 用法举例
voidvAFunction( void ) { xTaskHandlexHandle; // 创建任务,保存任务句柄。 xTaskCreate( vTaskCode, “NAME”,STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); // // 使用句柄挂起创建的任务。 vTaskSuspend( xHandle ); // // 任务不再运行,除非其它任务调用了vTaskResume(xHandle ) // // 挂起本任务。 vTaskSuspend( NULL ); // 除非另一个任务使用handle调用了vTaskResume,否则永远不会执行到这里 }
6. 恢复挂起的任务
6.1 函数描述
void vTaskResume( TaskHandle_txTaskToResume ); 恢复挂起的任务。 通过调用一次或多次vTaskSuspend()挂起的任务,可以调用一次vTaskResume ()函数来再次恢复运行。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskSuspend必须置1,此函数才有效。
6.2 参数描述
xTaskToResume:要恢复运行的任务句柄。
6.3 用法举例
voidvAFunction( void ) { xTaskHandle xHandle; // 创建任务,保存任务句柄 xTaskCreate( vTaskCode, “NAME”,STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); // // 使用句柄挂起创建的任务 vTaskSuspend( xHandle ); // //任务不再运行,除非其它任务调用了vTaskResume(xHandle ) // // 恢复挂起的任务。 vTaskResume( xHandle ); // 任务再一次得到处理器时间 // 任务优先级与之前相同 }
7. 恢复挂起的任务(在中断服务函数中使用)
7.1 函数描述
BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume );
用于恢复一个挂起的任务,用在ISR中。 通过调用一次或多次vTaskSuspend()函数而挂起的任务,只需调用一次xTaskResumeFromISR()函数即可恢复运行。 xTaskResumeFromISR()不可用于任务和中断间的同步,如果中断恰巧在任务被挂起之前到达,这就会导致一次中断丢失(任务还没有挂起,调用xTaskResumeFromISR()函数是没有意义的,只能等下一次中断)。这种情况下,可以使用信号量作为同步机制。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskSuspend 和 INCLUDE_xTaskResumeFromISR 必须设置成1,此函数才有效。
7.2 参数描述
xTaskToResume:要恢复运行的任务句柄。
7.3 返回值
如果恢复任务后需要上下文切换返回pdTRUE,否则返回pdFALSE。由ISR确定是否需要上下文切换。
7.4 用法举例
xTaskHandlexHandle; //注意这是一个全局变量 void vAFunction( void ){ // 创建任务并保存任务句柄 xTaskCreate( vTaskCode, “NAME”,STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); // 剩余代码。 } void vTaskCode( void *pvParameters ){ for( ;; ) { // 在这里执行一些其它功能 // 挂起自己 vTaskSuspend( NULL ); //直到ISR恢复它之前,任务会一直挂起 } }
void vAnExampleISR( void ){ portBASE_TYPExYieldRequired; // 恢复被挂起的任务 xYieldRequired = xTaskResumeFromISR(xHandle ); if( xYieldRequired == pdTRUE ) { // 我们应该进行一次上下文切换 // 注: 如何做取决于你具体使用,可查看说明文档和例程 portYIELD_FROM_ISR(); } }
原文标题:FreeRTOS系列第11篇---FreeRTOS任务控制
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~