定义一个变量aa,想通过变量访问数组常量。由于aa只能访问64K以内的地址,但数组常量被定义在64K地址以外了,请问怎么样将数组常量定义在64K地址以内。我在程序中这样定义的:unsigned char aa; //这个aa位于0x0002a7rom const unsigned char tt[4] = {2,3,4,5}; //这个tt位于0x0101cf。aa = tt[2]; // 现在aa不能访问tt[2],目前aa是个随机值。
去掉rom描述,有const即可。然后看数组被分配的地址是在哪里?这个数组被分配到某个地址,是由连接器确定的,连接器中有连接文件,你看连接文件中关于数组常量的分配区域在哪些地址空间?如果连接器中被分配到64K之后,那么你就需要确定MCU本身是否容许把这个放置到64K之前的空间,如果容许,则你可以修改相关的连接器文件中的语句,然后重编译即可。为何aa只能访问64K内的地址空间?是哪里限制了它?
没有用外部,我用的是片子是67K22,片上的程序空间是64K,目前用了大概55%。我看了一下C18的用户指南,说变量只能访问16位的地址,也就是0xFFFF以内的。后来我把一部分代码去掉,程序变小点,编译后看map文件,那个常量数组的地址就位于0xCBE8,这个时候变量就可以访问常量数组了。我尝试使用near限定符,也不能把那个常量数组分配到0xFFFF以内。请问这是怎么回事。如何解决。
因为我不希望数组里的数据被修改,所以就定义为常量了,要不然也不会这么纠结。只是变量只能访问16位的地址空间,但是程序计数器却是21位的,我们知道程序存储器的地址不是从0x0000开始的,这样就造成像我这样的情况发生,程序存储器的空间没有用完,但是所定义的常量数组却位于0xFFFF以外,造成变量没法访问了