xTaskCreate

xTaskCreate

task. h

 

创建新的任务并添加到任务队列中,准备运行

 

Parameters:
pvTaskCode 指向任务的入口函数. 任务必须执行并且永不返回 (即:无限循环).
pcName 描述任务的名字。主要便于调试。最大长度由configMAX_TASK_NAME_LEN.定义
usStackDepth 指定任务堆栈的大小 ,堆栈能保护变量的数目- 不是字节数. 例如,如果堆栈为16位宽度,usStackDepth定义为 100, 200 字节,这些将分配给堆栈。堆栈嵌套深度(堆栈宽度)不能超多最大值——包含了size_t类型的变量
pvParameters 指针用于作为一个参数传向创建的任务
uxPriority 任务运行时的优先级( 0 : 优先级最低)
pvCreatedTask 用于传递一个处理——引用创建的任务
返回:
pdPASS 是如果任务成功创建并且添加到就绪列中,另外错误代码在projdefs. H文件定义

使用例子:

 

 

 

 

 
 
// 使用句柄来删除任务 vTaskDelete( xHandle ); }

 
 
// 创建任务,存储处理。注意传递的参数为ucParameterToPass //它在任务中不能始终存在, 所以定义为静态变量. 如果它是动态堆栈的变量,可能存在 // 没有那么长,或者至少随着时间毁灭, // 新的时间, 尝试存储它 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle );

 
 
// 函数来创建一个任务 void vOtherFunction( void ) { static unsigned char ucParameterToPass; xTaskHandle xHandle;

 
 
// 创建任务 void vTaskCode( void * pvParameters ) { for( ;; ) { // 任务代码 } }

 
 
portBASE_TYPE xTaskCreate( pdTASK_CODE pvTaskCode, const portCHAR * const pcName, unsigned portSHORT usStackDepth, void *pvParameters, unsigned portBASE_TYPE uxPriority, xTaskHandle *pvCreatedTask );
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
刚开始接触这个STM32Cube+FreeRTOS的时候也是遇到这个问题,这个问题的原因是没有足够的内存分配给栈空间,以下是我的分析过程: 1.出现了调度器无法调度的问题,追查调度函数osKernelStart和vTaskStartScheduler发现错误出现在以下位置: xReturn = xTaskCreate( prvIdleTask, "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), NULL ); 也就是说创建IDLE任务时失败,使得xReturn 不等于 pdPASS,那么vTaskStartScheduler代码后续的: if(xRetern == pdPass) { ...... } 就不会执行,调度器就无法工作 2.继续跟踪读IDLE任务分配的代码,一直到函数xTaskGenericCreate,发现程序在这个地方出错: pxNewTCB = prvAllocateTCBAndStack( usStackDepth, puxStackBuffer ); if(pxNewTCB != NULL) { ...... } 最后会返回内存不足的错误,如下代码: xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; traceTASK_CREATE_FAILED(); 这个地方给任务分配TCB控制块和栈的内存空间,产生了失败 3.您可以继续跟踪prvAllocateTCBAndStack函数,看看内存可用空间是怎么定义的 4.我给出的具体方法是减小栈空间字节数或者其他内存节省办法 我将原来是128的栈空间修改成了64就可以成功运行3个任务了,但是我认为随着任务的增多还是会出现这个内存不足的问题,以下是创建任务的代码,供你参考: while(NULL == defaultTaskHandle) { osThreadDef(test_task, test_task, osPriorityNormal, 1, 64);//128); defaultTaskHandle = osThreadCreate(osThread(test_task), NULL); } while(NULL == uc1recv_TaskHandle) { osThreadDef(uc1recv_task, uc1recv_task, osPriorityHigh, 1, 64);//128); uc1recv_TaskHandle = osThreadCreate(osThread(uc1recv_task), NULL); } #if 1 while(NULL == uc2recv_TaskHandle) { osThreadDef(uc2recv_task, uc2recv_task, osPriorityAboveNormal, 1, 64);//128); uc2recv_TaskHandle = osThreadCreate(osThread(uc2recv_task), NULL); } #endif osKernelStart();
#include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "timer.h" #include "FreeRTOS.h" #include "task.h" #include "debug_cmdshell.h" #include "stabilizer.h" //任务优先级 #define START_TASK_PRIO 1 //任务堆栈大小 #define START_STK_SIZE 128 //任务句柄 TaskHandle_t StartTask_Handler; //任务函数 void start_task(void *pvParameters); //任务优先级 #define TASK2_TASK_PRIO 3 //任务堆栈大小 #define TASK2_STK_SIZE 512 //任务句柄 TaskHandle_t Task2Task_Handler; //任务函数 void task2_task(void *pvParameters); int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4 delay_init(); //延时函数初始化 uart_init(115200); //初始化串口 LED_Init(); //初始化LED stabilizerInit(); //创建开始任务 xTaskCreate((TaskFunction_t )start_task, //任务函数 (const char* )"start_task", //任务名称 (uint16_t )START_STK_SIZE, //任务堆栈大小 (void* )NULL, //传递给任务函数的参数 (UBaseType_t )START_TASK_PRIO, //任务优先级 (TaskHandle_t* )&StartTask_Handler); //任务句柄 vTaskStartScheduler(); //开启任务调度 } //开始任务任务函数 void start_task(void *pvParameters) { taskENTER_CRITICAL(); //进入临界区 xTaskCreate((TaskFunction_t )task2_task, (const char* )"task2_task", (uint16_t )TASK2_STK_SIZE, (void* )NULL, (UBaseType_t )TASK2_TASK_PRIO, (TaskHandle_t* )&Task2Task_Handler); xTaskCreate(stabilizerTask, "STABILIZER", 450, NULL, 5, NULL); /*创建姿态任务*/ vTaskDelete(StartTask_Handler); //删除开始任务 taskEXIT_CRITICAL(); //退出临界区 } //task2任务函数 void task2_task(void *pvParameters) { //u8 task2_num=0; u16 len; while(1) { //task2_num++; //任务2执行次数加1 注意task1_num2加到255的时候会清零!! //printf("任务2已经执行:%d次\r\n",task2_num); if(USART_RX_STA&0x8000) { len=USART_RX_STA&0x3fff; debugcmd_process(USART_

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值