配置系统的Tick时间
-
修改
configTICK_RATE_HZ
宏:- 在FreeRTOS配置文件(通常是
FreeRTOSConfig.h
)中,找到configTICK_RATE_HZ
宏定义。这个宏定义了每秒tick的次数。 - 根据应用需求设置合适的值。例如,如果希望每个tick代表1毫秒,那么将
configTICK_RATE_HZ
设置为1000。
- 在FreeRTOS配置文件(通常是
-
配置系统时钟:
- 根据具体的硬件平台和使用的时钟源,配置系统时钟以满足tick频率的要求。这通常需要在启动代码或硬件初始化代码中完成。
-
启动FreeRTOS内核:
- 在应用程序的入口函数中调用FreeRTOS内核的启动函数(如
vTaskStartScheduler()
),开始任务调度。
- 在应用程序的入口函数中调用FreeRTOS内核的启动函数(如
配置任务优先级
-
理解任务优先级范围:
- FreeRTOS中任务优先级的范围通常是从0到
configMAX_PRIORITIES - 1
,其中configMAX_PRIORITIES
是一个配置常量,表示系统中支持的最大任务优先级数量。 - 数值越大优先级越高。空闲任务的优先级通常被设置为最低(即0)。
- FreeRTOS中任务优先级的范围通常是从0到
-
创建任务时指定优先级:
- 使用
xTaskCreate()
API函数创建任务时,可以指定任务的初始优先级。
- 使用
-
修改任务优先级:
- 使用
vTaskPrioritySet()
API函数可以修改任务的优先级。- 参数
xTask
是传递进某个任务的句柄,可以是NULL,表示修改自己的优先级。 - 参数
uxNewPriority
表示新设置的优先级,取值范围为0到configMAX_PRIORITIES - 1
。
- 参数
- 使用
-
获取任务优先级:
- 使用
uxTaskPriorityGet()
API函数可以获取任务的当前优先级。- 参数
xTask
是某个任务句柄,可以是NULL,表示获取自己的优先级。 - 返回值就是该任务的优先级。
- 参数
- 使用
示例代码
以下是一个创建两个任务并设置不同优先级的示例代码:
#include <stdio.h> #include "FreeRTOS.h" #include "task.h" TaskHandle_t Task1Handle; TaskHandle_t Task2Handle; void Task1(void* pvParameters) { while (1) { vTaskDelay(1000); // 延时1个tick周期 printf("Task1 is running "); } } void Task2(void* pvParameters) { while (1) { vTaskDelay(1000); // 延时1个tick周期 printf("Task2 is running "); } } int main(void) { // 创建两个任务,并指定不同的优先级 xTaskCreate(Task1, "Task1", configMINIMAL_STACK_SIZE, NULL, 1, &Task1Handle); xTaskCreate(Task2, "Task2", configMINIMAL_STACK_SIZE, NULL, 2, &Task2Handle); // 启动调度器 vTaskStartScheduler(); // 如果一切正常,main函数不应该执行到这里 for (;;); }
在这个示例中,Task2
的优先级比Task1
高,因此Task2
会先运行。当Task2
进入延时状态后,Task1
才会获得CPU控制权并运行。