freertos实时操作系统临界段保护开关中断及进入退出

Freertos(Free Real-Time Operating System)是一款开源的实时操作系统,可在嵌入式系统中使用。在使用Freertos时,尤为需要注意其临界段保护机制,以确保数据在多任务并发执行时的正确性。下面将详细讲解如何开启临界段保护、如何开关中断、以及进入和退出临界段的方法。

一、开启临界段保护

在单核处理器中,开启临界段保护需要关闭中断,以免在关键时刻被打断。在FreeRTOS中,可以通过以下代码段来开启临界段保护:

taskENTER_CRITICAL( );
// 访问保护数据
taskEXIT_CRITICAL( ); 

taskENTER_CRITICAL()函数将禁用所有可中断的中断源,并记录当前中断计数器(在多核处理器中有所不同,并不能完全禁用中断)。在taskENTER_CRITICAL()函数之后和taskEXIT_CRITICAL()函数之前,所有可中断的中断源均会被禁用。同时,这两个函数是可嵌套的,即可以多次调用,但需要满足进入与退出次数的匹配关系,即进入与退出的次数必须一致。

临界段保护的开启可以帮助对共享数据进行正确而安全的访问。

二、开关中断

在开启临界段保护之前,我们需要关闭中断,避免在关键时刻被打断。而在任务执行完毕,退出临界段时,需要重新开启中断,使其他任务可以正常执行。在FreeRTOS中,我们可以通过以下代码段开关中断:

portDISABLE_INTERRUPTS( );   // 关闭中断
// 访问保护数据
portENABLE_INTERRUPTS( );    // 重新开启中断

其中,portDISABLE_INTERRUPTS()函数用于禁用中断,portENABLE_INTERRUPTS()函数用于重新开启中断。需要注意的是,在调用portDISABLE_INTERRUPTS()函数禁用中断后,一定要严格遵守上述说明,在临界段结束之前一定要调用portENABLE_INTERRUPTS()函数重新开启中断,否则会导致系统中断无效甚至死机等问题。

三、进入和退出临界段

在任务执行过程中,我们需要进入和退出临界段,以确保对共享数据的访问是正确和安全的。在进入临界段时,通过禁止中断、调用taskENTER_CRITICAL()函数获取系统锁和记录进入次数等方式保证了访问共享数据的独占性。而在任务执行完毕退出临界段时,同样需要释放系统锁、解除对共享数据的访问限制,重新开启中断等操作。下面通过两个示例来详细说明。

示例一:

uint32_t shared_data;  // 定义全局共享变量

void task1( void *pvParameters )
{
    while(1)
    {
        vTaskDelay(500);   // 延时500毫秒
        taskENTER_CRITICAL( );   // 进入临界段
        shared_data = 1;    // 访问共享变量
        taskEXIT_CRITICAL( );    // 退出临界段
    }
}

void task2( void *pvParameters )
{
    while(1)
    {
        vTaskDelay(1000);   // 延时1000毫秒
        taskENTER_CRITICAL( );   // 进入临界段
        shared_data = 2;   // 访问共享变量
        taskEXIT_CRITICAL( );  // 退出临界段
    }
}

这个例子中,shared_data是两个任务都要使用的共享变量。在两个任务中,通过vTaskDelay()函数进行延时操作,以模拟实际场景中的任务间隙。进入和退出临界段时,分别使用taskENTER_CRITICAL()taskEXIT_CRITICAL()函数。

示例二:

uint32_t shared_data;   // 定义全局共享变量

void task1( void *pvParameters )
{
    while(1)
    {
        vTaskDelay(50);   // 延时50毫秒
        portDISABLE_INTERRUPTS();   // 关闭所有中断
        shared_data += 1;    // 访问共享变量
        portENABLE_INTERRUPTS();   // 重新开启所有中断
    }
}

void task2( void *pvParameters )
{
    while(1)
    {
        vTaskDelay(100);   // 延时100毫秒
        portDISABLE_INTERRUPTS();   // 关闭所有中断
        shared_data += 2;    // 访问共享变量
        portENABLE_INTERRUPTS();  // 重新开启所有中断
    }
}

这个例子中,shared_data同样是两个任务都要使用的共享变量。在两个任务中,通过vTaskDelay()函数进行延时操作,以模拟实际场景中的任务间隙。在访问shared_data前,分别使用portDISABLE_INTERRUPTS()函数和portENABLE_INTERRUPTS()函数关闭和开启所有中断。同时,使用这种方法进入和退出临界段时并不需要使用taskENTER_CRITICAL()以及taskEXIT_CRITICAL()函数,而是通过开关中断的方式实现。

以上就是使用FreeRTOS时开启临界段保护、开关中断以及进入和退出临界段的详细攻略。在设计多任务嵌入式系统时,建议对共享数据进行特别关注和保护,确保多任务并发执行的安全和正确性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:freertos实时操作系统临界段保护开关中断及进入退出 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • jQuery 实现自动填充邮箱功能(带下拉提示)

    jQuery 实现自动填充邮箱功能(带下拉提示)攻略 简介 自动填充邮箱功能是指在用户输入邮箱前缀时,通过下拉提示的方式提供常见的邮箱后缀选项,方便用户选择并自动填充完整的邮箱地址。这种功能在注册、登录等场景中常见,可以提高用户体验和减少输入错误。 实现步骤 步骤 1: 引入 jQuery 库 首先,确保你的页面中已经引入了 jQuery 库。你可以通过以下…

    other 2023年8月6日
    00
  • iOS7 Beta4下载地址收集汇总来自百度网盘

    iOS7 Beta4下载地址收集汇总来自百度网盘攻略 简介 在本攻略中,我们将详细讲解如何获取iOS7 Beta4的下载地址,并汇总这些地址来自百度网盘。iOS7 Beta4是苹果公司发布的iOS7操作系统的测试版本,它包含了一些新功能和改进,因此对于开发者和技术爱好者来说是非常有吸引力的。 步骤 步骤1:访问百度网盘 首先,打开你的浏览器,并访问百度网盘的…

    other 2023年8月4日
    00
  • Android数据库相关整理

    Android数据库相关整理 Android作为目前最为流行的智能手机操作系统之一,其应用程序的数据存储涉及到SQLite、Room等多个数据库框架,针对这些框架的使用规范及优势劣势进行整理,提供给开发者更好的选择。 SQLite SQLite是Android内置的轻量级关系型数据库,是一种无需单独安装,即可直接使用的文件型数据库;由于其体积小、速度较快,被…

    其他 2023年3月28日
    00
  • 加载gif动画的三种方式

    加载GIF动画的三种方式的完整攻略 GIF动画是一种常见的动画格式,可以用于网站、应用程序和其他数字媒体中。本文将介绍加载GIF动画的三种方式,包括使用HTML、CSS和JavaScript。在介绍每种方式时,将提供至少两个示例说明。 使用HTML加载GIF画 使用HTML加载GIF动画是最简单的方法之一。可以使用<img>标签来加载GIF动画。…

    other 2023年5月9日
    00
  • cad构造线怎么使用? CAD利用构造线平分夹角的教程

    CAD构造线的使用攻略 CAD软件中的构造线是一种用于辅助绘图和设计的工具,可以用来平分夹角、定位点位、创建对称图形等。下面是使用CAD构造线的详细攻略,包含两个示例说明。 1. 平分夹角 平分夹角是CAD中常见的操作,可以通过构造线来实现。以下是平分夹角的步骤: 打开CAD软件并创建一个新的绘图文件。 绘制两条线段,表示待平分的夹角。 选择“构造线”工具,…

    other 2023年8月6日
    00
  • 中文用户名的js检验正则

    以下是详细的中文用户名的js检验正则的攻略: 1. 确定用户名要求 在正则表达式编写之前,首先需要确定中文用户名的具体要求。一般而言,中文用户名要求如下: 由中文字符组成(包括中文字符、汉字、繁体字等) 长度为2到15个字符之间 可以包含数字、字母或下划线,但不能以这些字符开头或结尾 2. 编写正则表达式 根据上述要求,可以编写出如下正则表达式: /^[\u…

    other 2023年6月27日
    00
  • 开发 Internet Explorer 右键功能表(ContextMenu)

    开发 Internet Explorer 右键功能表(ContextMenu) 的完整攻略 Internet Explorer 是一款著名的浏览器,如何在 IE 中开发自定义的右键菜单呢?本文将介绍开发 Internet Explorer 右键功能表(ContextMenu) 的完整攻略。 准备工作 在开始开发之前,需要准备以下工作: 编写一个 JavaSc…

    other 2023年6月27日
    00
  • 深入了解Java核心类库–String类

    下面是深入了解Java核心类库–String类的完整攻略。 String类简介 Java中的String类属于Java标准库的一部分,是一个非常基础的类,它代表着字符串类型的数据。在Java中,字符串使用双引号(“”)表示,而String类提供了非常丰富的操作字符串的方法,并且String类是一个final类,也就是说它不能被继承。 创建String对象 …

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部