zoukankan      html  css  js  c++  java
  • 8-FreeRTOS任务API

    任务API汇总:

    PriorityNum = uxTaskPriorityGet(任务句柄)      //获取任务优先级

    TaskHandle = xTaskGetHandle("task1_task")   //根据任务名获取任务句柄

    TaskNum = uxTaskGetNumberOfTasks()           //任务数获取

    vTaskList(char * pcWriteBuffer )                         // 获取系统中当前所有任务的详细信息,并且将这些信息按照表格的形式组织在一起存放在用户提供的缓冲区中

    vTaskPrioritySet(任务句柄,优先级)                  //改变某任务优先级 需将宏INCLUDE_vTaskPrioritySet 定义为 1

    TaskState = eTaskGetState(任务句柄)               //获取任务状态 运行/挂起/阻塞/就绪

    TaskHandle_t TaskHandle;
    eTaskState TaskState;
    TaskHandle=xTaskGetHandle("task1_task");        //根据任务名获取任务句柄。
    TaskState=eTaskGetState(TaskHandle);        //获取任务的任务壮态

    TaskNum = uxTaskGetSystemState(                  //获取系统中所有任务的任务壮态, 每个任务状态信息保存在TaskStatus_t类型结构体里 需将宏configUSE_TRACE_FACILITY定义为 1

    TaskStatus_t * const pxTaskStatusArray, //TaskStatus_t结构体类型数组首地址

    const UBaseType_t uxArraySize,  //保存任务壮态数组的数组的大小

    uint32_t * const pulTotalRunTime) //configGENERATE_RUN_TIME_STATS是1则保存系统运行总时间

     

    vTaskGetInfo(   //获取指定任务状态     需将宏configUSE_TRACE_FACILITY定义为 1

                            TaskHandle_t xTask,  //任务句柄
                            TaskStatus_t * pxTaskStatus, //指向结构体TaskStatus_t变量
                            BaseType_t xGetFreeStackSpace, //保存自任务运行以来任务堆栈剩余的历史最小大小
                            eTaskState eState )  //保存任务运行壮态

     实验代码:

    #include "FreeRTOS.h"
    #include "task.h"
    
    
    
    
     //----------------------------------------任务优先级
     #define START_TASK_PRIO     1 
     #define TASK1_PRIO          2 
     #define TASK2_PRIO          3 //优先级高
     
     
     //----------------------------------------任务堆栈大小
     #define START_STK_SIZE 128 
     #define TASK1_STK_SIZE 128 
     #define TASK2_STK_SIZE 256 
    
     
     //----------------------------------------任务句柄
     TaskHandle_t Task1_Handler; 
     TaskHandle_t Task2_Handler; 
     TaskHandle_t StartTask_Handler; 
    
     
     
     //----------------------------------------任务函数
     void start_task(void *pvParameters); 
     void task1_task(void *pvParameters); 
     void task2_task(void *pvParameters); 
    
     char InfoBuffer[1000];                //保存信息的数组
     
     int main(void)
     {
       BaseType_t OS;
       NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);  
       User_GPIO_Init();
         Delay_init();
         USART_Config();
         
         
         OS= xTaskCreate(
                                                (TaskFunction_t        ) start_task,       //任务函数
                                                (const char *          )  "start_task",    //任务名
                                                (configSTACK_DEPTH_TYPE) START_STK_SIZE,   //堆栈大小
                                                (void *                )NULL,              //传递给任务函数的参数
                                                (UBaseType_t           ) START_TASK_PRIO,  //任务优先级
                                                (TaskHandle_t *        ) &StartTask_Handler  //任务句柄
                        );
                                      
         if(OS==pdPASS) 
             GPIO_SetBits(GPIOA, GPIO_Pin_8);
             
         vTaskStartScheduler(); //开启任务调度
         
     }
     
     
     void start_task(void *pvParameters)
     {
      
             taskENTER_CRITICAL(); //进入临界区
             
           //创建任务Task1
    xTaskCreate((TaskFunction_t )task1_task, //任务函数
             (const char* )"task1_task", //任务名称
             (uint16_t )TASK1_STK_SIZE, //任务堆栈大小
             (void* )NULL,
             (UBaseType_t )TASK1_PRIO, //任务优先级
             (TaskHandle_t* )&Task1_Handler); //任务句柄
     
    xTaskCreate((TaskFunction_t )task2_task, //任务函数
             (const char* )"task2_task", //任务名称
             (uint16_t )TASK2_STK_SIZE, //任务堆栈大小
             (void* )NULL,
             (UBaseType_t )TASK2_PRIO, //任务优先级
             (TaskHandle_t* )&Task2_Handler); //任务句柄           
                     
             vTaskDelete(StartTask_Handler); //vTaskDelete(NULL)也可以   删除开始任务
             taskEXIT_CRITICAL();            //退出临界区
     }
     
     
     //任务1
     void task1_task(void *pvParameters)
     {  
         while(1)
         {
                 
           vTaskDelay(5000);      //vTaskDelay      delay_xms不发生任务切换
         }
             
     }
     
     
      //任务2
     void task2_task(void *pvParameters)
     {  
        u32         TotalRunTime;
        UBaseType_t ArraySize,x;
        TaskStatus_t *StatusArray;
        TaskHandle_t TaskHandle;    
        TaskStatus_t TaskStatus;
    
        printf("/-----------第一步:函数uxTaskGetSystemState()的使用-----------/
    ");
        ArraySize=uxTaskGetNumberOfTasks();        //获取系统任务数量
        StatusArray=pvPortMalloc(ArraySize*sizeof(TaskStatus_t));//申请内存
        if(StatusArray!=NULL)                    //内存申请成功
        {
                ArraySize=uxTaskGetSystemState((TaskStatus_t*     )StatusArray,     //任务信息存储数组
                                                                             (UBaseType_t        )ArraySize,     //任务信息存储数组大小
                                                                             (uint32_t*        )&TotalRunTime);//保存系统总的运行时间
    
                printf("TaskName		Priority		TaskNumber		
    ");
                for(x=0;x<ArraySize;x++)
                {
                    //系统任务的有关信息,比如任务名称、任务优先级和任务编号
                    printf("%s		%d			%d			
    ",                
                                    StatusArray[x].pcTaskName,
                                    (int)StatusArray[x].uxCurrentPriority,
                                    (int)StatusArray[x].xTaskNumber);
                    
                }
        }
        vPortFree(StatusArray);    //释放内存
        printf("
      
    ");
         
    
        
        printf("/-----------第二步:函数vTaskGetInfo()的使用-----------/
    ");
        TaskHandle=xTaskGetHandle("task1_task");            //根据任务名获取任务句柄。
    
        vTaskGetInfo((TaskHandle_t    )TaskHandle,         //任务句柄
                           (TaskStatus_t*    )&TaskStatus,         //任务信息结构体
                           (BaseType_t    )pdTRUE,            //允许统计任务堆栈历史最小剩余大小
                         (eTaskState    )eInvalid);            //函数自己获取任务运行壮态
    
        printf("任务名:                %s
    ",TaskStatus.pcTaskName);
        printf("任务编号:              %d
    ",(int)TaskStatus.xTaskNumber);
        printf("任务壮态:              %d
    ",TaskStatus.eCurrentState);
        printf("任务当前优先级:        %d
    ",(int)TaskStatus.uxCurrentPriority);
        printf("任务基优先级:          %d
    ",(int)TaskStatus.uxBasePriority);
        printf("任务堆栈基地址:        %#x
    ",(int)TaskStatus.pxStackBase);
        printf("任务堆栈历史剩余最小值:%d
    ",TaskStatus.usStackHighWaterMark); 
        printf("
      
    ");
    
    
    
        printf("/-----------第三步:函vTaskList()的使用-----------/
    ");
        vTaskList(InfoBuffer);                            //获取所有任务的信息
        printf("%s
    ",InfoBuffer);                    //通过串口打印所有任务的信息
         while(1)
         {
    
         }
             
     }

    执行结果:

      

    任务的壮态信息: B 是阻塞态, R 是就绪态, S 是挂起态, D 是删除态

  • 相关阅读:
    AjaxEvent、AjaxMethod和Listeners的区别
    chm 文档突然打不开了
    ComboBox实现联动时所遇问题,待解!
    Silverlight 3 中使用WCF上传文件 (简单进度条展示)
    Eclipse 使用ApacheAnt 小记
    ApacheAnt 基础知识
    EClipse + Jdk + ApacheAnt + jetty + GWT + MySQL(Navicat)
    限制文本框输入N个字符的使用
    JAVA编程经验汇总 (载)
    Visual Studio 2010: Addin 的目录设置及其项目模板位置
  • 原文地址:https://www.cnblogs.com/darren-pty/p/14211810.html
Copyright © 2011-2022 走看看