前言

最近在做项目中遇到一些疑虑,包括OTA升级时会不会阻塞到其他工作线程、select原理和正确用法、如何快速正确理解产品到软件框架构建、嵌入式应用的代码优化方法。本篇文章主要针对第一个问题,请教外援,他解释:正常情况下代码是在OTA1中运行的,当OTA时程序下载固件到OTA2成功后从flash中OTA2对应地址启动。当时觉得不对劲,程序怎么会在flash中运行?查了下,对于x86的pc机和单片机等嵌入式开发系统程序的存储是截然相反的。

x86cpu和单片机读取程序的具体途径

x86的PC机cpu在运行时程序是存储在RAM中,而单片机等嵌入式系统则是存在flash中的。
pc机在运行程序的时候将程序从外存(硬盘)中,调入到RAM中运行,cpu从RAM中读取程序和数据;而单片机的程序则是固化在flash中,cpu运行时直接从flash中读取程序,从RAM中读取数据 。

原因分析

x86构架的cpu是基于冯.诺依曼体系的,即数据和程序存储在一起,而且pc机的RAM资源相当丰富,从几十M到几百M甚至是几个G,客观上能够承受大量的程序数据。
单片机的构架大多是哈弗体系的,即程序和数据分开存储,而且单片的片内RAM资源是相当有限的,内部的RAM过大会带来成本的大幅度提高。
冯.诺依曼体系与哈佛体系的区别:
二者的区别就是程序空间和数据空间是否是一体的。 早期的微处理器大多采用冯诺依曼结构,典型代表是Intel公司的X86微处理器。取指令和取操作数都在同一总线上,通过分时复用的方式进行的。缺点是在高速运行时,不能达到同时取指令和取操作数,从而形成了传输过程的瓶颈。
哈佛总线技术应用是以DSP和ARM为代表的。采用哈佛总线体系结构的芯片内部程序空间和数据空间是分开的,这就允许同时取指令和取操作数,从而大大提高了运算能力。
例如STM320LF240x系列DSP是增强型的哈佛结构通过三组并行的总线访问多个存储空间。它们分别是:程序地址总线(PAB),数据地址读总线(DRAB)和数据地址写总线(DWRB)。

小结

STM32支持两种方式,它是由两个引脚来控制启动方式的,通常是下载到flash启动;用jlink在线仿真,则是下载到SRAM中,无需改变启动方式SRAM掉电后程序会自动消失。可参考下述理解的更详细,后续嵌入式代码优化、框架设计也积累到一些经验后续再分享。
参考 :
cpu运行时程序是在flash中还是在RAM呢?
讨论:程序是运行在flash中还是Ram中呢?
程序在flash中还是ram中运行

程序是运行在flash中还是RAM中?相关推荐

  1. TMS320F280049C 学习笔记9 CMD文件 程序从FLASH复制到RAM中运行

    文章目录 动机 CMD文件结构与语法 MEMORY和SECTIONS指令 MEMORY指令 SECTIONS指令 程序与数据段 已初始化段 未初始化段 其他指令 #pragma指令的使用 程序从FLA ...

  2. NXP KL03--7.相同程序JLINK运行与FLASH直接运行,结果不一致

    KL03 1个问题 1.相同程序JLINK运行与FLASH直接运行,结果不一致,程序是在vlps低功耗模式与正常工作模式之间切换 JLINK运行,打印信息无乱码,RF无丢包 FLASH运行,打印信息乱 ...

  3. 把DSP TMS320F28XXX的程序段从flash复制到ram中运行

    翻译自TI应用手册SPRAAU8(http://www.ti.com.cn/cn/lit/an/spraau8/spraau8.pdf) 摘要 这个应用报告和相关的代码提供了一种把编译后的程序段从TM ...

  4. DSP28335—把TMS320F28XXX的程序段从flash复制到ram中运行

    文章来自:http://www.61ic.com/Article/C2000/Delfino/201303/47552.html 翻译自TI应用手册SPRAAU8 很详细,对编写CMD文件很有帮助! ...

  5. STM32 进阶教程 11 - RAM中运行程序

    前言 上一讲我们讲到stm32可以将代码直接下载到RAM中时行程序调试,同时可以有效避开STM32 Flash 擦写次数有限问题,其实除了仿真调试时将程序设置在RAM中可以解决FLASH擦写次数问题外 ...

  6. 浅谈嵌入式MCU软件开发之S32K1xx系列MCU启动过程及重映射代码到RAM中运行方法详解

    内容提要 注:本文摘自NXP工程师胡恩伟的微信公众号"汽车电子expert成长之路",大家感兴趣可以关注一下. 引言 1. S32K1xx系列MCU启动过程详解(startup_S ...

  7. 【转载】CodeWarrior IDE使用tips之prm链接文件详解(自定义存储器分区以及自定义RAM数据初始化与在RAM中运行函数)...

    CodeWarrior IDE使用tips之prm链接文件详解(自定义存储器分区以及自定义RAM数据初始化与在RAM中运行函数) 2017-08-19 胡恩伟 汽车电子expert成长之路 内容提要 ...

  8. 单片机Flash大小和RAM大小空间理解与分析

    我们以上图中的 STM32为例来进行分析和理解 1,空间大小问题 Flash大小 32kBytes 意思是 321024 = 32768 字节(Bytes) RAM大小 8kBytes 意思是 810 ...

  9. ios程序后台运行设置(不是太懂)

    文一  我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间.  还有三种类型的可以运行在后以,  1.音乐  2.location  3.v ...

最新文章

  1. java pack unicode,汉字和Unicode码(utf-8)之间的转换(Pack/Unpack)
  2. 分组聚合显示全部列_小胖带你学SQL(三)聚合与排序
  3. PHP配置问题:AppServ安装discuz出错 Fatal error:
  4. java 调用 dll 乱码_java调用c++ dll出现中文乱码
  5. 怎么点亮段码屏_我的投影机怎么不亮了
  6. javascript --- 抽象相等
  7. thrift java长连接_利用thrift在c++、java和python之间相互调用
  8. 在 Mac 上如何使用鼠标键来控制指针?
  9. 1月16日新经济智库大会聚焦数字经济,议程、直播全收藏
  10. matlab微积分如何计算器,利用matlab进行微积分的计算.pptx
  11. 几种常见的距离计算公式
  12. 打鼾,是一种全身性疾病
  13. 劳务派遣员工转正制度是什么
  14. 告别无聊的log:让你的Logcat 输出多彩日志
  15. 【渝粤题库】国家开放大学2021春2776兽医基础题目
  16. C# action 返回值_C#编程基础第五章:数组 - 张果
  17. 身体质量指数BMI——python
  18. Mac VScode配置C++环境
  19. C++画图之GOC编程 第6课 通天云梯
  20. 如何可视化的创建Vue项目

热门文章

  1. matlab高斯消去法,matlab实现高斯消去法、LU分解
  2. 二维经典晶格模型的TRG方法
  3. ArcGIS Server 报错 set the request‘s mode to ‘no-cors‘ to fetch the resource with CORS disabled.
  4. 深度学习模型量化基础
  5. C语言函数调用时候内存中栈的动态变化详细分析
  6. EasyUI框架数据校验
  7. 干货||常见软件测试管理工具
  8. #七、股市时空函数另一种间接拟合应用
  9. 扩展屏幕出错 桌面显示反了
  10. 《加州消费者隐私法案》解读合集,CCPA手册发布,助力企业出海合规