https://blog.csdn.net/chipsea_mltsum/article/details/85612939

项目背景:

做一个测量阻抗脉搏波的设备,设备功能其中之一是采集阻抗信号,通过一个高精度ADC转换为AD值,并将AD值输出。软件模块示例如下:

if (CS1259Ready())             //等待ADC转换完成
 
    {
    
        Z13Adc = ReadADC();        //转换完成后读取ADC值;
        printf("%d\t\t",Z13Adc); 
        Z13Res = CalRes(Z13Adc);    //通过ADC值计算阻抗值
        printf("%d\r\n",Z13Res);
        
        vTaskDelay(5/portTICK_RATE_MS);
    }
遇到的问题:

在连续读取ADC值时,会随机的中断测量,导致测量停止,或者可能会随机的发送错误数据,经排查非串口传输的原因。且传输错误的数据通常为随机性的产生FF,例如24bit的ADC,会出现后几个bit为F的情况。现象如下:

问题分析:

用逻辑分析仪抓取 ,发现是ADC的读取程序在读取过程中,受到了中断的干扰,导致其去做其他事情了。

例如:正常读取进程时,通信帧的情况如下:

而出现上述情况时,通信帧的情况如下:

因此软件需保证读取任务进程不能被其他中断干扰。这里采用了FreeRTOS临界区的方式实现。代码示例如下图:

if (CS1259Ready())             //等待AD开始信号
    {
        taskENTER_CRITICAL();        //进入临界区
 
        Z13Adc = ReadADC();
        printf("%d\t\t",Z13Adc); 
        Z13Res = CalRes(Z13Adc);
        printf("%d\r\n",Z13Res);
 
        taskEXIT_CRITICAL();         //退出临界区
        vTaskDelay(5/portTICK_RATE_MS);
    }
FreeRTOS中临界区总结:

1)互斥的概念?

访问一个被多任务共享,或是被多任务和中断共享的资源时,需要采用“互斥”技术以保证数据在任何时候都保持一致性。这样做的目的是要确保任务从开始访问资源就具有排它性,直到这个资源又恢复到完整状态。

2)什么是基本临界区?

基本临界区是指宏taskENTER_CRITICAL()和taskEXIT_CRITICAL()之间的代码区间。也被称为Critical Section或者Critical Regions. 使用方法如下:

// 为了保证PORTA的访问不被中断,将访问操作放入临界区运行
taskENTER_CRITICAL();        //进入基本临界区
 
// 在taskENTER_CRITICAL()和taskEXIT_CRITICAL()之间不会切换到其他任务,中断可以执行,也允许嵌
//套,但只是针对优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY的任务,而且这些中断不允许访问
//FreeRTOS的API函数。
 
PORTA |= 0x01;
 
 
taskEXIT_CRITICAL();        //退出基本临界区
3)基本临界区的原理?

临界区是提供互斥功能的一种非常原始的实现方法。临界区的工作 仅仅是简单的把中断全部关掉,或者是关掉优先级在configMAX_SYSCALL_INTERRUPT_PRIORITY以下的中断-依赖具体使用的FreeRTOS移植。抢占式的上下文切换只可能在某中断中完成,因此调用taskENTER_CRITICAL()可以在中断关闭的时段一直保持持续运行状态直到退出临界区。

4)基本临界区使用注意事项?

临界区必须具有很短的时间,否则会反过来影响中断的响应时间。在每次使用taskENTER_CRITICAL()之后必须尽快的配套一个taskEXIT_CRITICAL()来退出临界区。

如何用挂起调度器来创建临界区?

挂起调度器也被称为锁定调度器。

vTaskSuspendAll(void);   //挂起调度器创建临界区(禁止任务调度 suspend the scheduler)
 
/*
   通过vTaskSuspendAll()来挂起调度器。挂起调度器可以停止上下文切换而不用关中断,如果某个中断在调
度器挂起过程中要求进行上下文切换,则这个要求也会被挂起,直到调度器被唤醒后才会得到执行。
*/
 
vTaskResumeAll(void);  //(解除禁止任务调度 resuming the scheduler; 成对使用)
/*
返回值:pdTRUE: 
   在调度器挂起过程中,上下文切换请求也会被挂起,直到调度器唤醒才被执行,如果一个挂起的上下文切换请求在vTaskResumeAll()返回前得到执行,则返回pdTRUE.
返回值:pdFALSE:
   如果是其他情况,则返回pdFALSE.
*/
 
// 注意1:两个函数成对使用;
// 注意2:两者之间不能调用FreeRTOS系统API.
     基本临界区是保护一段代码区间不被其他任务或中断打断。而由挂起调度器实现的临界区只能保护一段代码不被其他任务打断,并不能约束中断,因为在这种方式下,中断是使能的。

调度器处于挂起状态时,不能调用FreeRTOS的API函数。

--------------------- 
作者:滴水石穿裤子 
来源:CSDN 
原文:https://blog.csdn.net/chipsea_mltsum/article/details/85612939 
版权声明:本文为博主原创文章,转载请附上博文链接!

FreeRTOS临界区应用与总结相关推荐

  1. FreeRTOS 临界区总结

    当一名嵌入式开发人员从裸机开发切换到 基于 FreeRTOS 的开发后就要注意 中断,资源竞争等等问题了. 下面,总结一下 FreeRTOS 临界区的知识及用法: 1. 应用程序使用临界区 1.1 深 ...

  2. FreeRTOS临界区

      FreeRTOS临界区是指那些必须完整运行,不能被打断的代码段,比如有的外设的初始化需要严格的时序,初始化过程中不能被打断. FreeRTOS 在进入临界区代码的时候需要关闭中断,当处理完临界区代 ...

  3. 【STM32】FreeRTOS临界区

    00. 目录 文章目录 00. 目录 01. 概述 02. 任务级临界区代码保护 03.中断级临界区代码保护 04. 预留 05. 预留 06. 附录 07. 参考 01. 概述 临界段代码也叫做临界 ...

  4. freeRtos学习笔(3)临界区管理

    freeRtos学习笔记 freeRtos临界区管理 freeRtos临界区 代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码的执行不被中断,在进入临界段之前须 ...

  5. 嵌入式中断:如何正确设置中断优先级 (万字总结) - 基于Cortex-M和FreeRTOS

    嵌入式中断:深入探讨如何正确设置中断优先级 - 基于Cortex-M和FreeRTOS 1. 如何正确设置中断优先级 2. 从Cortex-M角度 configPRIO_BITS 3. 从RTOS角度 ...

  6. STM32F103和AIR32F103的FreeRTOS中断优先级

    关于 Arm Cortex M 系列内核的中断优先级 Cortex M 的中断和优先级 首先要区分开 中断 和 中断优先级 这是两个不同的东西, 不要搞混了 对于 Cortex-M0 和 Cortex ...

  7. 【STM32】STM32系列教程汇总(暂时暂停更新...)

    00. 目录 文章目录 00. 目录 01. STM32平台简介 02. STM32开发环境 03. STM32初级教程 04. STM32中级教程 05. STM32高级教程 06. FreeRTO ...

  8. FreeRTOS记录(四、FreeRTOS任务堆栈溢出问题和临界区)

    本来计划是消息队列.信号量.任务通知.事件集.邮件的文章 但是因为自己调试的时候遇到了一个问题,还是把堆栈溢出问题放到前面来说 ..增加临界区的使用说明 2021/11/7 ..临界区的使用部分增加任 ...

  9. FreeRTOS 资源管理之临界区

    目录 1.taskENTER_CRITICAL 2.vTaskSuspendAll 3.Mutexes 3.1.Usage 临界区的概念在任何的 SoC 都存在,比如,针对一个寄存器,基本操作为:读- ...

最新文章

  1. Linux文件目录类命令
  2. 用VuePress搞定你的博客(一)
  3. ITK:计算两个图像之间的均方度量值
  4. TNN MatConvertParam参数scale和bias设置
  5. maven 排除pom依赖_Maven依赖排除 禁止依赖传递 取消依赖的方法
  6. [转帖]win10 .Net Runtime Optimization Service占用大量CPU资源解决方法
  7. create-react-app入门教程
  8. Oracle解锁scott账号
  9. tor the onion router下载_人教版英语知识点练习:七年级下册Unit8要点讲解,重点短语句型,语法聚焦(可下载打印版,附答案)...
  10. ico生成工具ico制作工具ico在线制作
  11. [CSP-S模拟测试]:走格子(模拟+BFS+Dijkstra)
  12. Nepxion Discovery(1) 全链路蓝绿发布
  13. 车间能量看板设计需求,能给个思路吗
  14. 怎样快速备份电脑文件?
  15. guava深入理解(3)-字符串,实用方法,函数式编程
  16. Apache——CVE-2021-41773
  17. Windows系统又被盯上,出现最新MSHTML漏洞
  18. 图片分类-python
  19. Microsoft.NET Framework 4.5.5 官方中文版
  20. 项目积累 之 权限系统Hub(一)

热门文章

  1. unittest框架(三)unittest+yaml数据驱动
  2. [BZOJ 4034][HAOI2015]树上操作(欧拉序列+线段树)
  3. java基础篇7----java.util中的Scanner类的使用
  4. TableLayoutPanel
  5. Android-ImageLoader的最基础的操作
  6. 策略路由和路由策略的不同
  7. 字符转十六进制 String = HEX using hexdump on linux
  8. 简易zlib库解压缩函数封装
  9. js foreach用法_使用 nodejs 写爬虫(一): 常用模块和 js 语法
  10. GPU神经网络和JAVA神经网络速度对比