8-FreeRTOS任务API

摘要:
任务API摘要:PriorityNumber=uxTaskPriorityGet(任务句柄)//获取任务优先级TaskHandle=xTaskGetHandle(“task1_Task”)//根据任务名称获取任务句柄TaskNumber=ux TaskGetNumberOfTasks()//根据任务数量获取vTaskList(char*pcWriteBuffer)

任务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)
     {

     }
         
 }

执行结果:

8-FreeRTOS任务API第1张  

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

免责声明:文章转载自《8-FreeRTOS任务API》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇apache 访问权限出错,apache selinux 权限问题, (13) Permission DeniedAndroid LogCat使用详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

WebStorm好用的插件推荐

随着时间的推移,编写JavaScript代码很多有用的插件都集成了WebStorm中,在WebStorm中即使不装任何插件,都能很舒服的进行开发网页应用、Node应用。插件对于WebStorm并不是特别的重要,但是某些插件实在是比较好用,所以本篇文章就整理一下比较好用的插件。使用该插件,可以直接在WebStorm中内嵌一个翻译界面。...

fullcalendar日历控件知识点集合

除非对于极少的特殊需求,fullcalendar向我们提供的接口不足以满足,才会去改动fullcalendar本身的js文件。这些会议安排一般是保存在server的,在每次页面载入时,fullcalendar得到会议安排的集合,然后依照当中的日期去把事件描绘到日历相应的地方。...

IntelliJ IDEA 版本控制(svn、git) 修改文件后,所属目录的颜色也变化

IntelliJIDEA的版本控制默认文件已被修改,目录的颜色不会改变,这很不方便。例如,修改方法如下:文件---&gt;设置--&gt;版本控制--&gt;选中“显示更改内容的目录”,效果如下:...

如何开发一款浏览器[转]

另一个问题是“开发浏览器有什么困难?”,范围不限于PC或移动浏览器。从这个角度来看,开发浏览器并不容易。有很多种类的知识和困难需要处理,但如此多的努力将得到相应的回报。InfoQ的读者们,您是否也考虑过开发浏览器?你对如何开发浏览器有什么看法?...

【转】MUD教程--巫师入门教程4

在MUD中,为了解决定时触发某种现象,一般有两种方法,一种是通过call_out()延时呼叫,另一种就是通过心跳。于是,对于要跨起离线前后的象做牢这类的事,大多都是采用condition。附:由于大多数MUD里的心跳是每两秒调一次,5+random是5至14次,因此可以看出每一个condition被调用的时间是平均19秒。然后它会按照condition的名字...

LaTex学习笔记(1)——LaTeX文档插入图片的几种常用方法

2,插入bmp图片还没有找到直接插入bmp图片的方法。用gimp或fastoneimageviewer,将jpg质量选为最高,转换之后得到的图片质量较好。3,同时插入jpg和eps图片插入的命令不变。编译时使用Latex,dvi2pdf,两种格式的图片都可以显示。...