了解XS128的MEMORY map和core,对充分榨取他的现有资源,合理分配RAM很有帮助。上次讨论到cpu12内核的DG系列单片机,基本上该涉及的东西都有所提及。包括:1 MEMORY map的原因,为什么要搞这个概念出来。
2 MEMORY map包含的内容,有那三点...
3 一些相关的概念性的东西。如果不明白,看看前面几篇文章就会明白一些的。这次再补充三个概念,希望能引起大家的注意和进一步讨论:
1 在PRM里设置了映射之后,怎么把程序或变量放在那个地址区呢?比如:我就想把int a;这个a分配到未分页的RAM1区,怎么办?这个说来话太长。
简单地说用:#pragma DATA_SEG [xxxx] <segment_name>。如果没有#pragma DATA_SEG,全局变量将会被放到DEFAULT_RAM段中。当然,如果这个变量频率引用的话,放在非分页RAM1区可以提高他的读取效率,毕竟他不需要RPAGE参与寻址,是near寻址,而不是far,用简单的指令就可以搞定。
同样,如果反复调用一个函数,把这个函数放在非分页flash里也有异曲同同之妙。
关于这个问题的详细讨论,张教主有一篇文章,还有一个DP512的PPT都有讲解。大家可以网上下载看看,如果需要,也可以向我email要.2 建程序里的SAMLL BANKED LARGE是什么作用?
SMALL平面的64K的地址空间。所有的函数都是near。
BANKED采用分页地址。所有的用户的函数都被默认为far
far类型的数据指针可以在SMALL和BANKED中使用
LARGE, 默认为数据和代码均为分页模式。所有的函数和数据指针都是far类型。这种内存模型运行时间比较长,因此很少使用.用LARGE基本上浪费了16位机寻址64K的优势。
因此,用SMALL和BANKED模式的较多。大家可以看看建工程时SMALL和BANKED模式下有什么不同?映射是一样的,只是DEFAULT_ROM和NON_BANKED有无分开的区别。
3 分页明白了,但是分页映射之后怎么用分页里面的数据?比如 const int a;我把他放在PAGE_3C里面,我如何通过计算PPAGE找到这个a呢?
我们用C语言的过程中,把这些东西都忽略了,这个是内核的东西。简单地说,因为内核会自动调用不同的指令去把你C语言译成机器码。机器码就指令集的表示了。因此,内核的先进性和编译优化过程让你不要管了了。
这样说是因为,随后的博文里将更进一步讨论XS128的memory部分。xs128有128KP-FLASH(ROM) 8KRAM8KD-FLASH( EEPROM) ,有某些分页用不到,比如RAM分页,因为逻辑地址是$2000-$4000,有8K空间,无需分页。但是大一点的RAM的话,就必须要分页了。这么多分页(还有FLASH肯定是要分页了,不分页程序就装不下去),怎么管理呢?总得有个东西来统筹一下吧.
GPAGE就诞生了.....
GPAGE怎么用呢,还是上面的那句话,不是用汇编的话,你基本不用管。 剩下的内容不多了,过几天再写吧,希望大家多多交流讨论。中电网这个平台还是不错的。