FreeRTOS API学习

xTaskCreate() 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调用,增强可读性,可通过定义常量config_MAX_TASK_NAME_LEN来定义任务的最大长度(包括‘\0’结束符,如果超过,会被截断)

usStackDepth  当任务创建时,内核会为每个任务分配属于自己的唯一状态,用于告诉内核该为它分配多大的栈空间,注意,这个值是以字(word)为单位的,比如32位宽的栈空间,传入100,则为400bytes的栈空间。栈的深度乘以栈宽度的结果千万不能超过一个size_t类型变量所能表达的最大值,应用程序通过定义常量configMINIMAL_STACK_SIZE来决定空闲任务的栈空间大小。所有任务的栈空间的大小都应该比这个值大。

pvParamters   任务函数接收一个指向void的指针(void*)。

uxPriority    指定任务的优先级,取值范围可以从0到最高优先级(configMAX_PRIORITIES – 1)

pxCreatedTask 用于传出任务的句柄,给与其他API对该任务进行引用,如改变优先级,删除任务等,如果应用程序中不会用到这个任务的句柄,可以传入NULL

返回值        pdTRUE 创建成功  errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY内存堆空间不足

例子:

void vTask1( void *pvParameters )
{
const char *pcTaskName = "Task 1 is running\r\n";
volatile unsigned long ul;
    /* 和大多数任务一样,该任务处于一个死循环中。 */
    for( ;; )
    {
        /* Print out the name of this task. */
        vPrintString( pcTaskName );
        /* 延迟,以产生一个周期 */
        for( ul = 0; ul < mainDELAY_LOOP_COUNT; ul++ )
            {
                /* 这个空循环是最原始的延迟实现方式。在循环中不做任何事情。后面的示例程序将采用
                delay/sleep函数代替这个原始空循环。 */
            }
     }
}
void vTask2( void *pvParameters )
{
const char *pcTaskName = "Task 2 is running\r\n";
volatile unsigned long ul;
    /* 和大多数任务一样,该任务处于一个死循环中。 */
    for( ;; )
    {
        /* Print out the name of this task. */
        vPrintString( pcTaskName );
        /* 延迟,以产生一个周期 */
        for( ul = 0; ul < mainDELAY_LOOP_COUNT; ul++ )
        {
            /* 这个空循环是最原始的延迟实现方式。在循环中不做任何事情。后面的示例程序将采用
            delay/sleep函数代替这个原始空循环。 */
        }
    }
}
int main( void )
{
    /* 创建第一个任务。需要说明的是一个实用的应用程序中应当检测函数xTaskCreate()的返回值,以确保任
    务创建成功。 */
    xTaskCreate( vTask1, /* 指向任务函数的指针 */
                "Task 1", /* 任务的文本名字,只会在调试中用到 */
                 1000, /* 栈深度 – 大多数小型微控制器会使用的值会比此值小得多 */
                 NULL, /* 没有任务参数 */
                 1, /* 此任务运行在优先级1上. */
                 NULL ); /* 不会用到任务句柄 */
    /* Create the other task in exactly the same way and at the same priority. */
    xTaskCreate( vTask2, "Task 2", 1000, NULL, 1, NULL );
    /* 启动调度器,任务开始执行 */
    vTaskStartScheduler();
    /* 如果一切正常,main()函数不应该会执行到这里。但如果执行到这里,很可能是内存堆空间不足导致空闲
    任务无法创建。第五章有讲述更多关于内存管理方面的信息 */
    for( ;; );
}

 

你可能感兴趣的:(FreeRTOS)