zoukankan      html  css  js  c++  java
  • 中断处理

    概述

      嵌入式系统需要对整个系统的环境产生的事情做出反应。比如以太网外围部件收到一个数据包。各种源头产生的事件。我们需要考虑的是

    1. 事件如何被检测,通常采用中断。事件输入也可以通过查询获得。
    2. 什么时候采用中断,中断服务处理量有多大。通常中断中处理尽可能短。
    3. 事件要如何通知到主程序,这些代码要如何架构才能最好适应异步处理。

      FreeRTOS提供一系列特性使开发者策略得以实现。(只有以FromISR 或者 FROM_ISR 结束的API或宏才可以在中断服务程序中使用)。

    延迟中断处理

      二值信号量和计数信号量可以让某个特殊的中断发生时,让任务解除阻塞。中断只做快速处理少部分工作。中断处理可以说呗推迟到一个“处理任务中”。中断中抛出信号,处理任务则在阻塞等待信号,当信号到来,阻塞等待任务解除阻塞。

      void vSemaphoreCreateBinary( xSemaphoreHandle xSemaphore ); //create binary semaphore

      portBASE_TYPE xSemaphoreTake( xSemaphoreHandle xSemaphore, portTickType xTicksToWait ); //take a semaphore

      portBASE_TYPE xSemaphoreGiveFromISR( xSemaphoreHandle xSemaphore,

                                          portBASE_TYPE *pxHigherPriorityTaskWoken );
     这里注意第二个参数  
    pxHigherPriorityTaskWoken 如果调用xSemaphoreTake()函数的处理任务的优先级比当前任务要高,那么这个参数被设置为pdTRUE。中断处理中要做检测这个参数,如果为pdTRUE 则做一次手动任务切换

      

      if( xHigherPriorityTaskWoken == pdTRUE )
      {
    

                 /* 给出信号量以使得等待此信号量的任务解除阻塞。如果解出阻塞的任务的优先级高于当前任务的优先 级 – 强制进行一次任务切换,以确保中断直接返回到解出阻塞的任务(优选级更高)。

            说明:在实际使用中,ISR中强制上下文切换的宏依赖于具体移植。此处调用的是基于Open Watcom DOS 移植的宏。其它平台下的移植可能有不同的语法要求。对于实际使用的平台,请参如数对应移植自带的示 例程序,以决定正确的语法和符号。
            */

              portSWITCH_CONTEXT();
      }

      计数信号和二值信号基本操作相同,唯一不同的是 计数信号的保存多个信号资源,就是说可以多次接收信号。这避免了中断丢失的情况。那么这里有一个问题,信号处理任务检测只要有信号量那么就退出阻塞去做相应处理,

      那么如果有多种信号,我们要如何区分信号的种类呢?

      我们可以将信号量和消息队列结合使用,当数据到来我们将数据做一次封装,将数据和数据种类封装成一个消息队列单元,这个在处理任务做通过判断消息种类就可以知道数据是用作什么处理,


    中断嵌套

      建立一个全面中断嵌套模型需要设置 configMAX_SYSCALL_INTERRUPT_PRIRITY  为比 configKERNEL_INTERRUPT_PRIORITY 更高的优先级。在这之间的优先级的中断会被临界区的应用程序阻塞,但是他们可以调用中断安全版本的FreeRTOS API,在configKERNEL_INTERRUPT_PRIORITY优先级之上的任务无法被临界区阻塞

  • 相关阅读:
    迷宫广搜
    通过地址获取百度地图经纬度
    图片上传存储数据库
    spring boot加载配置文件的顺序
    阿里 短信认证
    spring boot properties文件与yaml文件的区别
    springboot pom问题及注解
    手机短信认证
    获取class对象的三种方法以及通过Class对象获取某个类中变量,方法,访问成员
    关于mysql优化问题
  • 原文地址:https://www.cnblogs.com/a-lai/p/7808725.html
Copyright © 2011-2022 走看看