Cost down的方式

   由于Rigel的成本问题,其flash有512K,而SDRam只有2M. 要将code压缩在这样的空间包括两个工作:

  1.  二进制<512 K
  2. SDRam必须小于2M,越小越好

    采用工具,将SDRam刷为特殊的值,将当前的bin运行在FPGA之上,运行一段时间后,将SDRam dump出来检查其占用的SDRam空间是否足够小。

 

    占用的空间如下:

                                   512k       bin                    flash        

                                   2M         .BSS/.Rodata    SDRam

                                                  .text                  SDRam

                                                  .data                 SDRam

                                                  stack                SDRam

                                                  system pool      SDRam

                                                  hd        pool       SDRam

 

    在代码中的嵌套,rodata等进行refactor的同时,主要想利用Flash的空余空间。做一个搬家的工作。

 

也就是说想让部分代码在flash上运行,这样就可以减少.text和data段的大小。但是由于flash为串行接口,难以实现同步,也就是说如果线程调度(从flash读取指令)和Application向flash写之间,无法进行同步(向flash写一些用户信息,频道号等用户数据)。在系统中可以通过互斥锁的方式实现flash的串行访问,但是cpu调度指令无法受控。所以要在flash上运行程序必须有严格的要求:单线程,无进程调度。所以,可以认为在OS启动之前的很多工作,都可以在Flash上工作。

 

但是这些函数可能有的在OS启动前被调用,有的在OS后备调用。所以必须将这种情况的函数都放到SDRAM中,而仅在OS启动前调用的函数放在FLASH中。

所以首要任务,找出这些函数,并将其打上__attribute__((section (".flashtext")))标签,而在ld脚本中,将.flashext代码都放在flash中。

同时Flash的函数可以调用SDRam的函数,而SDRam内的函数不能调用Flash的函数(相当于取值操作)。所以只要被SDRam里的函数调用了的函数,其类型一定是SDRam。而Flash中的函数可以调用Flash函数,也可以调用SDRam函数。

 

这样可以认为可以在dump的ASM中查找被调用SDRam函数调用次数是0的函数,这些函数有可能可以放在Flash中。

检查这些函数,看看能否放在Flash中。

但是这样有个问题,由于MIPS指令长度的限制,从FLash跳到ROm中要使用长跳转方式,也就是说不能直接jlr address了事,所以,代码中需要确定哪些函数是从Flash跳过来的,并将其函数声明中,设定__attribute__((longcall))标签,以此来完成编译器的长跳转。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值