您的位置 首页 分销

MC9S12系列单片机地址暗射以及分页问题

对于用MCU的人来说,不一定要明白HCS12(x)memorymap的机制和联系。因为如果没有系统地学习操作系统和编译原理之类的课程,确实有些难度

关于用MCU的人来说,纷歧定要了解HCS12(x) memory map的机制和联络。因为假如没有体系地学习操作体系和编译原理之类的课程,的确有些难度。并且,关于DG128 XS128这样的MCU,默许的emory分配方法现已够用了。从这个意义上讲,搞清楚memory map好像不必要。

可是,你有没有RAM不够用的状况?有没有想界说变量到FLASH ROM的状况?有没有因为欲进步寻址功率而界说变量到非分页区的状况?有没有写EEPROM但没写成功的状况?
飞思的memory十分灵敏,经过地址映射来进步功率是芯片制造商的一惯风格(当然,首要这个CPU要有这种寻址和内存映射转换机制),可是,纵观HCS12(x) memory map的东西,真是做到极限了。用我曾经的话讲是,用有限的资源取得无限的好处了。看看DG128,64K的逻辑空间,映射之后RAM EEPROM FALSH ROM,都能够充沛发挥作用,并且扩展FLASH也便利。而XS128更高档一筹,有专门的MMC办理HCS12(x) memory map。
我大体上了解这两个片子的HCS12(x) memory map,因而就此谈谈了解和观点,如有过错,请咱们不惜指出
首要,说说6个概念。
1 memory map 地址映射,不要了解成内存映射,内存是RAM。
2 为什么要映射?因为CPU的寻址是对物理地址操作,可是单片机的RESET之后只要相对地址。相对地址,我了解为是一块一块的,不是连断的。相对地址,望文生义,是个相对的,没有映射之前,CPU是找不到他的,也用不了相对地址的数据。 粘一句百度上的解说:为了确保CPU履行指令时可正确拜访存储单元,需将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址,这一进程称为地址映射。
3 RAM,这个不多说,是存变量和栈的东西,高速,掉电即失。
4 EEPROM,这个是一种特别的FLASH。一般用来保存少数数据,掉电不会丢掉。FLASH也对错易失的,SD卡便是一种FLASH。EEPROM和一般FLASH的差异,在于读写时的字节操作上。这个我基本上没有领会,因为是适当底层的东西。
5 FLASH和ROM,在HCS12(X)里,主张把FLASH和ROM同等起来了解。咱们的程序便是放在这儿面的。还有一个CONST变量和中止向量也是存在这儿面的。ROM可能有个误区,只能读不能写,一次性的,不错。可是,有加个条件,应该是可控的ROM。
6 还有一个重要的register 空间,这个是寄存I/0地址和单片机可编程寄存器的空间,是厂家界说的。在头文件里能够看到。如extern volatile PORTABSTR _PORTAB @(REG_BASE + 0x00000000)便是典型的register 空间映射。
我把memory map了解成为3个内容:一个是映射办理,一个是分页机制,一个是寻址的问题。映射办理,便是单片机RESET之后,逻辑地址和物理地址之间的联系。分页机制的发生首要因为16位寻址才能有限,需求分页处理,另外在虚拟内存办理上能够取得更多的优势。至于,CPU寻址的问题,这个就不深纠了。
这次以DG128的为例,XS128的稍杂乱一些。了解了DG128的,XS128的问题就不大。
先说一说映射办理:DG128里经过设置INITRG、INITRM、INITEE来完成映射。具体的设置看DS吧。默许状况下:register 空间映射到0X0000到0x03FF,这个优先级最高。RAM空间映射到0x0400-0X1FFF,看到没有,实践上只要7K,也便是说能用的RAM只要7K。可是,DG128的RAM有8K的逻辑空间啊。所以,能够改INITRG、INITRM、INITEE重映射以进步RAM的实践可用空间。怎么改,看需求了。WJ在这儿逻嗦一句,能够看看PE是怎么改的。而FLASH映射了3个,有两个非分页地址0x4000-0x7FFF和0xC000-0xFEFF。还有一个分页地址,这一个分页址有6个页面。6个页面占用一个分页窗,用一个逻辑空间,怎么让这6个页面协作作业并让CPU能找到他们呢?

这便是分页办理机制的内容。这6个页面分别是:
PAGE_38 = READ_ONLY 0x388000 TO 0x38BFFF;
PAGE_39 = READ_ONLY 0x398000 TO 0x39BFFF;
PAGE_ 3A = READ_ONLY 0x3A8000 TO 0x3ABFFF;
PAGE_3B = READ_ONLY 0x3B8000 TO 0x3BBFFF;
PAGE_3C = READ_ONLY 0x3C8000 TO 0x3CBFFF;
PAGE_3D = READ_ONLY 0x3D8000 TO 0x3DBFFF;
上面说的咱们能够新建一个DG128工程,到PRM文件里看。
再看看分页办理机制:DG128里只要FLASH空间能够分页,而XS128里,分页的东西太多了。DG128里FLASH分页是经过PPAGE寄存器搞定的。PPAGE是5位寄存器,CPU12内核规位每页只能有16KB。因而DG128的FLASH寻址空间便是2^5*16KB=512KB了。

首要问一个问题:
中止函数为什么要加:#pragma CODE_SEG __NEAR_SEG NON_BANKED 这个声明?这个声明是干什么用的?
这要仍是要从FLASH分页和非分页的差异说起。
下面具体说一说,FLASH里非分页和分页的运用。 要了解一点,分页是不行见的,要用的时分PPAGE参加寻址。
1 FLASH里非分页作业机制
FLASH一共为128K,一页是16K,那么应该有8页才是,可是实践只要6个分页。有2个非分页放在4000-7FFF,和C000-FFFF两个逻辑地址窗里。那么,当程序的寻址在64K之内(2^16=64K,16位机的寻址才能是64K)时,就不必分页了,直接运用那两个非分页的数据。实践上,3E页 3F页是可见的,其实他们便是那2个非分页的映射。因而,运用非分页FLASH,就不须设置PPAGE寄存器,直接运用逻辑地址即可。见图1。
这点咱们能够从以下看出:

ROM_4000 = READ_ONLY 0x4000 TO 0x7FFF;
ROM_C000 = READ_ONLY 0xC000 TO 0xFEFF;
PLACEMENT
NON_BANKED, INTOROM_C000;

很直观地看出,把这两个能够直接运用逻辑地址的页面设为NON_BANKED, 那么中止函数放在NON_BANKED里,就能够把函数放在64K的寻址程序段中。这么一来,进中止就便利多了,功率也高许多。这便是对本文开篇的解说。
2FLASH里分页作业机制
好了,上面是3E页 3F页是可见的分页区,还有3D 3C 3B 3A 39 38不行见的分页区。当你的程序要寻址64K以外的空间,即不是是可见的3E页 3F页时,就要触及分页了。
PPAGE是MMC模块的东西,我搞了个图片咱们看看,如图2。每一页在DG128中的逻辑地址都是由PPAGE中的页号和堆叠窗口内地址组成的24位肯定地址。经过设置寄存器PPAGE,能够运用悉数的FLASH空间。例如:程序要将数据存入$3D页,设置PPAGE的值为$3D,那么逻辑地址规模说是$3D8000-$3DBFFF。有一点要注意:为了分页描绘的完整性,能够如下了解:关于3E页 3F页有两个逻辑地址映射到物理地址。拿3E页来说,有$004000-$007FFF和$3E8000-$3EBFFF。
关于程序是怎么寻址,这个是内核的东西,咱们能够看看CPU这个文档。
经过剖析,信任咱们知道地址这个东西是十分有用的吧。下次说说XS128,XS128的RAM FLASH EEPROM都能够分页。更高档,更自动,编程弹性更大。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/fenxiao/261937.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部