标签:
在FreeRTOS移植到Cortex-M3硬件平台的文章中,我们已经见过任务创建API,但那篇文章的重点在于如何移植FreeRTOS,本文将重点放在任务的创建和删除API函数上面。
任务创建和删除API函数位于文件task.c中,需要包含task.h头文件。
BaseType_txTaskCreate( TaskFunction_tpvTaskCode, const char * constpcName, unsigned shortusStackDepth, void *pvParameters, UBaseType_tuxPriority, TaskHandle_t*pvCreatedTask );
创建新的任务并加入任务就绪列表。
如果使用FreeRTOS-MPU(在官方下载包中,为Cortex-M3内核写了两个移植方案,一个是普通的FreeRTOS移植层,还有一个是FreeRTOS-MPU移植层。后者包含完整的内存保护),那么推荐使用函数xTaskCreateRestricted()来代替xTaskCreate()。在使用FreeRTOS-MPU的情况下,使用xTaskCreate()函数可以创建运行在特权模式或用户模式(见下面对函数参数uxPriority的描述)的任务。当运行在特权模式下,任务可以访问整个内存映射;当处于用户模式下,任务仅能访问自己的堆栈。无论在何种模式下,MPU都不会自动捕获堆栈溢出,因此标准的FreeRTOS堆栈溢出检测机制仍然会被用到。xTaskCreateRestricted()函数具有更大的灵活性。
如果任务成功创建并加入就绪列表函数返回pdPASS,否则函数返回错误码,具体参见projdefs.h。
/* 创建任务. */ void vTaskCode( void * pvParameters ) { for( ;; ) { /* 任务代码放在这里 */ } } /* 创建任务函数 */ void vOtherFunction( void ) { staticunsigned char ucParameterToPass; xTaskHandlexHandle; /* 创建任务,存储句柄。注:传递的参数ucParameterToPass必须和任务具有相同的生存周期, 因此这里定义为静态变量。如果它只是一个自动变量,可能不会有太长的生存周期,因为 中断和高优先级任务可能会用到它。 */ xTaskCreate( vTaskCode, "NAME", STACK_SIZE,&ucParameterToPass, tskIDLE_PRIORITY, &xHandle ); /* 使用句柄删除任务. */ if( xHandle !=NULL ) { vTaskDelete( xHandle ); } }
voidvTaskDelete( TaskHandle_t xTask );
从RTOS内核管理器中删除一个任务。任务删除后将会从就绪、阻塞、暂停和事件列表中移除。在文件FreeRTOSConfig.h中,必须定义宏INCLUDE_vTaskDelete 为1,本函数才有效。
注:被删除的任务,其在任务创建时由内核分配的存储空间,会由空闲任务释放。如果有应用程序调用xTaskDelete(),必须保证空闲任务获取一定的微控制器处理时间。任务代码自己分配的内存是不会自动释放的,因此删除任务前,应该将这些内存释放。
FreeRTOS系列第10篇---FreeRTOS任务创建和删除
标签:
原文地址:http://blog.csdn.net/zhzht19861011/article/details/50371956