Global Variable Address Modifier (@address)

You can assign global variables to specific addresses with the global variable address modifier. These variables are called ‘absolute variables‘. They are useful for accessing memory mapped I/O ports and have the following syntax:

Declaration = [@

|@""]

[= ];

is the type specifier, e.g., int, char

is the identifier of the global object, e.g., i, glob

is the absolute address of the object, e.g., 0xff04, 0x00+8

is the value to which the global variable is initialized.

A segment is created for each global object specified with an absolute address. This address must not be inside any address range in the SECTIONS entries of the link parameter file. Otherwise, there would be a linker error (overlapping segments). If the specified address has a size greater than that used for addressing the default data page, pointers pointing to this global variable must be "__far". An alternate way to assign global variables to specific addresses is (Listing 8.8).

Listing 8.8 Assigning global variables to specific addresses

#pragma DATA_SEG [__SHORT_SEG]

setting the PLACEMENT section in the linker parameter file. An older method of accomplishing this is shown in Listing 8.9.

Listing 8.9 Another means of assigning global variables to specific addresses

INTO READ_ONLY

;

Listing 8.10 is a correct and incorrect example of using the global variable address modifier and Listing 8.11 is a possible PRM file that corresponds with example Listing.

Listing 8.10 Using the global variable address modifier

//看这意思,就是把int型变量glob地址从0x0500开始,并把值10初始化时放在0x0500

int glob @0x0500 = 10; // OK, global variable "glob" is

// at 0x0500, initialized with 10

void g() @0x40c0; // error (the object is a function)

void f() {

int i @0x40cc; // error (the object is a local variable)

}

全局变量地址修饰符(@address)

您可以使用全局变量地址修饰符将全局变量分配给特定地址。这些变量称为“绝对变量”。它们对于访问内存映射的I / O端口很有用,并具有以下语法:

声明= [@ | @“ ”]

[= ];

是类型说明符,例如int,char

是全局对象的标识符,例如i,glob

是对象的绝对地址,例如0xff04、0x00 + 8

是全局变量初始化到的值。

将为每个用绝对地址指定的全局对象创建一个段。该地址不得在链接参数文件的SECTIONS条目中的任何地址范围内。否则,将出现链接器错误(重叠段)。如果指定的地址的大小大于用于寻址默认数据页的大小,则指向此全局变量的指针必须为“ __far”。将全局变量分配给特定地址的另一种方法是(清单8.8)。

清单8.8将全局变量分配给特定地址

#pragma DATA_SEG [__SHORT_SEG]

在链接器参数文件中设置PLACEMENT部分。清单8.9显示了完成此操作的较旧方法。

清单8.9将全局变量分配给特定地址的另一种方法

INTO READ_ONLY ;

清单8.10是使用全局变量地址修饰符的正确和不正确的示例,清单8.11是与示例清单相对应的可能的PRM文件。

清单8.10使用全局变量地址修饰符

//看这意味着,就是把int型变量glob地址从0x0500开始,并把值10初始化时放在0x0500

int glob @ 0x0500 = 10; //确定,全局变量“ glob”为

//在0x0500处,以10初始化

无效g()@ 0x40c0; //错误(对象是一个函数)

无效f(){

int我@ 0x40cc; //错误(对象是局部变量)

}

主要在嵌入式内应用多,将某一变量名称指向寄存器的地址处,之后对此地址处寄存器的操作(赋值)只需要对此变量名操作即可

以pic16F877A中pic16F877.h头文件对寄存器地址的命名举例

static volatile unsigned char INDF @0x00;

static volatile unsigned char TMR0 @0x01;

这里将0x00地址处赋予INDF,而INDF对应多少位呢,unsigned char限定INDF表示8位,这样就对0x00物理地址下的8位寄存器命名了一个变量,之后操作此地址下寄存器只需要操作此变量即可,不需要在记忆寄存器的地址是什么,只需要记住它对应的变量名即可,毕竟记名字要比一系列数字要好的多;

还可以使用指针符号来对某一地址下寄存器进行命名举例说明

以上面情况举例

#define INDF (static volatile unsigned char *)0x00;

将0x00强制类型转换为unsigned char 的指针类型 并对它赋予另外一个名字INDF

原文:https://www.cnblogs.com/zhj868/p/14158011.html

c语言中19可以用什么字母表示什么意思,C语言中的 @ 符号是什么意思?相关推荐

  1. 计算机网络符号意思,浅析网络语言中的符号网语_计算机网络论文.doc

    浅析网络语言中的符号网语_计算机网络论文.doc 浅析网络语言中的符号网语_计算机网络论文 浅析网络语言中的符号网语_计算机网络论文 论文关键词:符号网语特征成因规范 论文摘要:随着网络的普及,网络语 ...

  2. c语言编译undeclared,c语言中undeclared identifier是什么意思?,undeclared identifier c语言错误 怎么改...

    c语言中undeclared identifier是什么意思?c语言中未声明的标识符是什么意思?,"未声明的标识符"指"未声明的标识符",是c语言中的错误提示: ...

  3. php seekdir,C++_详解C语言中telldir()函数和seekdir()函数的用法,C语言telldir()函数:取得目录流 - phpStudy...

    详解C语言中telldir()函数和seekdir()函数的用法 C语言telldir()函数:取得目录流的读取位置头文件: #include 定义函数: off_t telldir(DIR *dir ...

  4. c语言字母输出什么意思,C语言中字符的输入输出以及计算字符个数的方法详解...

    C语言字符输入与输出 标准库提供的输入/输出模型非常简单.无论文本从何处输入,输出到何处,其输入/输出都是按照字符流的方式处理.文本流是由多行字符构成的字符序列,而每行字符则由 0 个或多个字符组成, ...

  5. c语言中小数的表示字母,互联网常识:c语言中保留两位小数怎么表示

    在C语言中,表示方法为"%.2lf",语法格式为"printf("%.2lf,%.2lf\n",元素)"."%.2lf" ...

  6. c语言中输出字母时有个感叹号,C语言中的双感叹号的作用

    两个!是为了把 非0值 转换成1,而0值还是0. 因为C语言中,所有 非0值 都表示真.所以!非0值 = 0,而!0 = 1. 所以!!非0值 = 1,而!!0 = 0. 示例如下: #include ...

  7. c语言中字母大写转小写,C语言中字母大小写转换的简单操作

    大写字母要转换小写字母,要怎么操作呢?而在C语言开发中,我们经常会遇到这样或者那样的问题,别着急,爱站技术频道为你细细道来C语言中字母大小写转换的简单操作. C语言tolower()函数:将大写字母转 ...

  8. C语言中fun的功能是将字符串,下列给定的程序中,fun()函数的功能是:将p所指字符串中......

    下列给定的程序中,fun()函数的功能是:将p所指字符串中每个单词的最后一个字母改成大写(这里的"单词"是指有空格隔开的字符串).例如,若输入: I am a student to ...

  9. c语言中floox的头文件,PC-1211袖珍计算机在合成氨厂生产中的应用 第五讲 循环语句(FOR-NEXT语句)...

    PC-1211袖珍计算机在合成氨厂生产中的应用 第五讲 循环语句(FOR-NEXT语句) 在化工生产中为了分析两个或两个以上参数对生产的影响往往需要进行某些有规律的重复计算.这些计算在程序中可以用赋值 ...

最新文章

  1. 抖音的标题写什么内容_看了这篇文章,我才真正明白什么才是英语速成之路!感恩...
  2. 埃夫特机器人回零偏差太大_新松、华中数控、埃斯顿、埃夫特国内主流机器人厂商近年最新动态...
  3. PaaS服务之路漫谈(一)
  4. 一个将当前目录下HEX文件的第一行数据删除的程序...
  5. boost::units模块实现绝对温度和温差的华氏和开尔文之间的转换的测试程序
  6. 基于javaSpringboot+mybatis+layui的装修验收管理系统设计和实现
  7. win7字体大小怎么设置_XP,win7系统怎么设置自动关机
  8. 「代码随想录」322. 零钱兑换 【动态规划】力扣详解!
  9. Tomcat 简单容器化
  10. Python中的交叉分析pivot_table
  11. C++ 查重(码蹄集 新手村)
  12. 【C语言】分类统计字符个数(多行输入字符串)
  13. 【那些年,我们一起追得女孩】第十五章
  14. 2021牛客寒假算法基础集训营1 E.三棱锥之刻
  15. 火车站的江湖,远比你想象的深
  16. JavaScript倒计时牌
  17. MATLAB 使用PLS建模并预测
  18. 软件Bug五种等级,一级最致命
  19. 计算机专业专科毕业设计题目,计算机专业毕业设计题目
  20. 企业如何在组织架构改变时,来实现员工的人岗匹配

热门文章

  1. 无线耳机什么牌子的好?内行盘点四款好用的蓝牙耳机
  2. Unity——小地图实现的办法
  3. 教程向|如何更好还原褶皱,ZBrush雕刻褶皱的技巧
  4. qt、c++实现ping,检测网络连通性
  5. 关于php switch中的一些坑
  6. C# vb .NET生成QR二维码
  7. vista下装xp双系统
  8. linux安装宝塔 VNC,Linux 安装宝塔面板(CentOS 8.2)
  9. 超分辨率重建——病态问题
  10. 操作系统修真秘籍汇总(直达元婴期)