当前位置:首页 > 单片机 > 单片机
[导读]Accessing Absolute Memory Locations绝对存储器访问C编程语言并不支持明确地提定一个静态或全部变量的存储位置。有三种方法可以明确地参考存储器位置:(1)绝对存储器访问宏(2)连接器位置控制(3)关键字_at_Abs

Accessing Absolute Memory Locations

绝对存储器访问

C编程语言并不支持明确地提定一个静态或全部变量的存储位置。有三种方法可以明确地参考存储器位置:

(1)绝对存储器访问宏

(2)连接器位置控制

(3)关键字_at_

Absolute Memory Access Macros

可以使用作为Cx51库一部分的绝对存储器访问宏。使用以下宏可以直接访问存储器区

CBYTE DBYTE PBYTE XBYTE CWORD DWORD

PWORD XWORD

CBYTE的宏定义为:

#define CBYTE ((unsigned char volatile code *)0)

可以这样使用:

rval = CBYTE [0x0002];

读出地下地0002h中的字节内容

DBYTE的定义为:

#define DBYTE ((unsigned char volatile idata *) 0)

可以这样使用:

rval = DBYTE [0x0002];

DBYTE [0x0002] = 5;

(其他定义及用法的见附)

Linker Location Controls

第二种方法是在一个独立的C模块中声明这些变量,并且使用BL51连接器/定位器的定位指令来指定绝对地址。

在以下例子中,假定有一个结构体名字为alarm_control,要把它定位到xdata区的地址2000h。首先在一个源文件ALMCTRL.C中声明这个结构体:

struct alarm_st {

unsigned int alarm_number;

unsigned char enable flag;

unsigned int time_delay;

unsigned char status;

};

xdata struct alarm_st alarm_control;

Cx51编译器为ALMCTRL.C生成一个目标文件,并且包含了一放在xdata存储区的变量段。因为它在这个模块中只有一个变量,那么alarmcontrl是这个段中仅有的变量,这个段名字为?XD?ALMCTRL.

BL51连接器/定位器允许使用定位指令指定任意一个段的基地址。则可以通过以下指令指定变量的位置:

BL51 … almctrl.obj XDATA(?XD?ALMCTRL(2000h))

将变量定位于code, xdata, pdata, idata和data区域的指令见附录

The _at_ Keyword

第三种方法是在声明变量时使用关键字_at_。以下是例示:

struct link {

struct link idata *next;

char code *test;

};

idata struct link list _at_ 0x40; /* list at idata 0x40 */

xdata char text[256] _at_ 0xE000; /* array at xdata 0xE000 */

xdata int i1 _at_ 0x8000; /* int at xdata 0x8000 */

void main ( void ) {

link.next = (void *) 0;

i1 = 0x1234;

text [0] = 'a';

}

Debugging

缺省的,Cx51编译器使用Intel目标格式(OMF-51)做为目标文件的格式并生成全部的符号信息。所有兼容的调试器都可以用来进行程序调试。DEBUG控制指令地目标文件中嵌入调试信息。而且,OBJECTEXTEND控制指令在目标文件中嵌入附加的变量类型信息。这个目标文件允许在使用特定的调试器的时候变量和结构体的类型显示

Cx51使用OMF-2目标文件格式。当使用OMF2指令,C51编译器也使用OMF2格式。OMF2格式需要使用扩展的LX51边接器/定位器,而不能使用BL51连接器/定位器。OMF2目标文件格式提供了精确的调试信息,μVision2调试器和其他一些调试器都支持这一格式。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在C语言编程中,结构体内存对齐是一个容易被忽视却影响深远的关键问题。它不仅关乎程序性能,更直接影响到内存占用效率,尤其在嵌入式系统等资源受限环境中显得尤为重要。本文将深入探讨结构体内存对齐的原理,并分享手动调整与编译器优...

关键字: C语言 内存对齐 编译器

编译器不仅是连接硬件与软件的桥梁,还直接影响MCU的性能优化与功能安全。面对汽车行业对高可靠性、低功耗和高算力的需求,编译器需在确保ASIL-D等严格标准的同时,最大化发挥RISC-V芯片的潜力。

关键字: 车规MCU RISC-V 编译器 HighTec

国内电子信息产业内的厂商正在全球嵌入式系统的发展浪潮中扮演着越来越重要的角色,但随之而来的是国内嵌入式系统和相关芯片企业在出海时也面临越来越多的合规要求,尤其是在保障用户、设备和周边人与物安全的功能安全领域内的合规要求。...

关键字: 嵌入式系统 智能网联 编译器

【2025年4月11日, 德国慕尼黑讯】全球功率系统和物联网领域的半导体领导者英飞凌科技股份公司(FSE代码:IFX / OTCQX代码:IFNNY)推出用于AURIX™、TRAVEO™和PSOC™的可扩展软件包产品组合...

关键字: PSOC 物联网 编译器

瑞典乌普萨拉,2025年3月11日 — 全球领先的嵌入式系统开发软件解决方案供应商IAR在德国纽伦堡举办的embedded world 2025展会上重磅发布全新云端平台。该平台为嵌入式软件开发人员提供前所未有的自由度与...

关键字: 编译器 嵌入式 RISC-V

该统一解决方案为Microchip编译器产品线提供灵活且经济高效的许可选项

关键字: 编译器 嵌入式

当安全标准相互契合:意法半导体 (ST) Stellar MCU取得了风险管理安全标准等级最高的ISO 26262 ASIL D 级认证,现在更有达到同等安全级别的 HighTec Rust 编译器的加持

关键字: 微控制器 编译器

在STM32的开发过程中,开发者可能会遇到各种编译错误,其中“Program file does not exist”是一个较为常见且可能由多种原因引起的错误。这个错误通常意味着编译器在预期的路径下没有找到可执行文件(如...

关键字: STM32 编译器

基于ARM内核的芯片在我们的世界中无处不在,从简单的MCU到高端的应用处理器,各行各业中都有它们的身影。 如今ARM生态系统非常繁荣,在这繁荣的背后编译器的作用功不可没。

关键字: ARM 编译器

台湾新竹-2024 年 11 月 5 日-新唐科技正式推出免费版 Arm® Keil® MDK Nuvoton Edition,成为全球首家提供 Keil MDK 完整版的公司。此专业工具适用于开发基于Arm Corte...

关键字: 编译器 微控制器 嵌入式
关闭