共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网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |