打印

怎样指定、知道“变量存放在Near数据空间”了。

[复制链接]
1739|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nongfuxu|  楼主 | 2013-10-7 13:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题:怎样指定、知道“变量存放在Near数据空间”了?
Microchop的芯片,稍微想深入点,真的不知道除了二婕家,还能到哪里找帮助了。
沙发
nongfuxu|  楼主 | 2013-10-7 13:45 | 只看该作者
bss表示未初始化的全局变量和static变量的内存段,那nbss又表示什么意思? 放在near的bss?
找不到那里有相关的定义说明!头大的XC16!

使用特权

评论回复
板凳
nongfuxu|  楼主 | 2013-10-7 14:08 | 只看该作者
在XC16说明上,找到可以使用near char template[20]。细节如下
/*------------------------------------------
MIGRATION TO THE CCI
For 8-bit compilers, change any occurrence of the far qualifier, as in the following
example:
far char template[20];
to __far, i.e., __far char template[20];
In the 16- and 32-bit compilers, change any occurrence of the far attribute, as in the
following
void bar(void) __attribute__ ((far));
int tblIdx __attribute__ ((far));
to
void __far bar(void);
int __far tblIdx;
--------------------------------------------*/

不过在声明变量时,加入near后,出现
error: 'far' undeclared (first use in this function)。

头大的XC16!

使用特权

评论回复
地板
yewuyi| | 2013-10-8 09:41 | 只看该作者
near的意思就是近的,使用这个关键字的目的就是尽量缩小寻址的范围,寻址可能是变量位置的寻址,也可能是函数的寻址,这里主要讲讲你关心的变量寻址。

我们都知道现在的MCU,其内部的RAM空间有越来越大的趋向,这主要是根据应用越来越复杂化而造成的,随着RAM空间的加大,MCU要对这些空间寻址,自然要求内部指令能装载的地址长度也更长,MCU厂家显然不会根据RAM空间而不断的调整自己的芯片指令结构,而且即使根据这个调整,芯片的研发成本、芯片的晶体管数量都会大幅增加,不能控制成本的产品,显然无法和竞争对手竞争。

MCU厂家为了解决这个问题,于是在自己的指令结构中搞出来多字节指令,这样的好处就是在寻址较短时,可以用单字节指令完成,在长地址寻址时,可以用多字节指令来完成,但单字节指令和多字节指令的执行时间显然也有有区别的,以时间和空间两种资源的协调互换来解决这个问题。

而编译器设计人员为了更好的支持应用工程师编写代码,所以搞出了near这种指令,但在定义变量时同时又以near加以限制,则意味着该变量不需要使用多字节指令来寻址,自然其寻址速度最快,编译器设计人员将这个关键字交给MCU应用工程师,也就意味着让应用工程师自己确定哪些变量需要用更快的速度对其寻址,应用工程师往往选择将那些用的最多的变量规定为near特性,这样的好处就是让代码可以更快的速度执行,而避免无效的消耗掉MCU宝贵的速度资源。

near规定的长度大小在不同的MCU中,其长度也有一些差异,同理,这也是和其指令结构决定的,一般来说,对于51结构来说,其是256个字节,对于PIC16来说,其是128个字节长度。看到这里,一些未彻底了解两种体系结构的人又会认为,PIC16只有128个字节长度,规定不如256个字节长度的51好,这显然是一种不尽然的理解,具体就不讲了,你可以自己想想。

使用特权

评论回复
5
yewuyi| | 2013-10-8 09:45 | 只看该作者
nbss表示什么意思,你可以查XC16的连接器手册中的定义,我还比较落后,还没使用XC16这个编译器,但根据使用其它编译器的经验来看,这种定义一般在连接器手册中有规定。

另外,其实关于这个字符的定义,在其他芯片的编译器、连接器中,应该意思都是一样的,但因为我尚没有打开XC16的帮助手册核实,所以在其他编译器/连接器中怎么定义的,我就不讲了。

使用特权

评论回复
6
yewuyi| | 2013-10-8 09:46 | 只看该作者
far自然就是相对near而言的,意思就是告诉编译器针对这个东西需要使用长距离寻址指令。

使用特权

评论回复
7
yewuyi| | 2013-10-8 09:53 | 只看该作者
但你使用C编译器编写代码时,如果你没有规定near或者far等,则编译器会自动默认为near,但定义的变量数量超过一定限度后,要么编译器根据调用顺序自动调整谁是near,谁是far,要么应用工程师自己代码指定,但大多数编译器不能做到自动调整,为了保证自己代码的可移植性和可确定性,所以建议代码指定为好。

使用特权

评论回复
8
nongfuxu|  楼主 | 2013-10-8 13:20 | 只看该作者
建议代码指定为好

指定了,就出错。详见上面的帖子。应该是我不会用,而我明明是按照XC16手册上要求写的。

使用特权

评论回复
9
nongfuxu|  楼主 | 2013-10-8 13:21 | 只看该作者
连接器手册中有规定

连接器手册在哪里能找到?

使用特权

评论回复
10
nongfuxu|  楼主 | 2013-10-8 13:22 | 只看该作者
感谢 yewuyi 回复。

使用特权

评论回复
11
yewuyi| | 2013-10-8 14:40 | 只看该作者
nongfuxu 发表于 2013-10-8 13:21
连接器手册在哪里能找到?

连接器手册一般在编译器安装目录下,有的编译器安装程序会生成一个独立的连接器帮助手册,也有的只会生成一个编译器帮助手册,但在编译器帮助手册中带有连接器使用指导的相关章节。


指定了就出错,有两种可能:
(1)编译器本身不具有这个关键字,不需要这么指定,例如PICC16就不需要这个关键字,PICC16中直接在定义变量时指定其BANK即可,在PICC16 9.8之后的版本中,连BANK也不需要指定了,编译器在一个BANK满之后会自动把变量排到其它BANK中去。
(2)指定的写法错误,这个就不好讲了,只能是按照编译器固定的写法做才行。

使用特权

评论回复
12
nongfuxu|  楼主 | 2013-10-9 16:09 | 只看该作者
嘿,PIC的IDE+编译器使用起来,与其它的相比,确定不怎么样。
起码实在要用JAVA做应用程序界面,也应该选eclips。Netbean是出名的慢。

使用特权

评论回复
13
yewuyi| | 2013-10-10 09:04 | 只看该作者
nongfuxu 发表于 2013-10-9 16:09
嘿,PIC的IDE+编译器使用起来,与其它的相比,确定不怎么样。
起码实在要用JAVA做应用程序界面,也应该选ec ...

我还没用MPLAB X,一直还用MPLAB 8.XX和PICC呢,感觉也挺好。

使用特权

评论回复
14
nongfuxu|  楼主 | 2013-10-10 14:41 | 只看该作者
我还没用MPLAB X,一直还用MPLAB 8.XX和PICC呢,感觉也挺好。

新的IDE放着不用,想必有它不如意之处。速度慢应该是它的最大缺点。

使用特权

评论回复
15
yewuyi| | 2013-10-10 16:29 | 只看该作者
nongfuxu 发表于 2013-10-10 14:41
新的IDE放着不用,想必有它不如意之处。速度慢应该是它的最大缺点。

作为一个老工程师,肯定要牢牢记住:新潮的东西,往往会让你成为小白鼠。

使用特权

评论回复
16
nongfuxu|  楼主 | 2013-10-12 13:59 | 只看该作者
作为一个老工程师,肯定要牢牢记住:新潮的东西,往往会让你成为小白鼠

:) 有土壕、小米新品不断出现,就算好奇,试用一下,当回小白鼠也不错。

使用特权

评论回复
17
nongfuxu|  楼主 | 2013-10-12 14:05 | 只看该作者
说句公道话,MPLAB X IDE的功能真的很强大,而且许多功能都是创新发明。
当然,如果用C/C++代替JAVA,按现在的界面、功能重新来一遍,相信那时将是PIC用户的福气。:)

使用特权

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

本版积分规则

个人签名:是不是经济不KUA,房价下不来? 高房价只能带来“实体经济挤出效应”。

417

主题

4293

帖子

2

粉丝