打印
[PIC®/AVR®/dsPIC®产品]

PIC18单片机中如何将数组常量分配到小于64K的地址空间

[复制链接]
1771|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
charlen|  楼主 | 2013-10-12 11:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
定义一个变量aa,想通过变量访问数组常量。由于aa只能访问64K以内的地址,但数组常量被定义在64K地址以外了,请问怎么样将数组常量定义在64K地址以内。

我在程序中这样定义的:
unsigned char aa;   //这个aa位于0x0002a7
rom const unsigned char tt[4] = {2,3,4,5};   //这个tt位于0x0101cf。
aa = tt[2];      //  现在aa不能访问tt[2],目前aa是个随机值。
沙发
Rain_King| | 2013-10-12 11:24 | 只看该作者
这个.....你用了外部的rom么....还是什么情况...我也不知道怎么回事...

使用特权

评论回复
板凳
charlen|  楼主 | 2013-10-12 11:40 | 只看该作者
没有用外部,我用的是片子是67K22,片上的程序空间是64K,目前用了大概55%。我看了一下C18的用户指南,说变量只能访问16位的地址,也就是0xFFFF以内的。后来我把一部分代码去掉,程序变小点,编译后看map文件,那个常量数组的地址就位于0xCBE8,这个时候变量就可以访问常量数组了。我尝试使用near限定符,也不能把那个常量数组分配到0xFFFF以内。请问这是怎么回事。如何解决。

使用特权

评论回复
地板
yewuyi| | 2013-10-12 11:45 | 只看该作者
去掉rom描述,有const即可。

然后看数组被分配的地址是在哪里?

这个数组被分配到某个地址,是由连接器确定的,连接器中有连接文件,你看连接文件中关于数组常量的分配区域在哪些地址空间?

如果连接器中被分配到64K之后,那么你就需要确定MCU本身是否容许把这个放置到64K之前的空间,如果容许,则你可以修改相关的连接器文件中的语句,然后重编译即可。

为何aa只能访问64K内的地址空间?是哪里限制了它?

使用特权

评论回复
5
charlen|  楼主 | 2013-10-12 11:57 | 只看该作者
如果只用const不用rom的话,tt就只能位于数据存储区RAM了。PIC18规定常量如果分配到程序存储区,就必须用rom限定符。我刚编译程序,查看map文件,可以看到位于0x0002e5    data区。另外关于aa为什么只能方位64K地址空间,我是看C18的用户指南上得出的结论。

QQ图片20131012115619.jpg (141.88 KB )

QQ图片20131012115619.jpg

使用特权

评论回复
6
charlen|  楼主 | 2013-10-12 12:02 | 只看该作者
因为我不希望数组里的数据被修改,所以就定义为常量了,要不然也不会这么纠结。只是变量只能访问16位的地址空间,但是程序计数器却是21位的,我们知道程序存储器的地址不是从0x0000开始的,这样就造成像我这样的情况发生,程序存储器的空间没有用完,但是所定义的常量数组却位于0xFFFF以外,造成变量没法访问了

使用特权

评论回复
7
charlen|  楼主 | 2013-10-12 14:24 | 只看该作者
有人遇到这种问题吗?

使用特权

评论回复
8
lanyong| | 2013-10-13 09:02 | 只看该作者
查c18有如类似这样的:

rom const unsigned char tt[4] = {2,3,4,5};   @0x0FFF

指定常数变量在何处。

使用特权

评论回复
9
lanyong| | 2013-10-13 09:06 | 只看该作者
还要查下c18是否能支持常数指针

使用特权

评论回复
10
伏尔加的鱼| | 2013-10-14 01:18 | 只看该作者
XC8的手册里有呢,自己看看吧

使用特权

评论回复
11
charlen|  楼主 | 2013-10-15 17:00 | 只看该作者
伏尔加的鱼 发表于 2013-10-14 01:18
XC8的手册里有呢,自己看看吧

XC8的手册?麻烦能说得具体点吗?是哪个手册?

使用特权

评论回复
12
charlen|  楼主 | 2013-10-15 17:18 | 只看该作者
哈哈,找到了,已经解决了。比如可以这样做:
#pragma romdata UIPE_PageStart = 0x8000
rom const BYTE UIPE_PageStart[10]={0,2,3,6,7,8,14,18,20,30};
#pragma romdata

谢谢大家给我的启发!!

使用特权

评论回复
13
伏尔加的鱼| | 2013-10-15 23:59 | 只看该作者
MPLAB® XC8 C 编译器
用户指南

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

34

帖子

0

粉丝