在调用任务创建函数xTaskCreate()时就为任务指定了优先级,在启动了任务调度函数之后,可以通过调用xTaskPrioritySet()函数来修改任务的优先级。
系统中理论上没有对优先级做出上限要求,只要内存足够大就可以创建多个任务,设置不同的优先级,不同的任务可以赋予相同的优先级,在FreeRTOSConfig.h中configMAX_PRIORITIES 的大小决定最大优先级个数,优先级是从0开始到configMAX_PRIORITIES - 1为止,优先级为0的任务的优先级最高。
系统中的调度器总是先让优先级最高的任务先运行,如果多个任务拥有相同的优先级,那么调度器将会使得任务轮流执行一个时间片。这里的时间片等于1/心跳时钟频率,心跳时钟即滴答时钟。可以通过设置
FreeRTOSConfig.h中的configTICK_RATE_HZ来设置心跳中断时钟,当configTICK_RATE_HZ赋值为100HZ时,每100模式发生一次心跳时钟中断,系统会执行相应的中断函数。
对于不同优先级的任务,调度器总是先让优先级高的任务运行,下面用一个例子说明。
-
#include "includes.h"
-
#include <stdio.h>
-
#include "usart.h"
-
-
-
void xDelay(void);
-
void xtask1(void *pvParameter);
-
void xtask2(void *pvParameter);
-
-
int main()
-
{
-
int ret = 0;
-
uart_init(9600); //????????????9600
-
NVIC_Configuration();// ?è????????????·?×é
-
-
/*
-
*???¨??????????
-
*/
-
xTaskCreate(xtask1, //??????????
-
"task1", //????????±???×??????????÷???±????
-
512, //??????·????????????ó??
-
NULL, //??????????????????
-
1, //±?????????????
-
NULL); //????????????±ú
-
xTaskCreate(xtask2, "task2", 512, NULL, 2, NULL); //??????1?????¨????2
-
/*
-
*?????????÷???÷??????????????
-
*/
-
-
vTaskStartScheduler();
-
/*
-
*??°????????á????????????·??????????ò??????????????×?????·¨??????????·???
-
*????
-
*/
-
while(1);
-
}
-
/***************************************
-
* ?????ò???????±????
-
**************************************/
-
void xDelay()
-
{
-
int i;
-
for(i = 200; i--; i >= 0);
-
}
-
/****************************************
-
* ??????????????
-
***************************************/
-
void xtask1(void *pvParameter)
-
{
-
int i;
-
const char *pcTaskName = "Task1 is running\n";
-
-
//volatile unsigned long u1 = 0;
-
while(1)
-
{
-
printf("%s\n", pcTaskName);
-
vTaskDelay( 1 );
-
}
-
}
-
/****************************************
-
* ??????????????
-
***************************************/
-
void xtask2(void *pvParameter)
-
{
-
int i;
-
const char *pcTaskName = "Task2 is running\n";
-
-
//volatile unsigned long u1 = 0;
-
while(1)
-
{
-
printf("%s\n", pcTaskName);
-
vTaskDelay( 1 );
-
}
-
}
执行结果为:
可以看出创建的两个任务中第二个任务的优先级最高,调度时总是让优先级最高的任务先执行。
阅读(5812) | 评论(0) | 转发(0) |