最近在做飞思卡尔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说到的。

飞思卡尔单片机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. Kaggel实战:识别手写体[knn改进算法]
  2. if,elif,else的关系 input print int的用法
  3. 通过XML设置屏幕方向(android:screenOrientation)详解
  4. AMIO编辑器开发(三):转向C++,月底遇到第二个瓶颈
  5. WindowsServer2012史记5-简洁,管理更多的服务器
  6. 关闭sublime更新提示
  7. 浅入浅出数据结构(23)——图的概念、存储方式与拓扑排序
  8. 软件工程复习笔记 用例图
  9. Chrome谷歌浏览器安装crx后缀插件方法
  10. 使用阿里云服务来部署云桌面
  11. kubectl自动补全
  12. E4A(易安卓)学习——第一个APP
  13. 键盘win键和alt互换了怎么办
  14. pic16f1829 c语言,PIC16F1829 TIMER2初始化程序及应用
  15. php中访问excel文件,PHP中常用的Excel文件访问类及修改 | 学步园
  16. 测试新人如何编写测试用例?一文带你写一个合格的测试用例
  17. 传统网络变压器和电容试片式性能区别
  18. Android笔记(十九)制作一个简易的指南针
  19. 十分钟,学会使用js三种方法创建本地json数据文件
  20. 驾校科目一模java geo拟考_模拟考试科目一,科一最全面的必过技巧,原来这么简单还怕过不了...

热门文章

  1. javascript animation lib greensock gsap介绍
  2. 数字图像处理 冈萨雷斯 课后习题答案
  3. Epub,Mobi,Azw3电子书格式的区别,有什么好用的epub阅读器
  4. 联想linux无线网卡驱动,联想E431笔记本CentOS系统安装无线网卡驱动
  5. UTF-8 without BOM
  6. 《网上图书销售系统》功能需求
  7. 计算机基础(2)——重装系统(2)——win10(1)——MediaCreationTool制作WIN10安装U盘,安装纯净版win10的通用教程
  8. 微信小程序实现即时通信聊天功能 php swoole
  9. kb2999226此更新不适用你的计算机,Windows Server 2012 R2 安装补丁KB2999226提示此更新不适合用于计算机...
  10. Java实现一个简单的两人五子棋游戏(二) 画棋盘