问题:vxWorks6.4新增了wrs_kernel_text_fast 和 wrs_kernel_text_init 段,这两个是什么作用,是否可以去掉?因为这两个段在TEXT段的位置之后,如果TEXT段增大到32M,从TEXT段调用fast段和init段的内容会出现链接上的长跳转错误。本来这种错误是可以通过调整obj的链接顺序解决的。
这两个段是被link脚本创建,例如h/tool/diab/ldscripts/link.DOTBOOTRAM,在数据和代码上都有fast和init的段,可以使用下面的符号来寻址各个section:
.text.init
.text.fast
.data.init
.data.fast
下面的宏用在代码中,以指定某个函数带有fast或init属性:
#define _WRS_INITTEXT __attribute__ ((__section__ (".text.init")))
#define _WRS_FASTTEXT __attribute__ ((__section__ (".text.fast")))
#define _WRS_INITDATA __attribute__ ((__section__ (".data.init")))
#define _WRS_FASTDATA __attribute__ ((__section__ (".data.fast")))
例如:
_WRS_FASTTEXT
LOCAL STATUS gei82543EndSend
(
END_DEVICE * pDrvCtrl, /* device ptr */
M_BLK_ID pMblk /* data to send */
)
{
。。。。。。
}
把频繁调用的小尺寸函数放到一起,在MMU调页或者指令代码调入Icache的时候会得到更高的效率。减少了了TLB miss和cache miss的次数。
如果由于实际应用中遇到不可规避的情况,可以重新编译库文件,并增加_WRS_NO_SPECIAL_SECTIONS选项去掉fast 和init段。在代码中有如下定义,在增加了_WRS_NO_SPECIAL_SECTIONS选项以后,fast和init的属性都失去了作用。
#ifndef _WRS_NO_SPECIAL_SECTIONS
#define _WRS_INITTEXT __attribute__ ((__section__ (".text.init")))
#define _WRS_FASTTEXT __attribute__ ((__section__ (".text.fast")))
#define _WRS_INITDATA __attribute__ ((__section__ (".data.init")))
#define _WRS_FASTDATA __attribute__ ((__section__ (".data.fast")))
#else
#define _WRS_INITTEXT
#define _WRS_FASTTEXT
#define _WRS_INITDATA
#define _WRS_FASTDATA
#endif
编译库的命令如下:
在目录$(installdir)\vxworks-6.4\target\src下:make CPU=PPC32 TOOL=diab ADD_FLAGS=-D_WRS_NO_SPECIAL_SECTIONS
阅读(1323) | 评论(0) | 转发(0) |