seo模板建站,二次开发收费需要高点,网站与域名,郑州网站做网站文章目录 前言一、任务优先级1.Tick2.修改任务优先级 总结 前言
本系列基于stm32系列单片机来使用freerots
任务管理是实时操作系统#xff08;RTOS#xff09;的核心功能之一#xff0c;它允许开发者以并发的方式组织和管理多个任务。FreeRTOS 是一个流行的开源RTOS… 文章目录 前言一、任务优先级1.Tick2.修改任务优先级 总结 前言
本系列基于stm32系列单片机来使用freerots
任务管理是实时操作系统RTOS的核心功能之一它允许开发者以并发的方式组织和管理多个任务。FreeRTOS 是一个流行的开源RTOS它提供了强大的任务管理功能让开发者能够轻松创建和控制任务。本文将介绍 FreeRTOS 的任务管理功能包括任务的创建、删除、挂起、恢复和优先级控制等方面的内容。 一、任务优先级
想象一下你在等候一个重要电话同时又有其他事情要处理比如看电视、吃饭或打扫房间。这时候你可能会根据电话的重要性来决定优先处理的事情。
在计算机中“优先级”是用来决定任务执行顺序的一个指标。就像你有很多事情要做计算机也有很多任务要处理比如读取数据、计算、响应用户操作等等。但是由于计算机资源有限它不可能同时处理所有任务。于是我们可以将任务设置优先级告诉计算机哪些任务更重要或更紧急。
比如说你有两个任务一个是检测火灾的传感器另一个是播放音乐的任务。显然当火灾传感器检测到火情时它的任务优先级应该更高因为这是一个紧急的情况需要立即处理。而播放音乐的任务优先级相对较低它不是那么紧急可以稍后再处理。
通过设置任务的优先级计算机可以根据任务的重要性来分配处理时间。高优先级的任务会被优先执行确保重要任务能够及时完成。而低优先级的任务则会在高优先级任务得到处理之后再执行以避免重要任务被延迟。
总之优先级就是一种设置任务相对重要性的方式让计算机可以根据任务的优先级来合理地分配处理时间确保重要任务得到优先处理。
优先级的取值范围是0~(configMAX_PRIORITIES – 1)数值越大优先级越高。 FreeRTOS的调度器可以使用2种方法来快速找出优先级最高的、可以运行的任务。使用不同的方法时 configMAX_PRIORITIES 的取值有所不同。 通用方法 使用C函数实现对所有的架构都是同样的代码。对configMAX_PRIORITIES的取值没有限制。但 是configMAX_PRIORITIES的取值还是尽量小因为取值越大越浪费内存也浪费时间。 configUSE_PORT_OPTIMISED_TASK_SELECTION被定义为0、或者未定义时使用此方法。 架构相关的优化的方法 架构相关的汇编指令可以从一个32位的数里快速地找出为1的最高位。使用这些指令可以快速 找出优先级最高的、可以运行的任务。 使用这种方法时configMAX_PRIORITIES的取值不能超过32。 configUSE_PORT_OPTIMISED_TASK_SELECTION被定义为1时使用此方法。
在学习调度方法之前你只要初略地知道 FreeRTOS会确保最高优先级的、可运行的任务马上就能执行 对于相同优先级的、可运行的任务轮流执行
这无需记忆就像我们举的例子 厨房着火了当然优先灭火 喂饭、回复信息同样重要轮流做。
1.Tick
对于同优先级的任务它们“轮流”执行。怎么轮流你执行一会我执行一会。 一会怎么定义 人有心跳心跳间隔基本恒定。 FreeRTOS中也有心跳它使用定时器产生固定间隔的中断。这叫Tick、滴答比如每10ms发生一次时 钟中断。 如下图 假设t1、t2、t3发生时钟中断 两次中断之间的时间被称为时间片(time slice、tick period) 时间片的长度由configTICK_RATE_HZ 决定假设configTICK_RATE_HZ为100那么时间片长度就 是10ms 相同优先级的任务怎么切换呢请看下图 任务2从t1执行到t2 在t2发生tick中断进入tick中断处理函数 选择下一个要运行的任务 执行完中断处理函数后切换到新的任务任务1 任务1从t2执行到t3 从图中可以看出任务运行的时间并不是严格从t1,t2,t3哪里开始。 有了Tick的概念后我们就可以使用Tick来衡量时间了比如
vTaskDelay(2); // 等待2个Tick假设configTICK_RATE_HZ100, Tick周期时10ms, 等待20ms
// 还可以使用pdMS_TO_TICKS宏把ms转换为tick
vTaskDelay(pdMS_TO_TICKS(100)); // 等待100ms注意基于Tick实现的延时并不精确比如 vTaskDelay(2) 的本意是延迟2个Tick周期有可能经过1个 Tick多一点就返回了。 注意基于Tick实现的延时并不精确比如 vTaskDelay(2) 的本意是延迟2个Tick周期有可能经过1个 Tick多一点就返回了。
我们可以写出下面的示例代码
void Task(void *p)
{int32_t *i (int*)p;while(1){printf(Count:%d\r\n,*i);(*i);vTaskDelay(pdMS_TO_TICKS(500));}vTaskDelete(NULL);
}void Task2(void *p)
{while(1){}vTaskDelete(NULL);
}uint32_t count 0;
TaskHandle_t mytaskHandle;void TaskTest(void)
{xTaskCreate(Task,MyTask,50,count,1,mytaskHandle);xTaskCreate(Task2,MyTask2,50,count,3,mytaskHandle);vTaskStartScheduler();}MyTask2的优先级高于MyTask所以会先执行MyTask2当他执行MyTask2时没有延时他就会一直执行因为没有比他更高优先级的任务了只有他延时了才会执行优先级更低的任务而这里并没有所以MyTask会一直不执行就像下面这样没有任何打印
所以我们尽量在任务中延时一下以便其他任务的执行。
2.修改任务优先级
使用uxTaskPriorityGet来获得任务的优先级
UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask );//参数为任务句柄使用vTaskPrioritySet 来设置任务的优先级
void vTaskPrioritySet( TaskHandle_t xTask,
UBaseType_t uxNewPriority );//参数1任务句柄参数2新的优先级根据上面的函数分析可得下面的代码 通过按键更改优先级在这里我直接用定义好的函数检测if(key_scan(0) KEY0_PRES) 如果大家想自己写也可以的
uint32_t count 0;
TaskHandle_t mytaskHandle;
TaskHandle_t mytaskHandle2;
void Task(void *p)
{int32_t *i (int*)p;while(1){printf(Count:%d\r\n,*i);(*i);vTaskDelay(pdMS_TO_TICKS(500));}vTaskDelete(NULL);
}void Task2(void *p)
{uint8_t Priority 1;while(1){if(key_scan(0) KEY0_PRES){Priority;vTaskPrioritySet(mytaskHandle,Priority);}vTaskDelay(20);}vTaskDelete(NULL);
}void TaskTest(void)
{xTaskCreate(Task,MyTask,50,count,1,mytaskHandle);xTaskCreate(Task2,MyTask2,50,count,3,mytaskHandle2);vTaskStartScheduler();
}实验效果当我们按下按键0他的优先级会在串口里会看到count的数量打印。
总结
任务管理是 FreeRTOS 提供的一个强大功能它允许开发者以并发的方式组织和管理多个任务。通过任务的创建、删除、挂起、恢复和优先级控制等操作开发者可以灵活地控制任务的执行顺序和调度策略从而实现复杂的系统功能。任务通信与同步机制进一步增强了任务的协同工作能力使任务之间能够高效地共享数据和协调操作。借助 FreeRTOS 提供的任务管理功能开发者可以更加方便地构建实时嵌入式系统并具备可靠性和高效性。
需要注意的是在使用 FreeRTOS 进行任务管理时开发者需要注意任务的资源管理、优先级设置和调度策略等方面以确保系统能够稳定地运行并满足实时性和响应性的要求。