飞思卡尔单片机RAM与flash相关问题
最近在做飞思卡尔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)——从安装开始
放假了有木有!是不在家特别闲?是不是放假前立志学单片机来着?如果你拿到了天大精仪荣誉出品的JM60开发板,而且你还带回家了.. 结果安装起来好麻烦!!! WIN7 64位不可以用!USB3.0接口插上 ...
- 【飞思卡尔 MC9S12】内部Flash读写
上一篇:[飞思卡尔 MC9S12]PRM文件与内存映射(Flash.RAM.EEE) 上一篇讲到PRM文件与内存映射,其中有个重要寄存器叫做GPAGE,可以全局访问所有地址范围,Flash操作也是基于 ...
- 飞思卡尔单片机PLL时钟总线模块
要设定PWM模块首先要确定片内总线时钟,MC9S12XS系列单片机增加了时钟产生器模块,锁定内部频率更高的压控振荡器VCO频率,作为系统时钟,单片机的内部时钟可达80MHz,片内总线时钟可达40MHz ...
- 飞思卡尔单片机AD模块简述(1)
S12XS系列MCU的ATD模块共有27个寄存器,包括6个ATD转换控制寄存器,2个ATD转换状态寄存器,1个ATD比较使能寄存器,1个ATD比较方式寄存器,1个ATD转换输入使能寄存器和16个ATD ...
- 飞思卡尔单片机编程与c语言,飞思卡尔单片机高效C语言编程(中文)
高效C语言编程实验,包括:CodeWarrior的使用.中断.数据段的定义.常量数据段.变量.位操作.数组.指针.函数内的自变量.优化方法.Manual Optimization(手工优化).Proc ...
- 飞思卡尔单片机PE开发工具硬件及软件
原文链接: http://blog.sina.com.cn/s/blog_8ebff8d7010121tm.html 1.HC(S)08系列 开发机硬件:USB-ML-12 CYCLONE PRO U ...
- 飞思卡尔单片机DZ60---EEPROM读写
//向EEPROM中写入数据,然后读出数据,赋值给PORTD,点亮相应的LED灯 #include <hidef.h> /* for EnableInterrupts macro */ # ...
- 飞思卡尔单片机DZ60---实时中断
//RTI实时中断实验 //RTC模块包括一个状态和控制寄存器.一个8位计数寄存器和一个8位模数寄存器 //实时中断功能用来产生周期性中断.RTI有三个可选时钟源:LPO 1KHZ内部振荡器,32KH ...
- 【飞思卡尔 MC9S12】PRM文件与内存映射(Flash、RAM、EEE)
本篇介绍飞思卡尔MC9S12系列芯片基本内存映射知识,主要是其特有的分页机制.一般的小型项目可能很多人都不会去专门了解这些内容,但是对于大型项目(代码超过16KB 或 内部变量过多超过4KB),势必要 ...
- 飞思卡尔16位单片机(十五)—— 如何批量烧写芯片
我们在进行飞思卡尔单片机开发时,一般使用CodeWarrior软件和usbdm调试器进行.但是在实际生产过程中,采用这种方式烧写芯片效率比较低,而且很多情况下,程序的源码不希望对生产人员开放,本文就是 ...
最新文章
- Kaggel实战:识别手写体[knn改进算法]
- if,elif,else的关系 input print int的用法
- 通过XML设置屏幕方向(android:screenOrientation)详解
- AMIO编辑器开发(三):转向C++,月底遇到第二个瓶颈
- WindowsServer2012史记5-简洁,管理更多的服务器
- 关闭sublime更新提示
- 浅入浅出数据结构(23)——图的概念、存储方式与拓扑排序
- 软件工程复习笔记 用例图
- Chrome谷歌浏览器安装crx后缀插件方法
- 使用阿里云服务来部署云桌面
- kubectl自动补全
- E4A(易安卓)学习——第一个APP
- 键盘win键和alt互换了怎么办
- pic16f1829 c语言,PIC16F1829 TIMER2初始化程序及应用
- php中访问excel文件,PHP中常用的Excel文件访问类及修改 | 学步园
- 测试新人如何编写测试用例?一文带你写一个合格的测试用例
- 传统网络变压器和电容试片式性能区别
- Android笔记(十九)制作一个简易的指南针
- 十分钟,学会使用js三种方法创建本地json数据文件
- 驾校科目一模java geo拟考_模拟考试科目一,科一最全面的必过技巧,原来这么简单还怕过不了...
热门文章
- javascript animation lib greensock gsap介绍
- 数字图像处理 冈萨雷斯 课后习题答案
- Epub,Mobi,Azw3电子书格式的区别,有什么好用的epub阅读器
- 联想linux无线网卡驱动,联想E431笔记本CentOS系统安装无线网卡驱动
- UTF-8 without BOM
- 《网上图书销售系统》功能需求
- 计算机基础(2)——重装系统(2)——win10(1)——MediaCreationTool制作WIN10安装U盘,安装纯净版win10的通用教程
- 微信小程序实现即时通信聊天功能 php swoole
- kb2999226此更新不适用你的计算机,Windows Server 2012 R2 安装补丁KB2999226提示此更新不适合用于计算机...
- Java实现一个简单的两人五子棋游戏(二) 画棋盘