• freeRTOS中文实用教程3--中断管理之延迟中断处理


    1.前言

    嵌入式实时操作系统需要对整个系统环境产生的事件作出响应。可以采用中断方式也可以采用轮询方式来进行处理。如果采用中断方式,则希望ISR(中断服务例程)的处理时间越短越好。

    注:必须说明的是,只有以”FromISR”或”FROM_ISR”结束的API 函数或宏才可以在中断服务例程中。

    2. 延迟中断处理

    图 利用二值信号量实现中断与任务同步

    • 延迟中断的实现

    (1)通过在中断处理中增加二值信号量,中断发生时解除任务的阻塞状态,让任务得以执行,相当于让任务与中断同步;

    (2)这样中断处理例程中就可以做少量的事情,大量的工作放到同步任务中完成;

    (3)将工作量大的事情交给解除阻塞的同步任务来执行,从这个角度上看,中断处理被延迟了,所以称为延迟中断处理。

    注:二值信号量可以理解成一个深度为1的队列。

    • 延迟中断同步任务优先级

    (1)如果中断处理特别紧急,可以将中断退出后的同步任务优先级设为最高,保证中断延迟处理任务随时可以中断其它任务;

    (2)由于中断同步任务紧跟中断处理函数执行,相当于所有的处理都在ISR中完成一样

     注:中断延迟是ISR give信号量,任务take信号量,且再也不用give,这种用法很类似于队列的用法,与其它的任务同步方法有所区别

    3. 相关处理流程举例

    • 处理流程介绍

    (1)handler任务具有比periodic任务高的优先级,handler任务中等待信号量,在periodic任务中触发中断;

    (2)中断处理函数中执行give操作后,并通过一次显示的任务调度保证切换到handler任务处理;

    (3)handler任务获取信号量后继续执行,之后将执行periodic任务

    • 上例中二值信号量的流程

    1. 中断产生。
    2. 中断服务例程启动,给出信号量以使延迟处理任务解除阻塞。
    3. 当中断服务例程退出时,延迟处理任务得到执行。延迟处理任务做的第一件事便是
    获取信号量。
    4. 延迟处理任务完成中断事件处理后,试图再次获取信号量——如果此时信号量无效,
    任务将切入阻塞待等待事件发生。

    4.相关的API处理

    API 说明 参数及返回值
    vSemaphoreCreateBinary 创建二值信号量

    xSemaphore

    创建的信号量

    xSemaphoreTake

    获取(Obtain)”或”接收(Receive)”信号量。只有当信
    号量有效的时候才可以被获取。在经典信号量术中,SemaphoreTake()等同于一次P()操作。不能在中断服务例程中调用

     xSemaphore

    获取得到的信号量

    xTicksToWait

    阻塞超时时间。如果把xTicksToWait 设置为portMAX_DELAY , 并且在

    FreeRTOSConig.h 中设定INCLUDE_vTaskSuspend 为1,那么阻塞等待将没有超时限制。

     xSemaphoreGiveFromISR  

    是xSemaphoreGive()的特殊形式,专门用于中断服务例程中

     xSemaphore

    给出的信号量

    pxHigherPriorityTaskWoken

    对某个信号量而言,可能有不止一个任务处于阻塞态在等待其有效。调用xSemaphoreGiveFromISR()会让信
    号量变为有效,所以会让其中一个等待任务切出阻塞态。如果调用SemaphoreGiveFromISR()使得一个任务解除阻塞,并且这个任务的优先级高于当前任务(也就是被中断的任务),那么SemaphoreGiveFromISR()会在函数内部将*pxHigherPriorityTaskWoken 设为
    pdTRUE。如果xSemaphoreGiveFromISR() 将此值设为pdTRUE,则在中断退出前应当进行一次上下文切换。
    这样才能保证中断直接返回到就绪态任务中优先级最高的任务中(否则会切换到被中断的任务)。

  • 相关阅读:
    RequireJS 模块化加载框架使用
    MySQL数据类型(最大值 和 最小值)
    utf-8的中文是一个字符占几个字节
    spring的事务是什么?与数据库的事务是否一样
    事务和锁机制是什么关系? 开启事务就自动加锁了吗?
    关于数据库主键和外键
    浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景
    TCP/IP协议
    分库分表分区需要考虑的问题及方案
    Redis(十一):Redis的事务功能详解
  • 原文地址:https://www.cnblogs.com/smartjourneys/p/7082163.html
Copyright © 2020-2023  润新知