由于Rigel的成本问题,其flash有512K,而SDRam只有2M. 要将code压缩在这样的空间包括两个工作:
- 二进制<512 K
- 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))标签,以此来完成编译器的长跳转。