Chinaunix首页 | 论坛 | 博客
  • 博客访问: 570810
  • 博文数量: 169
  • 博客积分: 2656
  • 博客等级: 少校
  • 技术积分: 1685
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-30 13:03
文章分类

全部博文(169)

文章存档

2011年(1)

2010年(135)

2009年(33)

我的朋友

分类: 嵌入式

2010-05-20 23:11:19

问题: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
阅读(1250) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~