随着项目中的功能不断增加,程序代码size也在不断往上涨,当超过64KB时,就要考虑引入bank进制。
在讲如何在现有项目中添加bank功能前,还是先讲讲其存在的背景吧。
8051是基于哈佛的体系架构。 code memory是16位寻址,data memory是8位寻址。 这样分开寻址的特点适合比较的固定,且比较小的固化程序,而且稳定性相对较强,比如data access不会误指到code指令。 当然这种体系架构的缺点也是显然的,即灵活性不够,比如不能有效的利用memory资源。
既然是16位寻址,那就意味着只能支持64KB的程序代码。 如果项目代码超过64KB,那就要引入多个banks来支持。 一个bank最大能支持32KB, 那4个bank能支持128KB, 8个bank支持256KB, 以此类推。。。 一般地,一个MCU能支持2MB以上的code size。
接下来就讲如何在现有项目中引入bank
1) 在keil IDE 左边lane中右击项目名称,然后click "Add Group..."来添加sub group,以四个banks为例,要保证该项目名称下有4个sub groups。当然,如果已经存在groups,就不用再添加了。一般地,我们bank0又叫common,它的取址范围为0x0000~0x7FFF,其它bank#n的范围设为0x8000~0xFFFF。如下图所示。
2)接下来就是重点了, 因为keil是不会根据这些groups名字来指定它们为bank0还是bank1,2,3... 再说,开发者也可以在IDE中把bank名字改成别名,如application等。所以需要分别右击这些groups来点击opitons->properties->指定bank number号.
3)右击项目名称,然后options-> check "code banking"->select "4", 然后bank area 设为 start:0x8000, end:0xFFFF
4)最后为了通过编译,需要把L51_bank.a51文件添加进项目
5)一些需要注意的细节是, 如果勾选extended LX51 Linker instead of BL51, 为了通过编译链接,那么就需要在options->output将HEX-80改成HEX-386,并勾选merge 32K Hexfile。 为了提高程序执行效率,避免不必要的bank切换,尽量把频繁被调用的code放到common bank中。