Chinaunix首页 | 论坛 | 博客
  • 博客访问: 70131
  • 博文数量: 24
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 245
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-10 08:06
文章分类
文章存档

2015年(24)

我的朋友

分类: 嵌入式

2015-07-19 14:51:32

      在调用任务创建函数xTaskCreate()时就为任务指定了优先级,在启动了任务调度函数之后,可以通过调用xTaskPrioritySet()函数来修改任务的优先级。
     系统中理论上没有对优先级做出上限要求,只要内存足够大就可以创建多个任务,设置不同的优先级,不同的任务可以赋予相同的优先级,在FreeRTOSConfig.h中configMAX_PRIORITIES 的大小决定最大优先级个数,优先级是从0开始到configMAX_PRIORITIES - 1为止,优先级为0的任务的优先级最高。
     系统中的调度器总是先让优先级最高的任务先运行,如果多个任务拥有相同的优先级,那么调度器将会使得任务轮流执行一个时间片。这里的时间片等于1/心跳时钟频率,心跳时钟即滴答时钟。可以通过设置FreeRTOSConfig.h中的configTICK_RATE_HZ来设置心跳中断时钟,当configTICK_RATE_HZ赋值为100HZ时,每100模式发生一次心跳时钟中断,系统会执行相应的中断函数。
    对于不同优先级的任务,调度器总是先让优先级高的任务运行,下面用一个例子说明。

点击(此处)折叠或打开

  1. #include "includes.h"
  2. #include <stdio.h>
  3. #include "usart.h"


  4. void xDelay(void);
  5. void xtask1(void *pvParameter);
  6. void xtask2(void *pvParameter);

  7. int main()
  8. {
  9.    int ret = 0;
  10.    uart_init(9600);     //????????????9600
  11.    NVIC_Configuration();// ?è????????????·?×é
  12.   
  13.    /*
  14.     *???¨??????????
  15.     */
  16.     xTaskCreate(xtask1, //??????????
  17.                 "task1", //????????±???×??????????÷???±????
  18.                 512, //??????·????????????ó??
  19.                 NULL, //??????????????????
  20.                 1, //±?????????????
  21.                 NULL); //????????????±ú
  22.     xTaskCreate(xtask2, "task2", 512, NULL, 2, NULL);    //??????1?????¨????2
  23.     /*
  24.      *?????????÷???÷??????????????
  25.      */
  26.     
  27.     vTaskStartScheduler();
  28.     /*
  29.      *??°????????á????????????·??????????ò??????????????×?????·¨??????????·???
  30.      *????
  31.      */
  32.      while(1);
  33. }
  34. /***************************************
  35.  * ?????ò???????±????
  36.  **************************************/
  37. void xDelay()
  38. {
  39.     int i;
  40.     for(i = 200; i--; i >= 0);
  41. }
  42. /****************************************
  43.  * ??????????????
  44.  ***************************************/
  45.  void xtask1(void *pvParameter)
  46.  {    
  47.      int i;
  48.      const char *pcTaskName = "Task1 is running\n";
  49.     
  50.      //volatile unsigned long u1 = 0;
  51.      while(1)
  52.      {
  53.          printf("%s\n", pcTaskName);
  54.          vTaskDelay( 1 );
  55.      }
  56.  }
  57.  /****************************************
  58.   *          ??????????????
  59.   ***************************************/
  60.   void xtask2(void *pvParameter)
  61.   {    
  62.       int i;
  63.      const char *pcTaskName = "Task2 is running\n";
  64.     
  65.      //volatile unsigned long u1 = 0;
  66.      while(1)
  67.      {
  68.      printf("%s\n", pcTaskName);
  69.      vTaskDelay( 1 );
  70.      }        
  71.   }

执行结果为:

可以看出创建的两个任务中第二个任务的优先级最高,调度时总是让优先级最高的任务先执行。







阅读(5766) | 评论(0) | 转发(0) |
0

上一篇:freeRTOS任务创建

下一篇:freeRTOS的延时函数

给主人留下些什么吧!~~