当前位置: 代码迷 >> 单片机 >> 单片机flash擦除可能写操作,提到从flash启动或者RAM启动
  详细解决方案

单片机flash擦除可能写操作,提到从flash启动或者RAM启动

热度:352   发布时间:2016-04-28 14:45:49.0
单片机flash擦除或者写操作,提到从flash启动或者RAM启动
看一款单片机资料,上面说到:进行flash擦除或写操作时,既可以从flash存储器启动也可以从RAM中启动。   这句话是什么意思?
------解决思路----------------------
是指执行擦除操作的代码,可以驻留在 Flash 中,也可以驻留在 RAM 中。CPU 执行此操作时,从中取指运行。

有些芯片是不支持从 Flash 中发起对 Flash 的擦写的,会引起总线冲突。当然,即便是支持从 Flash 发起擦除的芯片,也不能让它擦除掉擦除代码所在的空间,这样会跑飞。这要由编程者来控制。
------解决思路----------------------
从 Flash 启动就是常规的函数调用。RAM 启动的话,要将函数代码复制到 RAM 中,并将其起始地址声明为一个函数指针,调用此指针即可。

实际上,无论哪一种情况,函数调用都是将当前代码地址压栈,将函数起始地址写入 CPU 取指地址寄存器。只是写入的地址不同而已。函数返回时,会从堆栈中重新弹出调用者的地址。当然,这些会是编译器来做的,你只需编写代码即可。
------解决思路----------------------
引用:
Quote: 引用:

从 Flash 启动就是常规的函数调用。RAM 启动的话,要将函数代码复制到 RAM 中,并将其起始地址声明为一个函数指针,调用此指针即可。

实际上,无论哪一种情况,函数调用都是将当前代码地址压栈,将函数起始地址写入 CPU 取指地址寄存器。只是写入的地址不同而已。函数返回时,会从堆栈中重新弹出调用者的地址。当然,这些会是编译器来做的,你只需编写代码即可。


“RAM 启动的话,要将函数代码复制到 RAM 中”这是怎么实现的啊?

基本上有两类方法:

1 隐式方式 
利用编译器(需要一些编译信息指令文件的配合)将相关的代码段链接到 RAM 中,同时将代码内容存放在 Flash 中;另外,在代码运行前,用程序指令将代码内容复制到相应的 RAM 空间(例如利用 Startup.c 启动代码来复制它)。

2 显式方式
声明一个处于 RAM 地址函数指针,并将 Flash 中的一段代码复制过去。操作时,调用该函数指针。
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

从 Flash 启动就是常规的函数调用。RAM 启动的话,要将函数代码复制到 RAM 中,并将其起始地址声明为一个函数指针,调用此指针即可。

实际上,无论哪一种情况,函数调用都是将当前代码地址压栈,将函数起始地址写入 CPU 取指地址寄存器。只是写入的地址不同而已。函数返回时,会从堆栈中重新弹出调用者的地址。当然,这些会是编译器来做的,你只需编写代码即可。


从哪里启动,是我们编码控制的?还是编译器控制的?

看了实现方法,我相信你已经知道是编码控制的了。对于编译器来说,从哪里启动没有区别,无非是调用不同地址的函数而已。调用 Flash 地址空间的函数,就是从 Flash 操作;调用 RAM 地址空间的函数,就是从 RAM 操作。

从 RAM 启动需要多做的一步就是,上电后要把代码从非易失性存储器 Flash 中复制到 RAM 中。


"上电后要把代码从非易失性存储器 Flash 中复制到 RAM 中"这是通过你说的startup.c函数实现复制的吗? 还有没有其他的复制方法?
就是写代码复制。放在哪个文件里都可以,在运行前执行就行。放在 Startup,c 文件中的好处是,不影响应用代码的更替。也就是说,任何一个工程都使用固定的 Startup,c 文件。
  相关解决方案