共2条
1/1 1 跳转至页
S3C44B0,RAM,remap 请教S3C44B0 RAM数据拷贝完成后是怎样完城remap的?

问
我们都知道代码在RAM中执行的速度要比在ROM中要快,所以一般的系统都会做REMAP动作。
在S3C4510中是通过特殊寄存器来完成的。S3C44B0我好像没有看到REMAP相关的代码,请教各位大侠,因为小弟查了一些资料但是没有找到答案! 答 1: 44b无remap功能只能自己作一个跳转 答 2: RE:centimetrecentimetre兄你好,谢谢你的解答。
我有一些疑问:
1)如果是没有remap功能,但是我看到的引导代码,都有在RAM中间划出了复位地址
和中断向量。
1)如果有的话,是怎样实现的。当其中有异常出现时它的地址是固定的啊,比如FIRQ,就是0x0000001CH。这个物理地址是在ROM区的,但是CODE是在RAM区执行的。 答 3: 确实 答 4: 对不起,没写完4510可以REMAP,但是44B0不能,确实是做了一个跳转
AREA boot, CODE, READONLY
不知道你看到有没有如下代码?
VECTORS EQU 0x0c000000
ENTRY
mov pc, #VECTORS
ldr pc, =VECTORS+4
ldr pc, =VECTORS+8
ldr pc, =VECTORS+0x0c
ldr pc, =VECTORS+0x10
ldr pc, =VECTORS+0x14
ldr pc, =VECTORS+0x18
ldr pc, =VECTORS+0x1c
END 答 5: RE:weiganglnu回weiganglnu,我看到过这段代码。
想问一下,编译的时候,
AREA boot, CODE, READONLY
VECTORS EQU 0x0c000000
ENTRY ;这里编译出来的地址是0x00000000吗?
mov pc, #VECTORS
ldr pc, =VECTORS+4
ldr pc, =VECTORS+8
ldr pc, =VECTORS+0x0c
ldr pc, =VECTORS+0x10
ldr pc, =VECTORS+0x14
ldr pc, =VECTORS+0x18
ldr pc, =VECTORS+0x1c
END
答 6: 我已经实现了44B0X在RAM中运行程序其实,最开始那段复位向量程序:
AREA boot, CODE, READONLY
ENTRY
mov pc, #VECTORS
ldr pc, =VECTORS+4
ldr pc, =VECTORS+8
ldr pc, =VECTORS+0x0c
ldr pc, =VECTORS+0x10
ldr pc, =VECTORS+0x14
ldr pc, =VECTORS+0x18
ldr pc, =VECTORS+0x1c
始终位于FLASH中而不是RAM中运行,包括中断ISR的程序的汇编入口部分,都是在FLASH中运行的.用户用C语言编写的ISR程序是在RAM中运行的.这是由44B0X的硬件条件决定的,不会因为你将所有代码都复制到RAM中而改变.
我是这样做的:
在BOOTLOADER的中,将存储器\堆栈\WDT等设置好之后,就复制RW域的数据到正确的位置.然后将RO域的数据复制到RWLIMIT之后的RAM区间内.然后将PC指针指向MAIN函数在RAM中的位置处,(这里,自己要计算一下MAIN到底在哪个位置),程序就可以在RAM中运行了.
我用这种方法已经实现了从PC上重新下载一个应用程序到FLASH中的功能(类似51单片机的ISP功能),下载之后,如果不复位44B0X,仍然运行的是RAM中的程序(我测试过),复位之后,运行的是重新下载的程序.
在做这样的REMAP时,除了要计算MAIN在RAM中的位置外,还要在ISR的入口处加上一个偏移量(即RO代码在RAM中的映射的起始位置),这样,你用C语言编写的ISR才能够正确运行.
在S3C4510中是通过特殊寄存器来完成的。S3C44B0我好像没有看到REMAP相关的代码,请教各位大侠,因为小弟查了一些资料但是没有找到答案! 答 1: 44b无remap功能只能自己作一个跳转 答 2: RE:centimetrecentimetre兄你好,谢谢你的解答。
我有一些疑问:
1)如果是没有remap功能,但是我看到的引导代码,都有在RAM中间划出了复位地址
和中断向量。
1)如果有的话,是怎样实现的。当其中有异常出现时它的地址是固定的啊,比如FIRQ,就是0x0000001CH。这个物理地址是在ROM区的,但是CODE是在RAM区执行的。 答 3: 确实 答 4: 对不起,没写完4510可以REMAP,但是44B0不能,确实是做了一个跳转
AREA boot, CODE, READONLY
不知道你看到有没有如下代码?
VECTORS EQU 0x0c000000
ENTRY
mov pc, #VECTORS
ldr pc, =VECTORS+4
ldr pc, =VECTORS+8
ldr pc, =VECTORS+0x0c
ldr pc, =VECTORS+0x10
ldr pc, =VECTORS+0x14
ldr pc, =VECTORS+0x18
ldr pc, =VECTORS+0x1c
END 答 5: RE:weiganglnu回weiganglnu,我看到过这段代码。
想问一下,编译的时候,
AREA boot, CODE, READONLY
VECTORS EQU 0x0c000000
ENTRY ;这里编译出来的地址是0x00000000吗?
mov pc, #VECTORS
ldr pc, =VECTORS+4
ldr pc, =VECTORS+8
ldr pc, =VECTORS+0x0c
ldr pc, =VECTORS+0x10
ldr pc, =VECTORS+0x14
ldr pc, =VECTORS+0x18
ldr pc, =VECTORS+0x1c
END
答 6: 我已经实现了44B0X在RAM中运行程序其实,最开始那段复位向量程序:
AREA boot, CODE, READONLY
ENTRY
mov pc, #VECTORS
ldr pc, =VECTORS+4
ldr pc, =VECTORS+8
ldr pc, =VECTORS+0x0c
ldr pc, =VECTORS+0x10
ldr pc, =VECTORS+0x14
ldr pc, =VECTORS+0x18
ldr pc, =VECTORS+0x1c
始终位于FLASH中而不是RAM中运行,包括中断ISR的程序的汇编入口部分,都是在FLASH中运行的.用户用C语言编写的ISR程序是在RAM中运行的.这是由44B0X的硬件条件决定的,不会因为你将所有代码都复制到RAM中而改变.
我是这样做的:
在BOOTLOADER的中,将存储器\堆栈\WDT等设置好之后,就复制RW域的数据到正确的位置.然后将RO域的数据复制到RWLIMIT之后的RAM区间内.然后将PC指针指向MAIN函数在RAM中的位置处,(这里,自己要计算一下MAIN到底在哪个位置),程序就可以在RAM中运行了.
我用这种方法已经实现了从PC上重新下载一个应用程序到FLASH中的功能(类似51单片机的ISP功能),下载之后,如果不复位44B0X,仍然运行的是RAM中的程序(我测试过),复位之后,运行的是重新下载的程序.
在做这样的REMAP时,除了要计算MAIN在RAM中的位置外,还要在ISR的入口处加上一个偏移量(即RO代码在RAM中的映射的起始位置),这样,你用C语言编写的ISR才能够正确运行.
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 | |
【我踩过的那些坑】杜绑线问题被打赏50分 | |
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 |