共2条
1/1 1 跳转至页
向各位大侠请教几个存储器映射方面的问题!

问
请教:
问题1:
1:为什么要存储器映射控制,一般是在什么情况下发生存储器映射控制呢?
问题2
2:存储器映射控制,是不是专用中断的?
问题3:
3:书上原文:“
列如,每当产生一个软件中断请求,ARM 内核就从 0x00000008 处取出 32 位数。这就意味着:
当 MEMMAP[1:0]=10 (用户 ARM 模式)时,从 0x00000008 的读数/取指是对 0x40000008
单元进行操作。”
请教,是不是芯片规定了当发生中断时,ARM 就是从 0x00000008 处取出 32 位数?
问题4
4:书上原文“
用户程序需要随时更改异常向量表,可以将异常向量表(64字节)复制到片内 RAM 的 0x40000000 地址上,
然后设置 MEMMAP=2 进行重新映射,0x40000000 地址上的向量表就可以更改了。”
请教,为什么要将 异常向量表(64字节)复制到片内 RAM 的 0x40000000 地址上呢?
是不是因为 片内 RAM 的其始地址就是 0x40000000 啊?
还有 然后设置 MEMMAP=2 进行重新映射,0x40000000 地址上的向量表就可以更改了
各位大哥详细解释一下,好吗?
辛苦各位大侠了!谢谢!
答 1: 随便说说我觉得存储器重映射其实很简单:我们知道,复位和发生中断时,CPU是从固定地址读取复位和中断向量.
系统复位时,MCU一般是从0x0处开始指向,这样一来,在0x0处一般就只能是ROM了,以后发生中断,一般也是在这随近取指.这样一来,有时不是太灵活,比如bootloader中用到中断(这个在ARM中好像还好弄一点,在纯ROM的MCU中更麻烦),同时像ARM之类的,在ROM中执行有许多不方便的地方.
于是就有了存储器重映射的方法:就是通过程序控制,把非0x0处的存储器,映射到0x0处.这样一来,这部分存储器对于CPU而言,跟在0x0处没有分别,于是发生中断时,中断向量就从这儿取了.
至于能干什么用,就是各显神通了,比如你可以在0x0处放一个bootloader,执行完相关初始化程序后(在8位MCU中可以方便的用来进行IAP),然后重映射主程序,这样很方便的.在ARM中的话,可以先将代码copy到RAM中,重映射以后,代码全在ram中执行(发生中断后,也从RAM中取指),速度会快不少的:)
也不知道说得有没有不妥的地方,其实你问的问题我也不知道是这是指这个. 答 2: hiberhe 大哥,谢谢!hiberhe 大哥:
您好!
我要的就是您说的啊
我还是有几个地方没懂:
问题1:
您说:“ 把非0x0处的存储器,映射到0x0处”
这件工作是 芯片自己做的,还是要程序员做的啊?
如果是需要程序做的话,那要怎么写程序啊
hiberhe 大哥,举个具体的列子,好吗?
问题2:
于能干什么用,就是各显神通了,比如你可以在0x0处放一个bootloader,执行完相关初始化程序后(在8位MCU中可以方便的用来进行IAP),然后重映射主程序,这样很方便的.在ARM中的话,可以先将代码copy到RAM中,重映射以后,代码全在ram中执行(发生中断后,也从RAM中取指),速度会快不少的:)
hiberhe 大哥,重映射主程序,到底做了哪些工作呢?
还有,请大哥帮我看看:
“ 请教:各位大侠,帮我看看下面这段程序,我有几个地方不理解!”
这个帖子。
谢谢大哥!
答 3: 别称大哥啦,叫hiber就好了重映射不同的MCU不用.当然不是芯片自己做的,芯片不知道你需不需要重映射,以不知道你将哪块存储器得映射到0x0.通过在程序中设置MCU的寄存器来实现的.这个不同的MCU有不同的寄存器.看MCU的文档就知道了.我知道4510是可以重映射的(自己没实际用过,初学ARM,还是超级菜鸟),我用的44B0X不可以重映射,所以也不好给例子.
看一下CPU的文档就知道了,很简单的.也要注意重映射时对一些注意事项,这个在CPU的文档里都有的.
说白了,重映射就是要CPU将非0x0处的存储器当作0x0处来用,就这么简单,具体CPU是怎么实现的,根本不用关心.设置了重映射以后,在你的程序中,就要把那片区域当作0x0的.
要完成重映射,反正就是操作一下寄存器而已.
不知道自己有没有说清楚.
问题1:
1:为什么要存储器映射控制,一般是在什么情况下发生存储器映射控制呢?
问题2
2:存储器映射控制,是不是专用中断的?
问题3:
3:书上原文:“
列如,每当产生一个软件中断请求,ARM 内核就从 0x00000008 处取出 32 位数。这就意味着:
当 MEMMAP[1:0]=10 (用户 ARM 模式)时,从 0x00000008 的读数/取指是对 0x40000008
单元进行操作。”
请教,是不是芯片规定了当发生中断时,ARM 就是从 0x00000008 处取出 32 位数?
问题4
4:书上原文“
用户程序需要随时更改异常向量表,可以将异常向量表(64字节)复制到片内 RAM 的 0x40000000 地址上,
然后设置 MEMMAP=2 进行重新映射,0x40000000 地址上的向量表就可以更改了。”
请教,为什么要将 异常向量表(64字节)复制到片内 RAM 的 0x40000000 地址上呢?
是不是因为 片内 RAM 的其始地址就是 0x40000000 啊?
还有 然后设置 MEMMAP=2 进行重新映射,0x40000000 地址上的向量表就可以更改了
各位大哥详细解释一下,好吗?
辛苦各位大侠了!谢谢!
答 1: 随便说说我觉得存储器重映射其实很简单:我们知道,复位和发生中断时,CPU是从固定地址读取复位和中断向量.
系统复位时,MCU一般是从0x0处开始指向,这样一来,在0x0处一般就只能是ROM了,以后发生中断,一般也是在这随近取指.这样一来,有时不是太灵活,比如bootloader中用到中断(这个在ARM中好像还好弄一点,在纯ROM的MCU中更麻烦),同时像ARM之类的,在ROM中执行有许多不方便的地方.
于是就有了存储器重映射的方法:就是通过程序控制,把非0x0处的存储器,映射到0x0处.这样一来,这部分存储器对于CPU而言,跟在0x0处没有分别,于是发生中断时,中断向量就从这儿取了.
至于能干什么用,就是各显神通了,比如你可以在0x0处放一个bootloader,执行完相关初始化程序后(在8位MCU中可以方便的用来进行IAP),然后重映射主程序,这样很方便的.在ARM中的话,可以先将代码copy到RAM中,重映射以后,代码全在ram中执行(发生中断后,也从RAM中取指),速度会快不少的:)
也不知道说得有没有不妥的地方,其实你问的问题我也不知道是这是指这个. 答 2: hiberhe 大哥,谢谢!hiberhe 大哥:
您好!
我要的就是您说的啊
我还是有几个地方没懂:
问题1:
您说:“ 把非0x0处的存储器,映射到0x0处”
这件工作是 芯片自己做的,还是要程序员做的啊?
如果是需要程序做的话,那要怎么写程序啊
hiberhe 大哥,举个具体的列子,好吗?
问题2:
于能干什么用,就是各显神通了,比如你可以在0x0处放一个bootloader,执行完相关初始化程序后(在8位MCU中可以方便的用来进行IAP),然后重映射主程序,这样很方便的.在ARM中的话,可以先将代码copy到RAM中,重映射以后,代码全在ram中执行(发生中断后,也从RAM中取指),速度会快不少的:)
hiberhe 大哥,重映射主程序,到底做了哪些工作呢?
还有,请大哥帮我看看:
“ 请教:各位大侠,帮我看看下面这段程序,我有几个地方不理解!”
这个帖子。
谢谢大哥!
答 3: 别称大哥啦,叫hiber就好了重映射不同的MCU不用.当然不是芯片自己做的,芯片不知道你需不需要重映射,以不知道你将哪块存储器得映射到0x0.通过在程序中设置MCU的寄存器来实现的.这个不同的MCU有不同的寄存器.看MCU的文档就知道了.我知道4510是可以重映射的(自己没实际用过,初学ARM,还是超级菜鸟),我用的44B0X不可以重映射,所以也不好给例子.
看一下CPU的文档就知道了,很简单的.也要注意重映射时对一些注意事项,这个在CPU的文档里都有的.
说白了,重映射就是要CPU将非0x0处的存储器当作0x0处来用,就这么简单,具体CPU是怎么实现的,根本不用关心.设置了重映射以后,在你的程序中,就要把那片区域当作0x0的.
要完成重映射,反正就是操作一下寄存器而已.
不知道自己有没有说清楚.
共2条
1/1 1 跳转至页
回复
打赏帖 | |
---|---|
汽车+汽车地线之间连接处理被打赏20分 | |
【Zephyr】使用Zephyr外设初始化过程解析被打赏30分 | |
【S32K146】S32DS watchdog 配置使用被打赏20分 | |
【Zephyr】使用 IAR 调试 Zephyr 镜像被打赏20分 | |
赚取电动螺丝刀+电源电路理论知识分享1被打赏5分 | |
我想要一部加热台+分享常见运算放大器电路的应用被打赏5分 | |
【Zephyr】MCXN947 Zephyr 开发入门适配shell被打赏20分 | |
我想要一部加热台+常见的MOS管驱动电路被打赏5分 | |
【我要开发板】6.联合MATLAB记录数据被打赏50分 | |
【换取手持数字示波器】MicrochipMPLABHarmony框架下串口调试printf输出记录被打赏29分 |