首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

把Norflash的部分代码拷贝到Sram中继续运行?请大家帮忙看看解决方法

2013-01-25 
把Norflash的部分代码拷贝到Sram中继续运行?请大家帮忙看看富士通的cortex-m3的板子。256kb的flash和32kb的

把Norflash的部分代码拷贝到Sram中继续运行?请大家帮忙看看
富士通的cortex-m3的板子。256kb的flash和32kb的sram。
1.我需要在flash正常运行一段代码后,复制程序中的一个功能函数到sram中。并在sram中继续运行,完成对flash指定块的擦除操作。
2.然后跳回flash中通过usb接收数据储存到flash的指定块中。最后又跳到sram,把指定块中的内容覆盖以前从0x00开始的原程序。完成固件升级。

因为此板子的flash不能自己擦自己。所以必须通过sram来操作。自己理解可能涉及中断向量表,运行指针。加载域和运行域,位置无关代码,我的环境是IAR。


那位兄弟帮忙指点下.c语言能做吗?该怎么做?还是必须用汇编来写。程序是c的
[解决办法]
如果你自己写链接脚本把函数映射到RAM,而且你使用的是默认的引导汇编的话,这一复制过程是自动执行的,你什么都不需要做,直接调用就好了。如果是你自己写的引导汇编代码,而且没有这个拷贝的过程,就需要在汇编或C函数中加入这一拷贝过程,不需要吧运行指针指过去的,因为直接调用函数时,指针自己就指过去了。

另外,不能直接把执行地址在FLASH中的函数的代码直接拷贝到RAM中执行,因为标号地址是绝对地址(函数名也算标号地址)。



[解决办法]
6楼的所说的“默认的引导汇编”是不是具有拷贝flash的代码到sram的功能了,所以才说直接调用flash擦写函数而不用自己拷贝,是这个意思吧?

我的理解是,由于你的堆栈是在SRAM中,所以你可以用C语言来实现flash擦写,这是一。

如果用C语言实现,你需要用memcopy先把flash中的代码拷贝到sram中。

三是你拷贝的这个flash代码,在连接阶段就要指明运行地址是在sram中,如果指明喃?你需要修改icf文件来指明。你可以把所有flash代码写进一个文件,编译成.o文件后,在icf中指明这个.o的运行地址是在SRAM。
如:
place in RAM_region   { readwrite,
                        block CSTACK, block HEAP ,
                        section .test object copy.o};

热点排行