原文地址:https://blog.csdn.net/s396141285/article/details/50510541 转载仅供学习,如有侵权请联系本人删除文章!

最近在做飞思卡尔16位单片机的在线升级bootloader程序。有2个问题不太清楚,请教下论坛里的高人。

1.bootloader程序中,对存放应用程序的flash空间进行擦除和写入新的应用程序以完成升级。比较特别的是,需要将flash操作代码拷贝到ram中执行,这是为什么?bootloader程序所在flash空间设置为被保护状态,不会误擦除,而且运行到哪个函数自然会把函数压栈到RAM里执行吧?为什么还要特地拷贝到RAM里呢?

2.单片机上电初始化后,RAM存储初始化全局变量,这些全局变量是从调试器烧进去的S19文件中获取的吗?每次程序都是从bootloader的main函数开始执行,确定不是升级状态后跳转到应用程序重映射的reset中断向量地址(flash地址)执行。bootloader和应用程序中有些全局变量分配的ram重合了,有什么影响吗?会在跳转后重新初始化RAM吗?

解答如下:
(1) Flash操作的那部分,也就是Flash的读写驱动程序是必须放到RAM中执行,原因是当进行Flash擦写时,Flash中的程序就不可以被执行了,这是硬件的限制。这是Freescale单片机的情况,我不清楚其它单片机会不会有这个限制。
你说的“运行到哪个函数自然会把函数压栈到RAM里执行吧”,不可能把函数压到堆栈里面的,只是在函数调用和函数被中断打断,一些寄存器和一些局部变量等会被压倒堆栈里面。默认情况下,16位freescale单片机在prm中配置的堆栈大小是0x100字节,很多函数都要比它大。评论:程序不可能在堆栈中运行,要运行也只能在RAM中或者NORflash中。

(2)"单片机上电初始化后,RAM存储初始化全局变量,这些全局变量是从调试器烧进去的S19文件中获取的吗?" 这是个很好的问题,全局变量和静态变量的初始化值是保存在Flash中的Const段里的,新建一个工程的时候默认有个startup的汇编程序文件,它负责将const段中的初始值付给这些全部变量。这些事情是发生在你的main函数之前的。

(3)"bootloader和应用程序中有些全局变量分配的ram重合了,有什么影响吗?",没有影响,bootloader和你的应用程序是分时复用RAM的,上电程序就跑到bootloader,如果有合法的应用程序就跑到应用程序,应用程序里面会再次初始化变量的,也就是上面2说到的。

转载于:https://www.cnblogs.com/xiaokangkp0602/p/9283013.html

转:飞思卡尔单片机RAM与flash相关问题相关推荐

  1. 飞思卡尔单片机教程(1)——从安装开始

    放假了有木有!是不在家特别闲?是不是放假前立志学单片机来着?如果你拿到了天大精仪荣誉出品的JM60开发板,而且你还带回家了.. 结果安装起来好麻烦!!! WIN7 64位不可以用!USB3.0接口插上 ...

  2. 【飞思卡尔 MC9S12】内部Flash读写

    上一篇:[飞思卡尔 MC9S12]PRM文件与内存映射(Flash.RAM.EEE) 上一篇讲到PRM文件与内存映射,其中有个重要寄存器叫做GPAGE,可以全局访问所有地址范围,Flash操作也是基于 ...

  3. 飞思卡尔单片机PLL时钟总线模块

    要设定PWM模块首先要确定片内总线时钟,MC9S12XS系列单片机增加了时钟产生器模块,锁定内部频率更高的压控振荡器VCO频率,作为系统时钟,单片机的内部时钟可达80MHz,片内总线时钟可达40MHz ...

  4. 飞思卡尔单片机AD模块简述(1)

    S12XS系列MCU的ATD模块共有27个寄存器,包括6个ATD转换控制寄存器,2个ATD转换状态寄存器,1个ATD比较使能寄存器,1个ATD比较方式寄存器,1个ATD转换输入使能寄存器和16个ATD ...

  5. 飞思卡尔单片机编程与c语言,飞思卡尔单片机高效C语言编程(中文)

    高效C语言编程实验,包括:CodeWarrior的使用.中断.数据段的定义.常量数据段.变量.位操作.数组.指针.函数内的自变量.优化方法.Manual Optimization(手工优化).Proc ...

  6. 飞思卡尔单片机PE开发工具硬件及软件

    原文链接: http://blog.sina.com.cn/s/blog_8ebff8d7010121tm.html 1.HC(S)08系列 开发机硬件:USB-ML-12 CYCLONE PRO U ...

  7. 飞思卡尔单片机DZ60---EEPROM读写

    //向EEPROM中写入数据,然后读出数据,赋值给PORTD,点亮相应的LED灯 #include <hidef.h> /* for EnableInterrupts macro */ # ...

  8. 飞思卡尔单片机DZ60---实时中断

    //RTI实时中断实验 //RTC模块包括一个状态和控制寄存器.一个8位计数寄存器和一个8位模数寄存器 //实时中断功能用来产生周期性中断.RTI有三个可选时钟源:LPO 1KHZ内部振荡器,32KH ...

  9. 【飞思卡尔 MC9S12】PRM文件与内存映射(Flash、RAM、EEE)

    本篇介绍飞思卡尔MC9S12系列芯片基本内存映射知识,主要是其特有的分页机制.一般的小型项目可能很多人都不会去专门了解这些内容,但是对于大型项目(代码超过16KB 或 内部变量过多超过4KB),势必要 ...

  10. 飞思卡尔16位单片机(十五)—— 如何批量烧写芯片

    我们在进行飞思卡尔单片机开发时,一般使用CodeWarrior软件和usbdm调试器进行.但是在实际生产过程中,采用这种方式烧写芯片效率比较低,而且很多情况下,程序的源码不希望对生产人员开放,本文就是 ...

最新文章

  1. 精彩回顾|《图像对齐算法》
  2. python抓取头条文章
  3. getoutputstream java_java socket getInputStream getOutputStream
  4. spring 的MAVEN配置
  5. centos7已有数据硬盘挂载_实战2T以上盘GPT分区工具使用挂载教程
  6. SAP Commerce Cloud WCMS 里的 home 页面和 SAP Spartacus Page API 返回的数据比较
  7. 人工智能在建筑运营_打造智能建筑商
  8. 一个简单的性能计数器:CodeTimer
  9. 将m文件通过matlab 的编译器转换为可执行文件,【转】 Matlab中提高m文件执行效率的小技巧...
  10. Android初始化语言 (init.*.rc、init.conf文件格式)
  11. 如何查看Oracle数据库字符集 尚未研究
  12. 台式电脑计算机怎么添加任务栏,win10系统任务栏添加计算机快捷图标的详细技巧...
  13. iMC iNode客户端上岗证
  14. 数学建模系列-预测模型(一)---神经网络模型
  15. 机械制图之三棱锥的三视图
  16. mysql生日提醒_生日提醒为我所有的用户mysql
  17. VBA 读写文本文件
  18. thinkphp5.1和5.0下的中文分词
  19. 打破985校史!她以独作身份投中顶刊,曾因换方向重读博士7年,科研之路也“坎坎坷坷”……...
  20. 短信验证码测试——短信轰炸之横向轰炸和纵向轰炸

热门文章

  1. 速达登录服务器密码如何修改,登录速达软件口令忘记了进不去怎么弄
  2. 重庆北大青鸟校区【学员心声】:学习是我们前进的动力
  3. 北大青鸟的java课程_北大青鸟Java课程
  4. mysql中日期相减_1104绝密公式,如何直接用2个日期直接算剩余时间区间
  5. 20210223-广东省通信管理局
  6. CISSP的2021年认证大纲、CISSP学习大纲、中国考点,及如何考取成功
  7. ubuntu linux 从入门到精通.pdf,UBUNTU LINUX从入门到精通(附DVD)
  8. 微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)的实现
  9. Oracle 创建表语句
  10. 基于java的网上鲜花销售系统