xdata,volatile,extern,static,#pragma 关键字

article/2025/11/7 13:45:32

1. xdata

xdata:声明的变量位于外部 RAM 地址范围内某一位置。

2. volatile

volatile: 的本意是“易变的” ,因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化。当要求使用 volatile 声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不使用 volatile,则编译器将对所声明的语句进行优化。(volatile 关键词影响编译器编译的结果,用 volatile 声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不进行编译优化。)
一句话:使用 volatile 修饰后,每次读取数据都从最原始的地址读取,不会从缓存中读取,得到的数据是实时更新的数据。

注: 编译器对代码的优化是指:CPU 在执行的过程中,因为访问内存的速度远没有 CPU 的执行速度快,为了提高效率,引入了高速缓存 cache。C 编译器在编译时如果不知道变量会被其它外部因素(操作系统、硬件或者其它线程)修改,那么就会对该变量进行标识,即优化。那么这个变量在 CPU 的执行过程中,就会被放到高速缓存 cache 去,进而达到对变量的快速访问。如果我们事先就知道该变量会被外部因素改变,那么我们就在这个变量定义前加上 volatile,这样编译器就不会对该变量进行优化。这样该变量在 CPU 处理的过程当中,就不会被放到高速缓存 cache 中。

3. extern

经过 extern 修饰的变量或者函数,表示可以在另一个文件中引用它,比如一个工程下的不同文件。工程中一个 C 文件中定义一个全局变量 g_Cmd,然后在另一个要使用 g_Cmd 这个变量的 C 文件中使用 extern关键字声明一次,说明这个变量为外部变量,是在其他的c文件中定义的全局变量。
eg:
ex1.c : unsigned char g_Cmd = ;
ex2.c: extern unsigned char g_Cmd;
这样在 ex2.c 就可以使用 ex1.c 定义的 g_Cmd 变量。

4. static

(1)static全局变量:

一个进程在内存中的布局图
在这里插入图片描述

.bss段:保存进程未初始化的全局变量;
.data段:保存进程所有的已初始化的全局变量;
.text段:保存进程所执行的程序二进制文件;

在进程的整个生命周期中,.data 段和 .bss 段内的数据时跟整个进程同生共死的,也就是在进程结束之后这些数据才会寿终就寝。

当一个进程的全局变量被声明为static之后,成为叫静态全局变量。静态全局变量和其他的全局变量的存储地点并没有区别,都是在 .data段( 已初始化)或者 .bss段 (未初始化)内,但是它只在定义它的源文件内有效,其他源文件无法访问它。

静态全局变量有以下特点:
1)该变量在全局数据区分配内存;
2)未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化);
3)静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;静态全局变量不能被其它文件所用;
4)其它文件中可以定义相同名字的变量,不会发生冲突;
(2)static局部变量:

通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。普通的局部变量在栈空间上分配,这个局部变量所在的函数被多次调用时,每次调用这个局部变量在栈上的位置都不一定相同。局部变量也可以在堆上动态分配,但是记得使用完这个堆空间后要释放之。

有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。

static 局部变量中与普通的局部变量的几个区别:

a. 位置:静态局部变量被编译器放在全局存储区 .data (注意:不在 .bss 段内),所以它虽然是局部的,但是在程序的整个生命周期中存在。

b. 访问权限:静态局部变量只能被其作用域内的变量或函数访问。也就是说虽然它会在程序的整个生命周期中存在,由于它是 static 的,它不能被其他的函数和源文件访问。

c. 值:静态局部变量如果没有被用户初始化,则会被编译器自动赋值为0,以后每次调用静态局部变量的时候都用上次调用后的值。每次函数调用静态局部变量的时候都修改它然后离开,下次读的时候从全局存储区读出的静态局部变量就是上次修改后的值。

函数每次被调用,普通局部变量都是重新分配,而静态局部变量保持上次调用的值不变。

静态局部变量有以下特点:

(1) 该变量在全局数据区分配内存;

(2) 静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;

(3) 静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;

(4)它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;需要注意的是由于 static 局部变量的这种特性,使得含静态局部变量的函数变得不可重入,即每次调用可能会产生不同的结果。

(3)static函数:

当程序中有很多个源文件的时候,只需某个源文件提供一些外界需要的接口,其他的函数可能是为了实现这些接口而编写,这些其他的函数你可能并不希望被外界(非本源文件)所看到,这时候就可以用static修饰这些“其他的函数。static 函数可以很好地解决不同源文件中函数同名的问题,因为一个源文件对于其他源文件中的 static 函数是不可见的。

5. #pragma

(1)#pragma 用于指示编译器完成一些特定的动作

(2)#pragma 所定义的很多指示字是编译器特有的(每种编译可能都不一样)

    a. #pragma message 用于自定义编译信息b. #pragma once 用于保证头文件只被编译一次c.#pragama pack 用于指定内存对齐(一般用在结构体)

(3)#pragma在不同的编译器间是不可移植的

1) 预处理器将忽略它不认识 #pragma 指令2) 不同的编译器可能以不同的方式解释同一条 #pragma 指令

http://chatgpt.dhexx.cn/article/X8PY5ZYi.shtml

相关文章

51 单片机 data idata xdata 使用

51 单片机 data idata xdata 使用 简介 该篇文章只提使用,先不详细讲解,使用的原因就是自己写的代码 ROM 超了!!!新建工程默认使用 data Keil 配置如下图 测试芯片FlashRAMSTC15W408AS8Kbyte512byte data idata xd…

TMS XData 4.6.0.1 Full Source XE2-DX10.3

TMS XData 4.6.0.1 Full Source XE2-DX10.3 用于多层REST / JSON HTTP / HTTPS应用服务器开发和ORM远程处理的Delphi框架。 TMS XData功能概述 基于REST / JSON架构样式的服务器 由于它是基于REST / JSON的,因此可以轻松地从不同的客户端平台(如.NET,Jav…

10.扩展数据(XData)

愿你出走半生,归来仍是少年! 环境:.NET FrameWork4.5、ObjectArx 2016 64bit、Entity Framework 6. CAD中所有数据库对象都包含一个可以供开发人员进行自定义的对象:XDATA,本文主要针对此对象进行探索。 XDATA的使用中需要使用到部分DXFCOD…

【51】单片机中的data、idata、xdata、code等关键字的作用

说明 data:RAM低128字节,响应速度最快,采用直接寻址方式 idata:RAM高128字节,采用间接寻址方式,速度相对较慢 bdata:片内RAM,位寻址方式 xdata:外部扩展RAM&#xff…

Kmeans算法

Kmeans算法 是最简单的聚类算法之一,算法接受参数 k ;然后将事先输入的n个数据对象划分为k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得…

图像分割与实战(一)——基于主动轮廓(snake)的图像分割

1.主动轮廓图像分割算法的概述 1.1主要思想 将图像分割问题转化为轮廓进化问题 1.2工作原理 将一条曲线在内外力的共同作用下,使得曲线逐步收敛到目标轮廓 1.3 算法流程 初始化曲线利用内外力更新曲线判断曲线是否收敛,否则返回第2步 1.4 需要解决…

实时实例分割算法Deep Snake,速度32.3fps|CVPR 2020

论文提出基于轮廓的实例分割方法Deep snake,轮廓调整是个很不错的方向,引入循环卷积,不仅提升了性能还减少了计算量,保持了实时性,但是Deep snake的大体结构不够优雅,应该还有一些工作可以补,推…

数字图像处理笔记——Snakes算法、活动轮廓以及水平集(Snakes, active contours, and level sets)

Snakes算法 上一讲我们讲的图像分割算法主要是基于像素的,这一讲主要是基于曲线的。我们希望能得到一个能够包围住图像轮廓的平滑的曲线,snakes算法就是一个很有用的算法。首先我们将曲线的坐标x、y同一用参数s表示,s范围从0-1代表从起点绕曲…

Deep Snake for Real-Time Instance Segmentation:基于Deep Snake的实例实时分割

本文针对自己所看的 Deep Snake 做一个总结和存档,也方便其他同学学习 —— 阿波,2020.4.23 论文原文:Deep Snake for Real-Time Instance Segmentation 代码地址: snake 本篇文章工作有以下贡献: •提出了一种基于…

KMeans算法流程

一、什么是簇? 我们知道聚类就是让机器把数据集中的样本按照特征的性质分组,直观上来看,簇是一组一组聚集在一起的数据,在 一个簇 中的数据就认为是 同一类 ,簇就是聚类的结果表现。实际上簇并没有明确的定义&#xf…

HZNUCTF MISC Snake题解——python程序逆向,hashcat爆破sha256

目录 一.Dump得到pyc文件 二.pyc反编译得到py源码 三.分析程序逻辑 四.hashcat爆破 题目附件链接:https://pan.baidu.com/s/1CcS8BPGx8fKnsJgRvEi0bA?pwdt2yj 提取码:t2yj 一.Dump得到pyc文件 使用命令:python pyinstxtractor.py snake.exe 二.p…

DeepSnake实现实例分割

文章目录 简介:环境配置Demo实现全文总结参考文献 简介: DeepSnake(Deep Snake for Real-Time Instance Segmentation)作为CVPR 2020 oral论文,在实例分割任务上取得了实时分割效果的同时,还保持着非常不错的性能,该论…

【主动轮廓模型(二)】《GVF Snake》算法原理与OpenCV实现

文章目录 1 问题引入1.1 传统Snake模型的缺陷1.2 亥姆霍兹定理(Helmholtz theorem) 2 GVF Snake2.1 边缘图(Edge Map)2.2 梯度矢量流(Gradient Vector Flow,GVF)2.3 数值求解方法 3 OpenCV实现 …

用于实时实例分割的Deep Snake算法

第一部分:创新及其优点 第二部分:算法原理 第三部分:实验过程 第四部分:程序逻辑 1 创新及其优点 Deep Snake算法建立在传统Snake算法的基础上,将snake算法做成了轮廓结构化特征学习的方法,使用了循环卷积…

KMeans 算法(一)

K-means算法简述 K-means算法,也称为K-平均或者K-均值,一般作为掌握聚类算法的第一个算法。这里的K为常数,需事先设定,通俗地说该算法是将没有标注的 M 个样本通过迭代的方式聚集成K个簇。在对样本进行聚集的过程往往是以样本之间…

选择性搜索算法(Selective Search )——SS算法

文章目录 一、前言二、object Detection VS object Recognition(Selective Search的提出)2.1object recognition与object detection的关系2.2滑动窗口方法的局限性2.3Selective search算法的提出 三、Selective Search算法3.1什么是Selective Search&…

主动轮廓模型——Snake分割算法(MATLAB)

学习图像分割算法,在网上找到的关于主动轮廓模型的实现代码,自己简化总结了一下,在这里和大家分享,欢迎提问 snake是一种能量最小的曲线,表示为v(s) (x(s), y(s)), s为归一化的曲线长度,s∈[0, 1]。 能量…

麻雀搜索算法(Sparrow Search Algorithm,SSA)

文章目录 1 算法思想2 算法步骤3 求解函数最值(Python实现)4 算法进阶直接改进SSA融合别的智能优化算法来改进SSASMA及其改进的应用 原论文: [1]薛建凯. 一种新型的群智能优化技术的研究与应用[D].东华大学,2020. 1 算法思想 借鉴生物行为&a…

CVPR2020分割算法Deep Snake的配置(Deep Snake for Real-Time Instance Segmentation)

这篇文章为分割提供了新思路,很有参考意义。 注:原代码的运行环境为Ubuntu,本文在Windows10系统下完成配置。 1、论文下载: Deep Snake for Real-Time Instance Segmentation [paper][code] 2、代码下载: https:/…

图像分割之(五)活动轮廓模型之Snake模型简介

图像分割之(五)活动轮廓模型之Snake模型简介 zouxy09qq.com http://blog.csdn.net/zouxy09 在“图像分割之(一)概述”中咱们简单了解了目前主流的图像分割方法。下面咱们主要学习下基于能量泛函的分割方法。这里学习下Snake模型…