FreeRTOS学习之创建任务xTaskCreat()

@fsw  August 19, 2020

功能:创建任务
API函数:

portBASE_TYPE xTaskCreate(pdTASK_CODE pvTaskCode, 
                        const signed portCHAR * const pcName, 
                        unsigned portSHORT usStackDepth, 
                        void *pvParameters, 
                        unsigned portBASE_TYPE uxPriority, 
                        xTaskHandle *pxCreatedTask ); 
参数名描述
pvTaskCode任务名,实现的通常是一个死循环,参数是一个指向任务实现函数的指针
pcName具有描述性的任务名,这个参数不会被FreeRTOS使用,单纯用于辅助调试
usStackDepth当创建任务时,内核会分配属于任务自己的唯一状态,usStackDepth值用于告诉内核会为它分配多大栈空间,这个值只栈空间可以保存多少个字,此值是对所有任务的最小建议值
pvParameters传递到任务中的值,没有则为NULL
uxPriority指定任务的优先级,取值范围为最低优先级0到最高优先级
pxCreatedTask传出任务的句柄,用不到则为NULL

返回值:
1、pdTURE:表明创建成功
2、 errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY :由于内存堆空间不足,FreeRTOS 无法分配足够的空间来保存任务
结构数据和任务栈,因此无法创建任务。

例1.创建任务
此例程演示如何创建一个任务,任务的功能是打印任务名

void vTask1( void *pvParameters ) 
{ 
    const char *pcTaskName = "Task 1 is running\r\n"; 
    volatile unsigned long ul; 
    /* 和大多数任务一样,该任务处于一个死循环中。 */ 
    for( ;; ) { 
        vPrintString( pcTaskName ); /*打印任务名 */ 
        for( ul = 0; ul < mainDELAY_LOOP_COUNT; ul++ ) 
        { 
             /* 延迟,以产生一个周期 */ 
        }
    } 
}

int main( void ) 
{ 
    /* 创建第一个任务。需要说明的是一个实用的应用程序中应当检测函数xTaskCreate()的返回值,以确保任 务创建成功。 */ 
    xTaskCreate(vTask1,     /* 指向任务函数的指针 */ 
                "Task 1",   /* 任务的文本名字,只会在调试中用到 */ 
                1000,       /* 栈深度 – 大多数小型微控制器会使用的值会比此值小得多 */ NULL,       /* 没有任务参数 */ 
                1,          /* 此任务运行在优先级1上. */ 
                NULL );     /* 不会用到任务句柄 */ 
            /* 如果一切正常,main()函数不应该会执行到这里。但如果执行到这里,很可能是内存堆空间不足导致空闲任务无法创建。第五章有讲述更多关于内存管理方面的信息 */ 
    for( ;; ); 
} 

例2.使用任务参数

void vTaskCode( void * pvParameters ) 
{    
    char *pcTaskName; 
    volatile unsigned long ul;
    pcTaskName = ( char * ) pvParameters;/*需要打印的字符串从入口参数传入,强制转换为字符指针*/           
    for( ;; )     
    {         
        vPrintString( pcTaskName ); 
        for( ul = 0; ul < mainDELAY_LOOP_COUNT; ul++ ) 
        { 
             /* 延迟,以产生一个周期 */ 
        }
    } 
}     

/*定义一个要传入的字符串*/
static const char *pcTextForTask1 = “Task 1 is running\r\n”; 
void main( void ) 
{    
    xTaskCreate(                                    
    vTaskFunction,                        
    "Task 1",
    1000,                      
    (void*)pcTextForTask1,     /* 通过任务参数传入需要打印输出的文本. */          
    1,     
    NULL);
    for( ;; );  
} 
阅读量:602

添加新评论