首页 > 其他分享 >FreeRTOS中的任务优先级与单片机中断优先级的异同深析

FreeRTOS中的任务优先级与单片机中断优先级的异同深析

时间:2023-12-14 22:32:51浏览次数:29  
标签:深析 优先级 FreeRTOS 中断 void 单片机 任务

引言: 在实时嵌入式系统开发中,任务的优先级和中断的优先级是关键的调度和响应机制。FreeRTOS提供了丰富的任务调度功能,而单片机的中断系统也具有类似的机制。本篇博客将深入探讨FreeRTOS中的任务优先级与单片机中断优先级的异同,通过代码演示展示它们的工作原理和使用方式。

任务优先级在FreeRTOS中的应用:

在FreeRTOS中,任务的优先级决定了任务何时被调度执行。优先级值越高,任务越容易获得CPU执行时间。以下是一个简单的代码演示:

#include "FreeRTOS.h"
#include "task.h"

void vTask1(void *pvParameters) {
    for (;;) {
        // 任务1的代码逻辑
    }
}

void vTask2(void *pvParameters) {
    for (;;) {
        // 任务2的代码逻辑
    }
}

int main(void) {
    // 创建任务1和任务2,任务1的优先级高于任务2
    xTaskCreate(vTask1, "Task1", configMINIMAL_STACK_SIZE, NULL, 2, NULL);
    xTaskCreate(vTask2, "Task2", configMINIMAL_STACK_SIZE, NULL, 1, NULL);

    // 启动FreeRTOS调度器
    vTaskStartScheduler();

    return 0;
}

在上述例子中,vTask1的优先级为2,而vTask2的优先级为1。因此,vTask1更容易获取CPU执行时间,除非它被阻塞或处于等待状态。

中断优先级在单片机中的应用:

单片机的中断优先级与任务优先级的概念相似,它决定了中断服务程序(ISR)何时被执行。以下是一个简单的单片机中断优先级的代码演示:

#include "stm32f4xx.h"

void EXTI0_IRQHandler(void) {
    // 中断服务程序的代码逻辑
}

int main(void) {
    // 配置外部中断0的触发方式和优先级
    NVIC_SetPriority(EXTI0_IRQn, 3); // 设置中断优先级,值越小,优先级越高

    // 启用外部中断0
    NVIC_EnableIRQ(EXTI0_IRQn);

    while (1) {
        // 主循环中的代码逻辑
    }

    return 0;
}

在这个例子中,EXTI0_IRQHandler是外部中断0的中断服务程序。通过NVIC_SetPriority函数,我们设置了中断优先级为3。与FreeRTOS中类似,优先级值越小,中断服务程序越容易获得执行。

异同点深析:

  1. 任务调度与中断响应: 任务的优先级决定了任务何时获得CPU执行时间,而中断的优先级决定了中断服务程序何时被执行。在单片机中,中断服务程序的执行可以打断任务的正常执行,因此任务和中断之间存在竞争关系。
  2. 嵌套优先级: FreeRTOS允许任务嵌套,即在一个任务中调用另一个任务。在这种情况下,被调用任务的优先级可以高于调用任务的优先级。而在单片机中,通常不允许中断嵌套,因此中断服务程序的优先级是唯一的。
  3. 调度器与中断控制器: FreeRTOS调度器负责任务的切换和调度,而中断控制器负责中断的管理和响应。两者之间是独立的,但在某些嵌套优先级的情况下需要小心处理。

结论:

FreeRTOS中的任务优先级和单片机中断优先级在概念上相似,但在具体实现和使用方式上有一些差异。深入理解这些异同点对于在嵌入式系统中有效地进行任务调度和中断响应至关重要。通过灵活运用任务和中断的优先级,开发者可以更好地控制系统的执行流,提高系统的响应性和稳定性。在实际应用中,细致地配置任务和中断的优先级,根据系统需求进行权衡,将是构建高效嵌入式系统的关键一环。

标签:深析,优先级,FreeRTOS,中断,void,单片机,任务
From: https://blog.51cto.com/u_16193759/8824126

相关文章

  • 241. 为运算表达式设计优先级(分治 +记忆化)
    Problem:241.为运算表达式设计优先级给你一个由数字和运算符组成的字符串expression,按不同优先级组合数字和运算符,计算并返回所有可能组合的结果。你可以按任意顺序返回答案。生成的测试用例满足其对应输出值符合32位整数范围,不同结果的数量不超过示例1:输入:expression=......
  • C++学习笔记六:运算符(五种基本运算操作,优先级和结合性)
    这一章对操作符进行简单的总结:1.五种基本运算类型:加减乘除,取余add,substract,multiply,divide,modulusintnumber1{2};intnumber2{7};intresult=number1+number2;result=number2-number1;result=number1-number2;result=number1*number2;result=......
  • Hadoop 配置的优先级
    从低到高1.默认配置默认文件文件存放在Hadoop的jar包中的位置core-default.xmlhadoop-common-3.3.6.jar/core-default.xmlhdfs-default.xmlhadoop-hdfs-3.3.6.jar/hdfs-default.xmlyarn-default.xmlhadoop-yarn-common-3.3.6.jar/yarn-default.xmlmapred-d......
  • FreeRTOS中的事件组:实现任务同步与通信的强大工具
    引言:在实时嵌入式系统中,任务同步和通信是至关重要的,而FreeRTOS提供的事件组(EventGroups)机制为实现这一目标提供了一种高效且灵活的解决方案。本篇博客将深入研究FreeRTOS中的事件组,详细介绍其原理、使用方法,以及在实际应用中的一些最佳实践。事件组原理:事件组是FreeRTOS中的一种......
  • C语言中的运算符优先级
    C语言中的运算符优先级前言这几天在调试一个程序,遇到了一个bug,就是需要读取寄存器的数据。该数据是一个16bit的数据,按照高8位一个byte和低8位一个byte分别存放在了不同的寄存器地址中。但是在我读取数据的时候,总是会出现数据不符合预期的情况。在程序中是这样子的,读取的高8位数......
  • 支持优先级继承的RT-mutex子系统
    https://www.kernel.org/doc/html/v6.6/locking/rt-mutex.htmlRT-mutex子系统支持PIRT-mutexes与优先级继承一起使用,以支持PI-futexes,从而使pthread_mutex_t支持优先级继承属性(PTHREAD_PRIO_INHERIT)。[有关PI-futexes的更多详细信息,请参见轻量级PI-futexes。]这项技术是在-rt......
  • 一些神奇的运算优先级
    首先来看这个代码intf(int*p){ inty=(*p)*2; (*p)++; returny;}intmain(){ intx=10; cout<<x+f(&x); return0;}这个代码输出的是31,感觉似乎f加了一个括号?那再看看这个代码intf(int*p){ inty=(*p)*2; (*p)++; returny;}intmain(){ intx=10......
  • 网络优先级cgroup 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/admin-guide/cgroup-v1/net_prio.html网络优先级cgroup网络优先级cgroup提供了一个接口,允许管理员动态设置由各种应用程序生成的网络流量的优先级。通常情况下,应用程序会通过SO_PRIORITY套接字选项设置其流量的优先级。然而,这并不总是......
  • python实现一个优先级队列
    实现一个优先级队列问题怎样实现一个按优先级排序的队列?并且在这个队列上面每次pop操作总是返回优先级最高的那个元素解决方案下面的类利用heapq模块实现了一个简单的优先级队列:importheapqclassPriorityQueue:def__init__(self):self._queue=[]s......
  • Linux-线程优先级学习
    概念Linux系统中常用的几种调度类为SCHED_NORMAL、SCHED_FIFO、SCHED_RR。SCHED_NORMAL:用于普通线程的调度类SCHED_FIFO和SCHED_RR是用于实时线程的调度类,优先级高于SCHED_NORMAL。内核中区分普通线程与实时线程是根据线程的优先级,实时线程拥有实时优先级(real-timepriority......