FreeRTOS中断与任务之间同步(Error:..\..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,422 )

这篇具有很好参考价值的文章主要介绍了FreeRTOS中断与任务之间同步(Error:..\..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,422 )。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:

FreeRTOS中,中断需要注意几点:

何时使用中断;中断服务函数(ISR)要处理的数据量有多大,通常我们希望中断的切换越快越好,也就是说,ISR尽量采用耗时较少的处理方式;那该如何操作呢?

一、延迟中断概念 所以为了中断服务函数应该尽量断,因此这里才用中断的前部和中断的后部来处理;

前部:负责处理不耗时的操作,比如任务的同步,发送信号量去通知任务;
后部:负责处理耗时的操作,这时候,中断已经恢复现场,实际执行可以视为软中断,即在一个Task任务中执行;

上述的方式也可以称之为延迟中断处理

思路是:

1)首先创建一个二值信号量去同步任务

2)进入中断发送信号量,让任务解除阻塞,这样在中断服务函数运行完就可以立即执行同步任务。

原理:

1)中断处理可以说是被推迟(deferred)到一个处理(handler)任务中;
2)如果某个中断处理要求特别紧急,其延迟处理任务的优先级可以设为最高,以保证延迟处理任务随时都抢占系统中的其它任务。
3)延迟处理任务就成为其对应的 ISR退出后第一个执行的任务,在时间上紧接着 ISR 执行,相当于所有的处理都在 ISR 中完成一样。

二、中断安全的API

通常需要在中断服务函数(ISR)中调用FreeRTOS的API函数,但许多的API在ISR中是不安全的,其中一些API会将调用的任务转换到阻塞态,如果在ISR中调用了这类API则会出现很多问题。FreeRTOS通过提供两个版本的API来解决这个问题,一个版本供任务调用,一个版本供ISR调用,用于ISR版本的API其函数名都带有"FromISR"后缀。
 

1)那么我同步的信号量的函数为:

xSemaphoreGiveFromISR( PHY_RX_xSemaphore, &xHigherPriorityTaskWoken);

PHY_RX_xSemaphore:定义的二值信号量

2)在中断内不会自动切换到高优先级的任务,需要应用程序设置变量以通知调度器执行上下文切换。中断安全版的API(以“FromISR”结尾的函数) 具有一个名为pxHigherPriorityTaskWoken的指针如果应该执行上下文切换,则中断安全版API函数将(*pxHigherPriorityTaskWoken)设置为pdTRUE,因此,pxHigherPriorityTaskWoken指向的变量必须在第一次使用前初始化为pdFALSE。

初始化:BaseType_t xHigherPriorityTaskWoken = pdFALSE;

API函数只能将(*pxHigherPriorityTaskWoken)设置为pdTRUE,如果ISR调用多个API函数,则可以给每个API传入一个pxHigherPriorityTaskWoken指向的变量,但必须在第一次使用前初始化为pdFALSE。
pxHigherPriorityTaskWoken参数是可选的。如果不需要,将pxHigherPriorityTaskWoken设置为NULL即可。

3)请求上下文切换的宏

taskYIELD() 是一个可以在任务中调用以请求上下文切换的宏。

portYIELD_FROM_ISR() 和portEND_SWITCHING_ISR() 以相同的方式使用,并执行相同的操作。 一些FreeRTOS移植仅提供两个宏中的一个。 较新的FreeRTOS移植提供两种宏。 本文将使用portYIELD_FROM_ISR()宏。
 

那么这个宏的作用就是:portYIELD_FROM_ISR()来执行上下文的切换,前提得根据xHigherPriorityTaskWoken;当xHigherPriorityTaskWoken为pdFALSE,

调用portYIELD_FROM_ISR()将不会发生上下文切换,否则就会发生上下文切换

三、实际应用

下面是我以太网中断应用:

void ETH_IRQHandler(void)//以太网中断
{
  BaseType_t xHigherPriorityTaskWoken = pdFALSE;
  xSemaphoreGiveFromISR( PHY_RX_xSemaphore, &xHigherPriorityTaskWoken);    
  ETH_DMAClearITPendingBit(ETH_DMA_INT_R);
  ETH_DMAClearITPendingBit(ETH_DMA_INT_NIS);
  portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}

/* 定义一个信号量用于PHY接受数据同步 */
SemaphoreHandle_t PHY_RX_xSemaphore;


void NETWORK_Task(void *pvParameters)
{
          for(;;)
          {
                    if(xSemaphoreTake(PHY_RX_xSemaphore,portMAX_DELAY) == pdTRUE)
                    {
                        //执行函数
                    }
          }
}

注:如果在系统中断中要使用FreeRTOS的API函数,然后不带“FromISR”结尾的函数则会串口打印信息回出现
Error:..\..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,422 

FreeRTOS中断与任务之间同步(Error:..\..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,422 ),单片机,stm32

FreeRTOS中断与任务之间同步(Error:..\..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,422 ),单片机,stm32

所以一定要使用API(以“FromISR”结尾的函数文章来源地址https://www.toymoban.com/news/detail-696112.html

到了这里,关于FreeRTOS中断与任务之间同步(Error:..\..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,422 )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 hal库使用笔记之FreeRTOS—任务创建、删除,任务挂起、恢复,任务中断管理

    一、简介 1.FreeRTOS简介     RTOS全称为:Real Time OS,就是实时操作系统,强调的是:实时性。而Free显而易见体现的是其免费性。总的来说这是一个免费的嵌入式实时操作系统。     其特点是:免费开源、可剪裁(独立性强,适应范围广)、简单、优先级/任务不限(但是受到不

    2024年02月04日
    浏览(37)
  • FreeRTOS 中断

    FreeRTOS是一个C库集合,包含了实时内核和模块化库实现互补功能。 免费的实时操作系统,可裁减移植。 demo、license和source。source为主体。 source有三部分 源码.c 、include文件夹里头文件.h和portable文件夹。其中portable文件将FreeRTOS系统软件与MCU芯片建立连接。 中断由硬件产生,当

    2024年02月20日
    浏览(26)
  • FreeRTOS学习-中断管理

    中断管理是一个操作系统中最核心的功能之一。在FreeRTOS中,中断总是可以打断task(尽管是最高优先级的task),而task永远不可能打断中断ISR(interrupt service routine)。本文先介绍了FreeRTOS中的中断管理,然后介绍了中断处理函数中如何使用FreeRTOS的API,最后介绍了中断处理函数

    2024年02月10日
    浏览(69)
  • FreeRTOS教程3 中断管理

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCOM V2.6串口助手 本文主要学习 FreeRTOS 中断管理的相关知识, 包括系统硬件中断、 FreeRTOS 可管理的中断、中断屏蔽和一些其他注意事项等知识 根据STM32CubeMX教程4 EXTI 按键外部

    2024年03月13日
    浏览(31)
  • FreeRTOS 中断配置和临界段

    1. 中断简介 中断是微控制器一个很常见的特性,中断由硬件产生,当中断产生以后 CPU 就会中断当前的流程转而去处理中断服务,Cortex-M 内核的 MCU 提供了一个用于中断管理的嵌套向量中断控制器(NVIC)。 Cotex-M3 的 NVIC 最多支持 240 个 IRQ(中断请求)、1 个不可屏蔽中断(NMI)、1 个

    2023年04月10日
    浏览(24)
  • 【FreeRTOS】详细讲解FreeRTOS里中断管理并通过示例讲述其用法

       大家看到中断后,有没有想到一个名词——异常呢?若大家想到了,但是记不起相关概念;或者是,大家没想到这个名词,没关系, 下面小编就给大家伙讲讲 中断 、 异常 相关知识。 异常   异常,是指任何使CPU执行程序时脱离正常运行状态转而跑飞的任何事件,若

    2024年02月11日
    浏览(32)
  • 【FreeRTOS】【STM32】中断详细介绍

    本篇文章将对下面三种优先级进行概念辨析: Cortex-M3 内核的中断优先级 STM32F1XX 控制器的中断优先级 FreeRTOS 的任务的优先级 “CPU”:“Central Processing Unit”,即中央处理器。它是计算机系统中的主要组件,负责执行指令并进行数据处理和计算。CPU通常由控制单元、算术逻辑

    2024年02月11日
    浏览(30)
  • FreeRTOS任务调度与任务切换 | FreeRTOS八

    目录 说明: 一、任务调度器 1.1、开启任务调度器函数 1.2、任务调度器实现步骤 1.3、xPortStartScheduler()函数 二、启动一个任务 2.1、prvStartFirstTask()函数 2.2、vPortSVCHandler()函数 三、任务切换 3.1、任务切换触发途径 3.2、PendSV中断触发任务切换步骤 关于内容: 1)以下内容多为概

    2023年04月15日
    浏览(23)
  • FreeRtos(Arm M7)中断压栈分析

      目录 1.前言 2.源码分析 2.1 xPortPendSVHandler源码 2.2 pxPortInitialiseStack源码 3. 问题总结          以Arm M7核为例,当CPU响应中断异常时,第一件事就是保存现场,进行压栈。如果当前使用的是任务堆栈,则压入PSP;如果使用的是系统主堆栈,则压入MSP。在压栈的过程中,xP

    2024年02月19日
    浏览(25)
  • FreeRTOS通过消息队列实现串口命令解析(串口中断)

    作者:Jack_G 时间:2023.08.08 版本:V1.0 上次修改时间: 环境: quad quad quad quad STM32Cube MX V6.8.1 quad quad quad quad STM32CubeH7 Firmware Package V1.11.0 / 04-Nov-2022 quad quad quad quad Keil: V5.29 正常配置,不过 需要勾选全局中断 ,后续在接收中断中将接收到的数据送入消息队列。 在usa

    2024年02月14日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包