FreeRTOS中的任务调度与时间片轮转中的任务抢占

在FreeRTOS中,任务调度是根据任务的优先级和状态来决定的。理解如何在时间片轮转机制下管理任务对于编写高效的实时系统至关重要。以下是FreeRTOS任务调度和时间片轮转机制的详细总结:

任务状态

任务在FreeRTOS中可以有以下几种状态:

  1. 运行态(Running):当前正在使用CPU的任务。
  2. 就绪态(Ready):准备执行但等待CPU的任务。
  3. 阻塞态(Blocked):等待某个事件或资源而无法执行的任务。
  4. 挂起态(Suspended):任务被暂停,不会被调度执行。
任务优先级

FreeRTOS使用优先级调度,优先级高的任务总是优先执行。当多个任务有相同的优先级时,调度器会根据时间片轮转机制在它们之间切换。

时间片轮转机制

时间片轮转(Time Slicing)是一种确保同优先级任务能够公平共享CPU资源的机制。每个同优先级任务在一段时间(时间片)内独占CPU,时间片用尽后,调度器将CPU分配给下一个同优先级的就绪任务。

任务从阻塞态变为就绪态

当一个任务从阻塞态变为就绪态时,如果其优先级高于当前运行任务的优先级,调度器会立即切换到该任务执行。然而,如果它的优先级与当前运行任务相同,FreeRTOS不会立即进行任务切换,当前任务会继续执行直到以下情况之一发生:

  1. 当前任务主动让出CPU:当前运行任务调用taskYIELD()函数,主动放弃CPU使用权。
  2. 当前任务进入阻塞态:当前运行任务因等待某个事件或资源而进入阻塞状态。
  3. 时间片到期:在时间片轮转机制下,当前任务的时间片用尽,调度器会将CPU分配给下一个同优先级的就绪任务。
示例说明

假设有两

### 单片机中实现抢占时间片轮转任务调度的方法 在单片机环境中,特别是采用 FreeRTOS 的情况下,可以利用其内置的时间片轮转抢占式调度功能来实现实时多任务管理。具体来说: #### 初始化配置 为了启用抢占式时间和时间片轮转特性,需先初始化 FreeRTOS 调度器并设置好相应的参数。 ```c // 定义两个同优先级的任务函数原型声明 void Task1(void *pvParameters); void Task2(void *pvParameters); int main(void){ // 创建两个具有相同优先级的任务 xTaskCreate(Task1, "TASK_1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL); xTaskCreate(Task2, "TASK_2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL); // 开启调度器前关闭中断防止冲突 taskENTER_CRITICAL(); // 启动调度器 vTaskStartScheduler(); // 如果退出了vTaskStartScheduler(),则意味着内存不足或其他错误发生. } ``` #### 设置时间片长度 可以通过修改 `configTICK_RATE_HZ` 来调整系统节拍频率,从而间接影响到每个时间片的实际持续时间。通常这个值是在 FreeRTOSConfig.h 文件里定义的,默认可能是每秒 100 或者更高次数的滴答中断[^1]。 #### 处理上下文切换 每当定时器触发一次溢出事件(即一个完整的周期结束),就会引起一次软中断,在此期间会检查是否有更高级别的可执行状态存在;如果没有,则继续按照既定顺序轮流激活处于同一级别的各个进程实例[^4]。 对于上述提到的例子而言,如果两个任务被赋予同样的优先级别,那么它们将会遵循时间片原则交替获得 CPU 控制权直到其中一个进入等待或阻塞模式为止[^2]。 #### 使用互斥锁保护共享资源 为了避免多个并发操作可能引发的数据竞争条件问题,应该引入同步原语比如二进制信号量作为临界区访问控制手段之一[^3]。 ```c SemaphoreHandle_t mutex; void Task1(void *pvParameters){ while(1){ if(xSemaphoreTake(mutex,portMAX_DELAY)){ /* Critical Section */ xSemaphoreGive(mutex); } // 让出CPU给其他同等优先级的任务 vTaskDelay(pdMS_TO_TICKS(1)); } } void Task2(void *pvParameters){ while(1){ if(xSemaphoreTake(mutex,portMAX_DELAY)){ /* Critical Section */ xSemaphoreGive(mutex); } // 让出CPU给其他同等优先级的任务 vTaskDelay(pdMS_TO_TICKS(1)); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值