对于x86的pc机和单片机等嵌入式开发系统程序的存储是截然相反的,即:  
x86的pc机cpu在运行的时候程序是存储在RAM中的,而单片机等嵌入式系统则是存于flash中。

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

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

造成这种差别的具体原因分析:

x86构架的cpu是基于冯.诺依曼体系的,即数据和程序存储在一起,而且pc机的RAM资源相当丰富,从几十M到几百M甚至是几个G,客观上能够承受大量的程序数据。  
单片机的构架大多是哈弗体系的,即程序和数据分开存储,而且单片的片内RAM资源是相当有限的,内部的RAM过大会带来成本的大幅度提高。

单片机的程序能存储在RAM中吗 ?

通过上面的分析可得知:单片机的程序能存储于flash中是基于两点考虑,即体系结构和RAM资源的多少。因此,在技术不但进步片内RAM容量不断增多的今天,RAM资源已经不再是制约这种差别的主要因素,而对于体系机构我们只要更改cpu读取程序的方式就可以。  
将嵌入式系统的程序存于RAM中的具体做法:  
“对于很多的嵌入式系统,其代码很多都存储在nor flash中,运行也是直接在flash中运行.我最近了解到我新公司的软件中的一段代码当时为了提高运行速度被加载到ram中运行.当时他们是花了很多时间来解决这个问题的.  
我仔细研究了一下链接脚本,用的是gnu的linux的交叉工具链.地址分配是写在一个ld脚本中的.  
他们是这样实现的:  
1,将你需要在ram中运行的代码写在单独的一个c文件中,然后在脚本中设置其运行地址与存放地址分开.设置好必要的代码起始和结束的标志变量.  
2,在代码中将存放地址处的代码拷贝到运行地址中.

这段代码倒是没什么问题,只是我有个更简单的办法:  
还记得全局变量是怎么初始化的吗? .data段是一个自动初始化的段(内核代码处理),我只需要将这个c文件产生的代码放置在.data段中,这段代码就可以被加载到ram运行了.我测试了一下运行良好.

冯.诺依曼体系与哈佛体系的区别:

二者的区别就是程序空间和数据空间是否是一体的。 早期的微处理器大多采用冯诺依曼结构,典型代表是Intel公司的X86微处理器。取指令和取操作数都在同一总线上,通过分时复用的方式进行的。缺点是在高速运行时,不能达到同时取指令和取操作数,从而形成了传输过程的瓶颈。  
哈佛总线技术应用是以DSP和ARM为代表的。采用哈佛总线体系结构的芯片内部程序空间和数据空间是分开的,这就允许同时取指令和取操作数,从而大大提高了运算能力。  
例如STM320LF240x系列DSP是增强型的哈佛结构通过三组并行的总线访问多个存储空间。它们分别是:程序地址总线(PAB),数据地址读总线(DRAB)和数据地址写总线(DWRB)。

探讨STM32代码运行位置相关推荐

  1. 为什么单片机的代码在Flash中运行,单片机的代码运行位置跟电脑有什么不同?

    1. 单片机与电脑,在代码运行空间的区别 单片机与 电脑/Linux嵌入式 在代码运行的空间上不同.大多数单片机,代码都是在Flash中运行的.而电脑/linux嵌入式,是将代码从存储介质(可能是硬盘 ...

  2. 使用LiteOS Studio图形化查看LiteOS在STM32上运行的奥秘

    摘要:本文带来基于LiteOS一站式开发工具LiteOS Studio,通过单步调试,来动态分析LiteOS的启动流程. 编者按:在LiteOS大揭秘系列,我们和读者们分享了<LiteOS是怎么 ...

  3. stm32仿真不能设置断点_使用LiteOS Studio图形化查看LiteOS在STM32上运行的奥秘

    摘要:本文带来基于LiteOS一站式开发工具LiteOS Studio,通过单步调试,来动态分析LiteOS的启动流程. 编者按:在LiteOS大揭秘系列,我们和读者们分享了<LiteOS是怎么 ...

  4. 物联网学习之旅:微信小程序控制STM32(三)--STM32代码编写

    STM32代码编写 STM32端不需要写关于连接MQTT服务器的代码,连接的工作交给ESP8266来做,STM32只需要通过串口接收和发送数据,间接的与服务器交互. 串口三配置 串口一已经与电脑连接了 ...

  5. 泛型会让你的 Go 代码运行变慢

    以下内容来自公众号逆锋起笔,关注每日干货及时送达 作者 | Vicent Marti 译者 | 核子可乐 策划 | 褚杏娟 Go 1.18 已经到来,很多人期盼已久的首个支持泛型实现的版本也就此落地. ...

  6. Keil环境下STM32定位hardfault位置方法(addr2line工具)和遇到的情况

    目录 一.概述 二.方法一:Call Stack + Locals 三.方法二:Show Code at Address 3.1 需要通过LR判断SP? 3.1.1 关于MSP和PSP 3.1.2 为 ...

  7. 【Flutter】Flutter 调试 ( 调试控制相关功能 | 断点管理 | 代码运行控制 )

    文章目录 一.调试控制相关功能 二.断点管理 三.代码运行控制 四.相关资源 一.调试控制相关功能 " Return 'main.dart' " 重新运行项目 ; " S ...

  8. vba遍历数组_VBA代码解决方案的第59讲内容:如何在代码运行时创建数组

    大家好,我们今日继续讲解VBA代码解决方案的第59讲内容:如何在代码运行时创建数组 .数组大家并不陌生,在之前我讲过很多了,估计详细阐述数组的只有我这个平台可以找到了,今日讲的是在VBA中代码运行的时 ...

  9. html自动生成工具_关于STM32代码自动生成的工具的进度....

    前情提要:STM32代码自动生成工具_本想...但是...可是...所以 首先说一下那几天大家的反应,有的持观望态度,毕竟STM32CUBE很香:有的很激动,期待我快点出东西:还有的很淡定,知道我在挖 ...

最新文章

  1. 谱减法降噪的matlab代码实现
  2. 使用js实现时钟效果
  3. 阿里技术官最新总结一份105道Java面试题小册,看完我惊呆了
  4. CSS从大图中抠取小图完整教程(background-position应用)
  5. Java知识点详解 6 注解
  6. MongoDB 最大连接数 设置失效的异常分析
  7. (一)MySQL 基础配置
  8. 获取汉字首字母,拼音,可实现拼音字母搜索----npm js-pinyin
  9. 陈梓涵:关于编程的胡扯
  10. VMware15pro安装Windows7虚拟机详细教程
  11. 栈(LIFO)的存储
  12. win10常用软件汇总
  13. 多包管理工具lerna搭建项目---基本常用命令
  14. Oracle 中常用的字符串函数总结
  15. python计算差商_Python实现牛顿插值法(差商表)
  16. js 和php 互操cookie 作用域
  17. Qt 中十六进制字节流转换为Base64编码
  18. PHP常用函数总结(180多个)
  19. 【知乎整理】云计算和虚拟机(VMWare)有什么区别?
  20. matlab创建圆点标定板,Halcon学习(十八)如何制作标定板

热门文章

  1. STM32F4(正点原子)学习笔记(一):GPIO及其小实验
  2. ZO-signSGD
  3. libnet发包过程
  4. Java版支付宝手机网站支付
  5. 企业微信消息推送卡片按钮互动的使用
  6. 《嫌疑人X的献身》——两个天才之间的思想火花
  7. 什么是高防服务器,高防服务器的原理
  8. FreeRTOS-软件定时器篇
  9. 九宫格解锁Android代码
  10. vs可以开发python吗_vs可以写python吗