首页 > 其他分享 >FreeRTOS操作系统(详细速通篇)——— 第六章

FreeRTOS操作系统(详细速通篇)——— 第六章

时间:2024-07-21 10:56:23浏览次数:18  
标签:抢占 FreeRTOS 中断 通篇 NVIC 寄存器 第六章 优先级

    本专栏将对FreeRTOS进行快速讲解,带你了解并使用FreeRTOS的各部分内容。适用于快速了解FreeRTOS并进行开发、突击面试、对新手小白非常友好。期待您的后续关注和订阅!

目录

系统中断管理

1 什么是中断?

1.1中断定义

1.2 中断执行机制

​2 中断优先级如何分组

 2.1 优先级介绍

 2.2 优先级分组

3 中断有关寄存器(了解一下)

4 实例


系统中断管理

1 什么是中断?

1.1中断定义

        中断是 CPU 的一种常见特性,通常由硬件触发。当中断发生时,CPU 会暂停当前的程序,转而执行与该中断相关的服务程序。ARM Cortex-M 内核的微控制器(MCU)配备了嵌套向量中断控制器(NVIC,Nested Vectored Interrupt Controller),专门用于高效管理中断。

        简而言之,让CPU打断正常运行的程序,转而去处理紧急的事件(程序),就叫中断。

 1.2 中断执行机制

中断执行可以规划为三步:

  1. 中断请求的生成:外部设备如GPIO或定时器等产生中断请求。
  2. 响应中断:CPU暂停当前程序的执行,转而执行中断处理程序(ISR)。
  3. 退出中断:中断处理程序执行完毕后,CPU返回到被中断的程序继续执行。

        举例来说,当我们在写代码的时候,肚子突然饿了。但是代码没有写完,这个时候我们可以打个中断去吃饭,在我们吃完饭之后然后回来继续写代码。


2 中断优先级如何分组

2.1 优先级介绍

        ARM Coetex-M 内核采用8位带宽基础来进行配置中段的优先等级,一共有8位来配置我们的抢占优先级和子优先级。

        学过STM32的朋友想必都了解抢占优先级和子优先级,在STM32中,我们只采用中断优先级配置寄存器的高4位【7:4】,进行配置抢占优先级和子优先级可以进行分组。

  • 抢占优先级:抢占优先级高的中断可以打断正在执行的抢占优先级低的中断。
  • 子优先级:抢占优先级相同,响应优先级高的中断不能打断响应优先级低的中断,优先级数越小优先级越高。

 2.2 优先级分组

       优先级分组共计有四种方式,而我们用的FreeRTOS操作系统一般采用0~15为抢占优先级,没有子优先级。并且有一点我们写程序需要注意的是,在程序中你定义任务优先级给的数值越大优先级越高。优先级分组如下表所示,在使用FreeRTOS时一般采用NVIC_PRIORITYGROUP_4。

优先级分组

抢占优先级

子优先级

优先级配置寄存器高 4 位

NVIC_PriorityGroup_0

0 级抢占优先级

0-15 级子优先级

0bit 用于抢占优先级
4bit 用于子优先级

NVIC_PriorityGroup_1

0-1 级抢占优先级

0-7 级子优先级

1bit 用于抢占优先级
3bit 用于子优先级

NVIC_PriorityGroup_2

0-3 级抢占优先级

0-3 级子优先级

2bit 用于抢占优先级
2bit 用于子优先级

NVIC_PriorityGroup_3

0-7 级抢占优先级

0-1 级子优先级

3bit 用于抢占优先级
1bit 用于子优先级

NVIC_PriorityGroup_4

0-15 级抢占优先级

0 级子优先级

4bit 用于抢占优先级
0bit 用于子优先级

        有四点我们需要注意(非常重要):

  1. 低于configMAX_SYSCALL_INTERRUPT_PRIORITY优先级的中断里才允许调用FreeRTOS 的API函数,也就说管理的中断需要在FreeRTOS之内,超出0~15这个范围我们无法管理。
  2. 中断中调用FreeRTOS的API函数,必须使用代“FromISR”后缀的函数。
  3. 一般也建议将所有优先级位指定为抢占优先级位,更方便我们管理。
  4. 中断优先级数值越小越优先,任务优先级数值越大越优先(再强调一下)。

3 中断有关寄存器(了解一下)

三个中断屏蔽寄存器,分别为 PRIMASK、 FAULTMASK 和BASEPRI

寄存器名称功能描述
PRIMASK

        这是一个只有1个位的寄存器。当它被置1时,会屏蔽所有可屏蔽的异常,只有NMI和硬fault可以响应。默认值为0,表示不屏蔽任何中断。

FAULTMASK        这是一个只有1个位的寄存器。当它被置1时,只有NMI能够响应,所有其他异常(包括中断和fault)都会被屏蔽。默认值也是0,表示不屏蔽任何异常。
BASEPRI        这个寄存器最多有9个位(具体位数由优先级表示的位数决定)。它定义了被屏蔽优先级的阈值。当设为某个值后,所有优先级号大于等于该值的中断都会被屏蔽(优先级号越大,优先级越低)。但如果设为0,则不屏蔽任何中断,0也是默认值。

        我们采用的FreeRTOS使用的中断管理其实使用BASEPRI这个寄存器。

4 实例

      举例代码如下,进行创建任务;

      创建好任务函数之后,依靠任务回调函数将内容输出。

      代码部分多写一写就会了。

void task1(void *pvParameters)
{
    uint32_t task1_num = 0;
    
    while (1)
    {
        if (++task1_num == 5)
        {
            printf("FreeRTOS关闭中断\r\n");
            portDISABLE_INTERRUPTS();       /* FreeRTOS关闭中断 */
            delay_ms(5000);
            printf("FreeRTOS打开中断\r\n");
            portENABLE_INTERRUPTS();        /* FreeRTOS打开中断 */
        }
        
        vTaskDelay(1000);
    }
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{

//编写内容

}

       本专栏将对FreeRTOS进行快速讲解,带你了解并使用FreeRTOS的各部分内容。期待诸君的订阅和关注!

标签:抢占,FreeRTOS,中断,通篇,NVIC,寄存器,第六章,优先级
From: https://blog.csdn.net/weixin_49007164/article/details/140476218

相关文章

  • FreeRTOS【面试】实时操作系统的知识总结
    RTOS的实时性是如何实现的?任务之间是如何通信的?二值信号量与互斥信号量的区别?优先级反转?如何解决优先级反转问题?任务通知是怎么实现的?框架性的回答一个嵌入式系统Freertos的启动到结束的过程?任务切换的原理? 除了任务切换对freertos其他底层了解吗?讲讲FreeRT......
  • FreeRTOS操作系统(详细速通篇)——— 第四章
             本专栏将对FreeRTOS进行快速讲解,带你了解并使用FreeRTOS的各部分内容。适用于快速了解FreeRTOS并进行开发、突击面试、对新手小白非常友好。期待您的后续关注和订阅!目录任务创建和删除1任务创建方式1.1动态任务创建1.2静态任务创建2任务删除函数......
  • FreeRTOS操作系统(详细速通篇)——— 第一章
            本专栏将对FreeRTOS进行快速讲解,带你了解并使用FreeRTOS的各部分内容。适用于快速了解FreeRTOS并进行开发、突击面试、对新手小白非常友好。期待您的后续关注和订阅目录1FreeRTOS简介1.1 什么为FreeRTOS?1.2为什么选择FreeRTOS?1.3FreeRTOS与裸机的区......
  • FreeRTOS
    1.栈的大小栈的大小通常指的是每个任务(或线程)在运行时分配的内存空间,用于存储局部变量、函数调用信息(如返回地址、参数等)、临时数据等。它和任务的大小有一定关系,但并不是直接对应的。代码片段中:_Min_Heap_Size=0x400;/*requiredamountofheap*/_Min_Stack_Size=0x10......
  • 计算机组成复习——第六章流水线知识点总结
    ......
  • STM32第二十课:FreeRTOS任务管理和信号量
    目录一、任务管理方式二、任务堆栈溢出检测三、二值信号量(任务同步)四、计数信号量五、互斥信号量六、队列一、任务管理方式1.任务创建成功后会添加到就绪链表中,开启调度器,此时任务调度器会去就绪链表中找优先级最高的任务执行。若优先级一样则按照创建任务的先后来......
  • 第六章字符串及正则表达式
    字符串的常用操作点击查看代码示例6-1字符串的相关操作1#大小写转换s1='HELLOWORLD'new_s2=s1.lower()print(s1,new_s2)new_s3=s1.upper()print(new_s3)#字符串的分隔e_mail='[email protected]'lst=e_mail.split('@')print('邮箱名:',lst[0],'邮箱服务器:',......
  • 【操作系统原理】第六章课后习题
    前言课本:操作系统原理(第五版)[费翔林,骆斌编著]习题:主要习题内容是第一章到第六章,具体内容如下表章节内容链接第一章思考题1,3,7、应用题7,12(1)~(4)https://blog.csdn.net/Zchengjisihan/article/details/136493304?spm=1001.2014.3001.5501第二章思考题1,3,10......
  • FreeRTOS中vTaskDelay 和 xTaskDelayUntil 的区别?
     vTaskDelay和xTaskDelayUntil是FreeRTOS提供的两种不同任务延迟函数,各自有其适用的场景和优缺点。vTaskDelay适用于简单的延迟操作,而xTaskDelayUntil提供了精确的周期控制能力。在设计FreeRTOS应用程序时,根据任务的时间要求选择合适的延迟机制,将有助于优化系统性......
  • 【嵌入式——FreeRTOS】任务通知
    【嵌入式——FreeRTOS】任务通知简介任务通知值的更新方式任务通知优势任务通知劣势任务通知值和通知状态任务通知值的类型任务通知状态相关API发送通知相关API函数接收通知相关API任务通知模拟二值信号量代码示例任务通知模拟消息邮箱代码示例任务通知模拟事件标志组......