FreeRTOS学习之创建任务xTaskCreat()
功能:创建任务
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( ;; );
}