由于在暑假匆忙接收的嵌入式项目中需要使用特别大的数组,非分页RAM的内存不够用了,没办法,硬着头皮尝试使用分页RAM,但是完全没有单片机的基础,导致极其的困难。之前写程序都是按照纯软件的思维,主要考虑架构,不会考虑到每个变量具体存在哪个物理地址这么底层的问题,结果被飞思卡尔这分页地址、prm文件什么的搞得一头雾水,而网上的资料又少,讲的又大同小异的笼统,最后写出来的程序因为这分页地址的原因存在各种问题(还以为把变量放到分页RAM了,结果现在稍微懂了点回去看,发现其实很多根本还是分配在非分页区。晕倒~。但是居然还能相对正常运行也是很神奇)。这些天各种找相关的资料,结果发现在CodeWarrior的官方文档资料里其实把我想知道的都讲的很清楚了(还是官方文档给力,以后学什么东西直接找官方文档,不去到处找网上一堆零零散散的资源来学了)。本着学习的态度,将逐步把官方文档翻译一遍,供大家一起交流学习进步。
翻译的资料是公开的,我想应该不会有什么版权问题,如涉及版权问题,请联系我删除文章,原文档在这里(https://www.nxp.com/pages/codewarrior-development-studio-for-hcs12x-microcontrollers-classic-ide-v5.2:CW-HCS12X?&tab=DocumentaTIon_Tab&linkline=Users-Guides),另感谢NXP提供的学习资料。
另外,本人有另一篇详解怎么定义及访问直接寻址区的博文
译者注:译者博客(),转载请保留这条。此为官方文档TN238,仅供学习交流使用,请勿用于商业用途。
这个文档描述了程序员要怎么样帮助HCS12X编译器来产生在数据访问上更加优化的代码。我们将讨论以下主题:
分配在直接寻址区的变量
分配在扩展寻址区的变量
分配在banked寻址区的变量 — 使用逻辑寻址
分配在banked寻址区的变量 — 使用全局寻址
Banked常量分配
逻辑地址 vs. 全局地址
对于以上举例的每个变量类型,我们都会描述:
怎么定义一个变量
怎么声明一个变量
生成来分为这变量的代码
怎么定义一个指向这样一个变量的指针
生成来访问指针和其指向的变量的代码
PRM文件中的位置
注意1: 这篇技术文档中描述的信息适用于SMALL(-Ms)以及BANKED(-Mb)地址模型。而不适用于LARGE(-Ml)地址模型。 注意2 : 对于少于32Kb代码的应用,我们通常推荐使用SMALL地址模型,或者使用BANKED地址模型。我们不推荐使用LARGE地址模型。分配在直接寻址区的变量
为了使编译器将某个变量分配到直接寻址页,你必须定义(以及声明)它到个特别的segment中,这segment带有属性__SHORT_SEG。
定义&访问直接寻址区的数据
1 像这样进行变量定义:
#pragma DATA_SEG __SHORT_SEG MyShortData unsigned char rub_short_var; #pragma DATA_SEG DEFAULT2 像这样进行变量声明:
#pragma DATA_SEG __SHORT_SEG MyShortData extern unsigned char rub_short_var; #pragma DATA_SEG DEFAULT3 对这变量的访问会生成如下代码:
37: rub_short_var = 2; 00E08002 C602 [1] LDAB #2 00E08004 5B08 [2] STAB $084 没有用于访问直接寻址页变量的特殊指针类型。一个指向这样一个变量的指针将像这样定义:
unsigned char* ptr_on_short_var;5 初始化和访问被指向的对象会产生如下代码:
46: ptr_on_short_var = &rub_short_var; 00E0801F 180320102102 MOVW #8208,02 47: (*ptr_on_short_var)++; 00E08025 62FBA0D9 INC [$A0D9,PC] /* [ptr_on_short_var,PCR] */6 对于定义在__SHORT_SEG secTIon的变量,PRM文件中的SEGMENT和PLACEMENT是这样子的:
SEGMENTS DIRECT_PAGE = READ_WRITE 0x2010 TO 0x20FF; /* 这里省略了其他segment定义 */ END PLACEMENT MyShortData INTO DIRECT_PAGE; /* 这里省略了其他placement定义 */ END 注意: 包含通过直接寻址模式访问的变量的secTIon,应该被分配在用逻辑地址定义的segment中配置直接寻址区
在HCS12X上,直接寻址页可以移动,并且不是硬编码到0x00..0xFF(HCS12上是硬编码到这的)。编译器需要进行特别的设置来支持这一特性。
如果DIRECT寄存器包含任何东西但是默认值是0(译者注:意思是存在DIRECT寄存器?),编译器和汇编器就要启用-CpDirect选项,其后跟着可直接访问区的起始地址。比如:如果DIRECT初始化为0x20,那么直接访问窗口就是从0x2000到0x20FF,编译器和汇编器选项就是-CpDirect0x2000。编译器和汇编器都要加上这个选项。
DIRECT寄存器必须由用户代码来初始化。默认的启动代码不初始化DIRECT。
在prm文件中,secTIon MyShortData要被分配到这个区域(在上例中是从0x2000到0x20FF)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)