FreeRTOS临界区应用与总结
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临界区应用与总结相关推荐
- FreeRTOS 临界区总结
当一名嵌入式开发人员从裸机开发切换到 基于 FreeRTOS 的开发后就要注意 中断,资源竞争等等问题了. 下面,总结一下 FreeRTOS 临界区的知识及用法: 1. 应用程序使用临界区 1.1 深 ...
- FreeRTOS临界区
FreeRTOS临界区是指那些必须完整运行,不能被打断的代码段,比如有的外设的初始化需要严格的时序,初始化过程中不能被打断. FreeRTOS 在进入临界区代码的时候需要关闭中断,当处理完临界区代 ...
- 【STM32】FreeRTOS临界区
00. 目录 文章目录 00. 目录 01. 概述 02. 任务级临界区代码保护 03.中断级临界区代码保护 04. 预留 05. 预留 06. 附录 07. 参考 01. 概述 临界段代码也叫做临界 ...
- freeRtos学习笔(3)临界区管理
freeRtos学习笔记 freeRtos临界区管理 freeRtos临界区 代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码的执行不被中断,在进入临界段之前须 ...
- 嵌入式中断:如何正确设置中断优先级 (万字总结) - 基于Cortex-M和FreeRTOS
嵌入式中断:深入探讨如何正确设置中断优先级 - 基于Cortex-M和FreeRTOS 1. 如何正确设置中断优先级 2. 从Cortex-M角度 configPRIO_BITS 3. 从RTOS角度 ...
- STM32F103和AIR32F103的FreeRTOS中断优先级
关于 Arm Cortex M 系列内核的中断优先级 Cortex M 的中断和优先级 首先要区分开 中断 和 中断优先级 这是两个不同的东西, 不要搞混了 对于 Cortex-M0 和 Cortex ...
- 【STM32】STM32系列教程汇总(暂时暂停更新...)
00. 目录 文章目录 00. 目录 01. STM32平台简介 02. STM32开发环境 03. STM32初级教程 04. STM32中级教程 05. STM32高级教程 06. FreeRTO ...
- FreeRTOS记录(四、FreeRTOS任务堆栈溢出问题和临界区)
本来计划是消息队列.信号量.任务通知.事件集.邮件的文章 但是因为自己调试的时候遇到了一个问题,还是把堆栈溢出问题放到前面来说 ..增加临界区的使用说明 2021/11/7 ..临界区的使用部分增加任 ...
- FreeRTOS 资源管理之临界区
目录 1.taskENTER_CRITICAL 2.vTaskSuspendAll 3.Mutexes 3.1.Usage 临界区的概念在任何的 SoC 都存在,比如,针对一个寄存器,基本操作为:读- ...
最新文章
- Linux文件目录类命令
- 用VuePress搞定你的博客(一)
- ITK:计算两个图像之间的均方度量值
- TNN MatConvertParam参数scale和bias设置
- maven 排除pom依赖_Maven依赖排除 禁止依赖传递 取消依赖的方法
- [转帖]win10 .Net Runtime Optimization Service占用大量CPU资源解决方法
- create-react-app入门教程
- Oracle解锁scott账号
- tor the onion router下载_人教版英语知识点练习:七年级下册Unit8要点讲解,重点短语句型,语法聚焦(可下载打印版,附答案)...
- ico生成工具ico制作工具ico在线制作
- [CSP-S模拟测试]:走格子(模拟+BFS+Dijkstra)
- Nepxion Discovery(1) 全链路蓝绿发布
- 车间能量看板设计需求,能给个思路吗
- 怎样快速备份电脑文件?
- guava深入理解(3)-字符串,实用方法,函数式编程
- Apache——CVE-2021-41773
- Windows系统又被盯上,出现最新MSHTML漏洞
- 图片分类-python
- Microsoft.NET Framework 4.5.5 官方中文版
- 项目积累 之 权限系统Hub(一)
热门文章
- unittest框架(三)unittest+yaml数据驱动
- [BZOJ 4034][HAOI2015]树上操作(欧拉序列+线段树)
- java基础篇7----java.util中的Scanner类的使用
- TableLayoutPanel
- Android-ImageLoader的最基础的操作
- 策略路由和路由策略的不同
- 字符转十六进制 String = HEX using hexdump on linux
- 简易zlib库解压缩函数封装
- js foreach用法_使用 nodejs 写爬虫(一): 常用模块和 js 语法
- GPU神经网络和JAVA神经网络速度对比