HCS12X–数据定义(如何在CodeWarrior中将数据定义到分页区)

HCS12X–数据定义(如何在CodeWarrior中将数据定义到分页区),第1张

由于在暑假匆忙接收的嵌入式项目中需要使用特别大的数组,非分页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提供的学习资料。

另外,本人有另一篇详解怎么定义及访问直接寻址区的博文

HCS12X – 数据定义

译者注:译者博客(),转载请保留这条。此为官方文档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 DEFAULT

2 像这样进行变量声明:

#pragma DATA_SEG __SHORT_SEG MyShortData extern unsigned char rub_short_var; #pragma DATA_SEG DEFAULT

3 对这变量的访问会生成如下代码:

37: rub_short_var = 2; 00E08002 C602 [1] LDAB #2 00E08004 5B08 [2] STAB $08

4 没有用于访问直接寻址页变量的特殊指针类型。一个指向这样一个变量的指针将像这样定义:

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)。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2585431.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-08
下一篇 2022-08-08

发表评论

登录后才能评论

评论列表(0条)

保存