全局变量在主函数调用过程中被中断修改的问题
在使用环接收串口数据时,在中断中向环区写入数据,在主程序中从环区读出数据。(测试芯片为雅特丽AT32F413)
上边做法经常出现环中数据没有完全读出时ringbuff1.length已经变为0的情况,并且出错一次有1个字节数据未读出。
猜测:
全局变量ringbuff1.length内存原始数据为1,此时程序运行到while中的U1ReadOneFrameData;函数中,处理器在使用ringbuff1.length的值进行连续的运算操作时,这个变量的值将在第一次操作时被复制到中间临时变量中,则紧接其后的其它操作将有可能直接从临时变量中取数以提高运行效率,即处理器从内存中读出ringbuff1.length的值1存入中间临时变量,此时中断条件到达进入中断处理函数void USART2_IRQHandler(void);
中断函数运行完成后ringbuff1.length变为2写入内存,内存中ringbuff1.length值变为2,并且返回while,然后while中的ringbuff1.length经过编译器优化实际为中间临时变量值--,即1-1为0,最后值写入内存,内存中全局变量ringbuff1.length值为0。
但是理想情况下ringbuff1.length值先经过++,在经过--,最后理想值为1。与实际情况不一致所以出错。
修改方法:
避免使用在中断中++,在主函数中--的全局变量ringbuff1.length,即不适用在中断和主函数同时进行了写操作的全局变量,改用只在中断中写的
ringbuff1.tail和在主函数中进行写操作的ringbuff1.head,通过二者判断环中数据是否为空。
转载于:https://www.cnblogs.com/jt930413/p/11017887.html
全局变量在主函数调用过程中被中断修改的问题相关推荐
- 函数调用过程中函数栈详解
当进程被加载到内存时,会被分成很多段 代码段:保存程序文本,指令指针EIP就是指向代码段,可读可执行不可写,如果发生写操作则会提示segmentation fault 数据段:保存初始化的全局变量和静 ...
- 函数调用过程中的栈帧结构及其变化
前言:本文旨在从汇编代码的角度出发,分析函数调用过程中栈帧的变化. 栈帧的简单介绍: 当某个函数运行时,机器需要分配一定的内存去进行函数内的各种操作,这个过程中分配的那部分栈称为栈帧.下图描述了栈帧的 ...
- 从函数调用过程中的堆栈变化理解缓冲区溢出
一.说明 本来是想直接写一个缓冲区溢出的例子,但是一是当前编译器和操作系统有溢出的保护措施没有完全弄清怎么取消,二是strcpy等遇到00会截断需要进行编码这比较难搞,所以最终没有实现. 但已经双看了 ...
- C++ 函数调用过程中栈区的变化——(栈帧、esp、ebp)
C++ 函数调用过程中栈区的变化 1.C++ 函数调用过程中栈区的变化 1.1.程序的内存分布 1.2.函数调用过程中栈的变化解析 参考 1.C++ 函数调用过程中栈区的变化 1.1.程序的内存分布 ...
- c语言函数调用过程中栈的工作原理理解
差不多每个程序员都知道,函数调用过程,就是层层入栈出栈的过程. 那么这个过程中的详细的细节是什么样子的呢? 阅读了以下几篇文章之后,对整个过程基本理解了: C函数调用过程原理及函数栈帧分析 阅读经典- ...
- 汇编中函数调用过程中,栈到底是怎样变化的?call、ret、指令分别有什么样的作用?
1.栈帧的结构:栈帧主要包括三个部分:被保存的%bp,被保存的寄存器.本地变量等,参数区域 2.call指令的作用: 将程序下一条指令的位置的IP压入堆栈中: 转移到调用的子程序 3.ret指令的作用 ...
- Bootloader和App例程,实现M0基于UART的IAP升级功能,升级过程中通信中断,重新上电后Bootloader仍可运行。实现平台:STM32F030R8
https://pan.baidu.com/s/13uaf5Sj5vVwM2kFFp3wxHw 提取码:xwys
- STM32HAL库中断服务函数调用过程
STM32HAL库中断服务函数调用过程 如何找到中断源,如何找到中断源对应的中断服务函数? 中断源在stm32f429xx.h文件中,与中断服务函数一一对应,中断服务函数位于启动文件startup_s ...
- 函数调用过程详解:函数栈帧的创建与销毁
前言:我们在学习C语言的过程中,可以会产生很多疑问,比如: 局部变量是怎么创建的 为什么局部变量的值不做初始化就是随机值 函数是怎么传参的?传参的顺序是怎么样的? 形参和实参是什么关系? 函数调用是怎 ...
最新文章
- 记录一下,以后学Python
- Shell编程基入门
- httpbin.org的使用
- Hdu 1072 【广搜】.cpp
- springboot + kafka
- 协议转换器的特点有哪些?
- 【POJ - 2195】Going Home(二分图最优匹配,费用流 或 KM)
- php流程控制的类型有哪些,流程控制包括哪些内容
- C++笔记-lambda表达式需要注意的地方
- 最新综述|深度学习的单目人体姿态估计
- shell中正则表达式详解_Shell if中的正则表达式使用详解
- 一个好的产品要有一个排查问题、报表、运营等相关工具
- 【Spring笔记】Spring介绍IOC理论推导
- 连续子序列最大和2种方法
- java实现栈的方法
- Scratch(三十五):FlyBird
- ORACLE函数返回数据或字符串
- uni-app 蓝牙通信
- get技能 TCP(ip socket 关系)通信的三次握手和四次撒手的详细流程(顿悟)
- Java 练习题:求平方根
热门文章
- android Butter Knife 使用详解
- C# 垃圾回收机制(转)
- 13.Java核心技术—内部类
- Jquery实现图片左右滚动,没有头尾的,一直循环
- 修改title样式_css常见样式命名规则
- 为什么硬盘速度忽快忽慢_C盘装软件会拖慢电脑速度?C盘是不是比其他盘快?...
- 成都郫县php开发学校_成都各区九年制学校、十二年制学校汇总
- python输出浮点数_Python的数据类型转换,那个很多人知道的知识,你知道吗?
- win10 下载 linux系统安装教程,Win10安装Linux子系统图文教程
- elment-ui文件上传详解