飞思卡尔MC9S12系列单片机地址影射以及分页问题
对于用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。
这点我们可以从以下看出:
/* non-paged FLASHs */
ROM_4000 = READ_ONLY
0x4000 TO 0x7FFF;
ROM_C000 = READ_ONLY
0xC000 TO 0xFEFF;
PLACEMENT
NON_BANKED, INTO ROM_C000/*,
ROM_4000*/;
很直观地看出,把这两个可以直接使用逻辑地址的页面设为NON_BANKED, 那么中断函数放在NON_BANKED里
,就可以把函数放在64K的寻址程序段中。这么一来,进中断就方便多了,效率也高很多。这就是对本文开篇
的解释。
2 FLASH里分页工作机制
好了,上面是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都可
以分页。更高级,更主动,编程弹性更大。
飞思卡尔MC9S12系列单片机地址影射以及分页问题的更多相关文章
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(1)- KBOOT架构
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT架构. Bootloader是嵌入式MCU开发里很常见的一种专用的应用程序,在一个没有Boo ...
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(2)- KBOOT形态(ROM/Bootloader/Flashloader)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT形态. 痞子衡在前一篇文章里简介了 KBOOT架构,我们知道KBOOT是一个完善的Bootl ...
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(3)- KBOOT配置(FOPT/BOOT Pin/BCA)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT配置. KBOOT是支持配置功能的,配置功能可分为两方面:一.芯片系统的启动配置:二.KBO ...
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(9)- KBOOT特性(IntegrityCheck)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT之完整性检测(Integrity Check)特性. Application完整性检测是非常 ...
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(11)- KBOOT特性(ROM API)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT之ROM API特性. KBOOT的ROM API特性主要存在于ROM Bootloader ...
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(10)- KBOOT特性(可靠升级)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT之可靠升级(Reliable Update)特性. 所谓可靠升级机制,即在更新Applica ...
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU开发那些事 - 索引
大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是飞思卡尔Kinetis系列微控制器相关知识. 飞思卡尔半导体(现恩智浦半导体)于2010年开始推出的Kinetis系列昭示着ARM C ...
- 飞思卡尔9S12X系列双核中的协处理器XGATE使用方法
http://adi.chinaaet.com/analog/blogdetail/24482.html
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(1)- Boot简介
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的BootROM功能简介. 截止目前为止i.MX RT系列已公布的芯片有三款i.MXRT105x, i. ...
随机推荐
- 【转载】C++中的static关键字的总结
本文前半部分转自:博主chao_yu 本文后半部分转自:博主VincentCZW 静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值. 静态变量或静态 ...
- 基于THINKPHP+layui+Ajax无刷新实现图片上传预览
<fieldset class="layui-elem-field" style="width:500px;margin:50px 0 0 300px;" ...
- Codeforces Round #460 (Div. 2).E 费马小定理+中国剩余定理
E. Congruence Equation time limit per test 3 seconds memory limit per test 256 megabytes input stand ...
- perl实现监控linux
1.使用root用户telnet进入linux系统 2.修改DNS以下两种方法 A.通过setup命令配置dns B.通过在/etc目录下创建resolv.conf文件 3.查看DNS是否配置成功 [ ...
- 14 Django的用户认证组件
用户认证 auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1.1 .authentica ...
- 利用 ESLint 检查代码质量
原文发表于作者的个人博客:http://morning.work/page/maintainable-nodejs/getting-started-with-eslint.html 其实很早的时候就想 ...
- Linux下单机安装部署kafka及代码实现
技术交流群:233513714 这几天研究了kafka的安装及使用,在网上找了很多教程但是均以失败告终,直到最后想起网络方面的问题最终才安装部署成功,下面就介绍一下kafka的安装部署及代码实现 一. ...
- 关于main与wmain函数
最近写一个控制台程序,并且希望该控制台程序运行时不显示控制台窗口,于是在程序include语句下面加入如下代码 #pragma comment (linker,"/subsystem:\&q ...
- 超链接标签的CSS伪类link,visited,hover,active
CSS伪类,是一种特殊的类,它针对到CSS选择器起作用,使选中的标签或元素产生特定的效果. CSS伪类的语法就是: 选择器 : 伪类名 { 属性 : 属性值 } 用的最多的伪类就是超链接a的伪类,有: ...
- Python导出sql语句结果到Excel
本文档是因为每周需要统计线上数据库中客户新增资源,手动执行实在是麻烦,就写了个脚本导出到Excel,顺便发一封邮件. (当然这不是线上的真实脚本,不过根据个人需求稍微修改下,还是可以直接用的.拿去不谢 ...