嵌入式学习笔记(58)程序运行为什么需要内存?

news2025/7/10 20:35:07

1.1.1.计算机程序运行的目的

程序 = 代码 + 数据

代码就是函数,表示加工数据的动作。

数据包括全局变量和局部变量,表示被加工的东西。

程序运行的目的要么重在数据结果(有返回值),要么重在过程(无返回值),要么既重视结果又重视过程。

1.1.2.计算机程序的运行过程

计算机程序的运行过程,其实就是程序中很多个函数相继运行的过程。程序是由很多个函数组成的,程序的本质就是函数,函数的本质就是加工数据的动作。

1.1.3.哈佛结构和冯诺依曼结构

哈佛结构:哈佛结构就是将程序的代码和数据分开存放的一种结构,而他们存放的位置可以是相同的也可以是不同的(ROM&RAM或者RAM),总之只要是分成两个部分单独访问的结构都可以叫哈佛结构。(例如:51的程序运行时,代码放在ROM(NorFlash)中原地运行,而数据则存放在RAM中随代码动作而变动;而S5PV210程序运行时,代码和数据都在DRAM中运行,但是DRAM中又划分了代码段和数据段,二者互不干扰。)哈佛结构的特点就是代码和数据单独存放,使之不会互相干扰,进而当程序出BUG时,最多只会修改数据的值(因为代码部分是只读的,不可改写),而不会修改程序的执行顺序。因此,这种结构大量应用在嵌入式编程。

冯诺依曼结构:冯诺依曼结构是将代码和数据统一都放在RAM中,他们之间一般是按照程序的执行顺序依次存储。这样就会导致一个问题,如果程序出BUG,由于程序没有对代码段的读写限定,因此,它将拥有和数据一样的读写操作权限。于是就会很容易的死机,一旦代码执行出现一点改变就会出现非常严重的错误。但是,冯诺依曼结构的好处是可以充分利用有限的内存空间,并使CPU对程序的执行十分的方便,不用来回跑。

1.1.4.程序运行为什么需要内存?

对于S5PV210的程序来说,程序运行时要存放代码和数据,代码放在DRAM的只读权限代码段,数据放在DRAM的可读可写数据段,程序要跑,内存是必要条件 。

1.1.5.内存管理

从OS角度讲:OS掌握所有的硬件内存,因为内存很大,所以OS把内存分成1个1个的页面(其实就是分块,一般是4KB),然后以页面为单位来管理。页面内用更细小的方式来以字节为单位管理。(OS的内存管理原理复杂,对于我们使用OS的人来说,我们无需了解细节。OS为我们提供了内存管理的一些接口,我们只需要用相应的API即可管理内存。例如C语言中使用malloc、free这些接口来管理内存)。

在没有OS时,也就是裸机程序中程序需要直接操作内存,编程者需要自己计算内存的使用和安排。

从语言角度讲:不同语言提供了不同的操作内存的接口

汇编:根本没有内存管理,汇编中操作内存时直接使用内存地址(如0xd0020010)

C:C语言编译器帮我们管理内存地址,我们都是通过编译器通过的变量名来访问内存的,OS下如果需要大块内存,可以通过API(mallos、free)来访问内存。裸机程序中需要大块内存需要自己定义数组等来解决。

C++:C++对内存的使用进一步封装。我们可以用new来创建对象(其实就是为对象分配内存),然后使用完了用delete来删除对象(其实就是释放内存)。所以C++比C更容易一些。但是C++中的内存管理还是要靠程序员自己来做,例如需要使用delete删除对象释放内存,如果忘记,就会造成内存不能释放,就是所谓的内存泄露。

JAVA/C#等:这些语言不直接操作内存,而是通过虚拟机来操作内存。这样虚拟机作为我们程序员的代理,来帮我们处理内存的释放工作。如果程序申请了内存,使用后忘记释放,那么虚拟机会帮我们释放。看起来,JAVA/C#比C/C++有优势,但是虚拟机回收内存的机制也是要付出一定的代价。

 嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。在评论区私信“嵌入式”0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1103360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java和前端都不好找工作,计算机毕业可以干嘛?

37了,11年多的Java经验,其他什么mysql,linux,Vue等等都会,现在失业在家已经1年多,不指望入职摸鱼了,寻思着转行中。祝你好运 这是某问答社区,有个大四学生提问,好迷茫啊马…

华为云云耀云服务器L实例评测|部署war格式的web项目

目录 准备服务器安装java安装tomcat配置tomcat部署Web Adaptor总结 对于很多刚开始接触编程的朋友,通常都期待自己能部署一个网站,并可以在公网上访问。这就需要一台云服务器。最近发现华为云 推出了 云耀云服务器L实例,使用后,体…

R语言进度条:txtProgressBar功能使用方法

R语言进度条使用攻略 在数据处理、建模或其他计算密集型任务中,我们常常会执行一些可能需要很长时间的操作。 在这些情况下,展示一个进度条可以帮助我们了解当前任务的进度,以及大约还需要多长时间来完成,R语言提供了几种简单且灵…

多模态论文串讲

多模态论文串讲 近几年,尤其是 CLIP 出现以来,多模态学习的发展异常火爆。除了传统的VQA、图文检索、图像描述等,还有受启发于 CLIP 的新任务 Language Guided Detection/Segmentation、文本图像生成、文本视频生成等。本次串讲主要还是围绕…

MATLAB——概率神经网络分类问题程序

欢迎关注“电击小子程高兴的MATLAB小屋” %% 概率神经网络 %% 解决分类问题 clear all; close all; P[1:8]; Tc[2 3 1 2 3 2 1 1]; Tind2vec(Tc) %数据类型的转换 netnewpnn(P,T); Ysim(net,P); Ycvec2ind(Y) %转换回来

机器人力控制构架

在交互过程中,环境会对末端执行器可以遵循的几何路径设置约束。这种情况通常被称为约束运动。在这种情况下,使用纯运动控制策略来控制交互是失败的!! 只有任务准确规划,使用运动控制才能成功执行与环境的交互任务。但…

10.17数电第二次实验

就是数码管有4个,前两个来表示分钟,后两个表示秒钟 然后下面十六个led灯来记录时间,小时以十六进制,就是说4个二进制,4个灯为一组,一共可以显示四位小时 首先是要接收信号,应该是要无信号&…

任务调度器

题目链接 任务调度器 题目描述 注意点 tasks[i] 是大写英文字母任务可以以任意顺序执行两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间 解答思路 利用桶思想,将不同的字母放进同一个桶中,桶的数量为tasks中字母出现频率最高的次数&#xf…

保序回归与金融时序数据

保序回归在回归问题中的作用是通过拟合一个单调递增或递减的函数,来保持数据点的相对顺序特性。 一、保序回归的作用 主要用于以下情况: 1. 有序数据:当输入数据具有特定的顺序关系时,保序回归可以帮助保持这种顺序关系。例如&…

ai配音怎么弄?推荐一款免费好用的ai配音软件

你们做短视频卡在了哪?剪辑?文案?还是配音?我身边很多朋友都卡在了配音,因为他们都觉得自己的声音不好听,普通话不标准,不够自信,那我们到底该如何解决短视频配音难题呢?…

动态规划:11分割等和子集

动态规划:11分割等和子集 416. 分割等和子集 这道题目初步看,和如下两题几乎是一样的,大家可以用回溯法,解决如下两题 698.划分为k个相等的子集473.火柴拼正方形 这道题目是要找是否可以将这个数组分割成两个子集,使…

C++:继承的概念和用法

文章目录 继承的定义基类和派生类的对象赋值转换继承中的作用域派生类的默认成员函数几个继承小点继承理论的演示 菱形继承和菱形虚拟继承虚拟继承 本篇主要总结的内容有 什么是继承继承的一些概念菱形继承和虚拟继承继承的优缺点对比 继承的定义 继承是代码复用的一种重要手…

Redis 主从复制,哨兵,集群——(1)主从复制篇

目录 1. Redis 主从复制是什么? 2. Redis 主动复制能干嘛? 2.1 读写分离 2.2 容灾恢复 2.3 数据备份 2.4 水平扩展支撑高并发 3. Redis 主从复制配置项 3.1 配从库不配主库 3.2 权限密码配置 3.3 基本操作命令 4. 案例演示 4.1 案例说明 4.…

leetCode 647.回文子串 动态规划 + 优化空间 / 中心扩展法 + 双指针

647. 回文子串 - 力扣(LeetCode) 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串&#x…

Springboot-MyBatisPlus-01

一 创建项目&#xff0c;选择spring boot 初始化&#xff0c;配置相关信息 第五步创建实体类 二 快速开发实体类的jar包--lombok <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12<…

Pycharm中终端不显示虚拟环境名解决方法

文章目录 一、问题说明&#xff1a;二、解决方法&#xff1a;三、重启Pycharm 一、问题说明&#xff1a; Pycharm中打开项目配置完需要的虚拟环境后&#xff0c;在Terminal&#xff08;终端&#xff09;中无法切换及显示当前需要运行代码的虚拟环境。 比如以下一种情况&#…

TOUGH2软件教程、CO2地质封存

TOUGH系列软件是由美国劳伦斯伯克利实验室开发的&#xff0c;旨在解决非饱和带中地下水、热运移的通用模拟软件。和传统地下水模拟软件Feflow和Modflow不同&#xff0c;TOUGH系列软件采用模块化设计和有限积分差网格剖分方法&#xff0c;通过配合不同状态方程&#xff08;EOS模…

人体分割模型ACE2P与M2FP,解析人脸人体各部件属性,语义化分析

前言 在做某任务的时候&#xff0c;需要对人物图片进行预处理。 预处理的要求就是要将图片中的人物各部件分割出来&#xff0c;标识为各种不同颜色&#xff0c;比如脸部为蓝色&#xff0c;脖颈部位绿色&#xff0c;其他地方为红色 最初任务使用的PaddleSeg中基于CelebAMask-HQ…

C# RestoreFormer 图像(人脸面部)修复

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms;namespace 图像修复 {pu…

优维低代码实践:片段

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 优维…