首页 > 其他分享 >test

test

时间:2024-11-25 14:00:35浏览次数:2  
标签:初始化 存储 FLASH 擦除 内存 test 数据

![[Pasted image 20241015105259.png]]

RAM

Random Access Memory:

a. DRAM(动态随机存取存储器)
DRAM是计算机系统中最常见的RAM类型之一。
它使用电容和电流来存储数据,并且需要刷新操作以保持数据的稳定性。
DRAM容量较大,成本相对较低,因此广泛用于主内存(RAM)。
b. SRAM(静态随机存取存储器):
SRAM是另一种常见的RAM类型,相对于DRAM来说,更快、更稳定。
它使用存储触发器(通常是互补金属氧化物半导体CMOS电路)来存储数据。
SRAM速度快,但比DRAM成本更高,一般用于高性能缓存和高速缓冲存储器。
c. SDRAM(同步动态随机存取存储器):
SDRAM是一种同步的DRAM类型,与系统主时钟同步工作。
它通过分时多通道的方式提供高速访问和数据传输。
SDRAM广泛用于计算机系统和其他需要高性能存储的设备。
d. DDR SDRAM(双倍数据率同步动态随机存取存储器):
DDR SDRAM是SDRAM的一种进化形式,提供了更高的传输速率。
它通过在每个时钟周期内传送两次数据,实现更高的带宽和更快的数据访问速度。
DDR SDRAM用于大多数现代计算机系统中的主内存。

ROM

Read-Only Memory:

a. MASK ROM(掩模只读存储器):
MASK ROM是在制造过程中被预先编程的ROM类型,无法在常规操作下进行修改。
它的数据是通过光刻等工艺制作在芯片上的,被“硬编码”进入芯片的电路结构中。
MASK ROM适用于存储固定的启动程序、固件等代码。
b. PROM(可编程只读存储器):
PROM是一种可编程的只读存储器,用户可以通过编程操作一次性地将数据写入其中。
编程操作通常由专用的编程设备或编程器完成,一旦写入数据后,数据将无法修改。
PROM适用于需要存储不可更改数据的应用,如设备固件等。
c. EPROM(可擦除可编程只读存储器):
EPROM是一种可擦除的可编程ROM,允许用户多次编程和擦除操作。
EPROM使用紫外线擦除器件来擦除数据,然后通过编程器进行重新编程。
EPROM通常用于存储需要经常更新的程序和数据的应用。
d. EEPROM(电可擦除可编程只读存储器):
EEPROM是一种电可擦除的可编程ROM,相对于EPROM,它不需要紫外线擦除器件。
EEPROM可以通过电压脉冲来擦除和编程数据,使得操作更加方便和可靠。
EEPROM广泛应用于存储配置数据、校准数据、设备序列号等的场景。
e. Flash存储器:
Flash存储器是一种基于EEPROM技术的存储器,具有非易失性和高密度的特点。
Flash存储器可以通过块擦除方式进行修改,相比EEPROM更具灵活性和可编程性。
Flash存储器广泛应用于各种存储需求,如固件存储、系统存储、可移动存储介质等。
**f.nand flash 和 nor flash

NandFlash

NAND FLASH同样是按块擦除,但是数据线和地址线复用,不能利用地址线随机寻址。读取只能按页来读取(NAND FLASH按块来擦除,按页来读,NOR FLASH没有页)。由于NAND FLASH引脚上复用,因此读取速度比NORFLASH慢一点,但是擦除和写入速度比NORFLASH快很多。NAND FLASH内部电路更简单,因此数据密度大,体积小,成本也低。因此大容量的FLASH都是NAND型的。小容量的2~12M的FLASH多是NOR型的。

NorFlash

NOR FLASH数据线和地址线分开,可以实现RAM一样的随机寻址功能,可以读取任何一个字节。但是擦除仍要按块来擦。Nor 闪存可以对字进行操作,容量小可以直接和CPU总线式相连,CPU上电后直接读取,一般用作启动介质

NORFLASH可以进行字节寻址,所以程序可以在NOR FLASH中运行。嵌入式系统多用一个小容量的NOR FLASH存储引导代码,用一个大容量的NAND FLASH存放文件系统和内核。

eeprom和flash的使用场景

![[7d972551c1394139b1efc35033d0e928.webp]]

C语言和RAMROM的交互

![[Pasted image 20240611174017.png]]
单片机运行时从ROM中提取代码和变量到RAM中运行,栈中包含的函数的代码,起始地址,返回地址,局部变量,函数参数![[Pasted image 20241015101519.jpg]]

(1)代码区(text segment)。代码区指令根据程序设计流程依次执行,对于顺序指令,则只会执行一次(每个进程),如果反复,则需要使用跳转指令,如果进行递归,则需要借助栈来实现。

代码区的指令中包括操作码和要操作的对象(或对象地址引用)。如果是立即数(即具体的数值,如5),将直接包含在代码中;如果是局部数据,将在栈区分配空间,然后引用该数据地址;如果是BSS区和数据区,在代码中同样将引用该数据地址。

(2)全局初始化数据区/静态数据区(Data Segment)。只初始化一次。

(3)未初始化数据区(BSS)。在运行时改变其值。

(4)栈区(stack)。由编译器自动分配释放,存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈。每当一个函数被调用,该函数返回地址和一些关于调用的信息,比如某些寄存器的内容,被存储到栈区。然后这个被调用的函数再为它的自动变量和临时变量在栈区上分配空间,这就是C实现函数递归调用的方法。每执行一次递归函数调用,一个新的栈框架就会被使用,这样这个新实例栈里的变量就不会和该函数的另一个实例栈里面的变量混淆。

(5)堆区(heap)。用于动态内存分配。堆在内存中位于bss区和栈区之间。一般由程序员分配和释放,若程序员不释放,程序结束时有可能由OS回收。

之所以分成这么多个区域,主要基于以下考虑:

**1、一个进程在运行过程中,代码是根据流程依次执行的,只需要访问一次,当然跳转和递归有可能使代码执行多次,而数据一般都需要访问多次,因此单独开辟空间以方便访问和节约空间

2、  临时数据及需要再次使用的代码在运行时放入栈区中,生命周期短。

3、 全局数据和静态数据有可能在整个程序执行过程中都需要访问,因此单独存储管理。

4、 堆区由用户自由分配,以便管理。

编译

![[Pasted image 20241015150849.png]]、![[Pasted image 20241015150854.png]]

BSS段

bss段(bss segment,bss是英文Block Started by Symbol的简称),bss段属于静态内存分配。

存放程序中未初始化的全局变量和静态局部变量。BSS段中的变量在程序开始执行前没有被赋予任何值,通常这些变量会被操作系统或链接器初始化为0。BSS段不占用可执行文件的空间,它的存在只是记录了这些变量所占用的内存大小;

当程序运行时,操作系统会负责将BSS段初始化为0。这样的内存布局有助于优化程序的加载时间和减少程序的内存占用

data段

数据段(data segment),数据段属于静态内存分配。
指存放程序中已初始化的全局变量和静态局部变量、非const的全局变量的一块内存区域;

程序中已经初始化的非零的全局变量和已经初始化的非零的静态局部变量(static)
注:const全局变量一般放到了rodata段,初始化为零的全局变量可能被编译器优化到 bss段

text段

代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域,程序执行时CPU会读取并执行的机器指令。
代码段大小在程序运行前就已经确定,并且内存区域通常属于只读(某些架构也允许代码段为可写,即允许修改程序)。
在代码段中,可能包含一些只读的常数变量,例如字符串常量等。

注:1.text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中加载;而bss段不在可执行文件中,由系统初始化。
2.text段一般也包含rodata段,text段可以存放到flash中;data段也放到flash中,运行时由flash中加载到SRAM;bss段在运行时系统创建,存放到RAM中

标签:初始化,存储,FLASH,擦除,内存,test,数据
From: https://www.cnblogs.com/pxk-rl/p/18567412

相关文章

  • 关于测试你混淆appium、adb、pytest了吗?
    1.区别功能重点ADB:侧重于安卓设备的调试和基本操作。它能与安卓设备进行底层交互,如文件传输、应用安装/卸载、设备状态查看等。例如,通过adbpush命令将本地文件推送到安卓设备,或者使用adblogcat获取设备的日志信息,这些操作主要是针对设备本身的管理和调试。Appium:专注于......
  • Toyota Programming Contest 2024#11(AtCoder Beginner Contest 379)
    A-Cyclic链接:A-Cyclic代码:#include<bits/stdc++.h>usingnamespacestd;intmain(){ stringss; cin>>ss; cout<<ss[1]<<ss[2]<<ss[0]<<""<<ss[2]<<ss[0]<<ss[1]; return0;}B-Strawberri......
  • C++自动化测试:GTest 与 GitLab CI/CD 的完美融合
    在现代软件开发中,自动化测试是保证代码质量和稳定性的关键手段。对于C++项目而言,自动化测试尤为重要,它能有效捕捉代码中的潜在缺陷,提高代码的可维护性和可靠性。本文将重点介绍如何在C++项目中结合使用GoogleTest(GTest)和GitLabCI/CD,特别是通过提供详细的脚本示例,展示如何......
  • 【Python】 深入理解Python的单元测试:用unittest和pytest进行测试驱动开发
    《PythonOpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门!单元测试是现代软件开发中的重要组成部分,通过验证代码的功能性、准确性和稳定性,提升代码质量和开发效率。本文章深入介绍Python中两种主流单元测试框架:unittest和pytest,并结合测试驱动开发(TDD)的思想,展示如......
  • 【拥抱AI】对比embedding模型gte-Qwen2-7B-instruct和bge-m3:latest(三)
    为了更全面地评估gte-Qwen2-7B-instruct和bge-m3:latest的性能,我们可以从以下几个方面进行详细比较:1.模型架构和规模gte-Qwen2-7B-instruct架构:基于Transformer的大型语言模型。参数量:7B参数,具有较强的表达能力和泛化能力。训练数据:经过大量指令-响应对的训练,特别适......
  • [题解](更新中)[test06]2024/11/23 模拟赛 / 2023牛客OI赛前集训营-提高组(第三场) A~C
    原题页面:https://ac.nowcoder.com/acm/contest/65194Statements&Solution:https://www.luogu.com.cn/problem/U507978\(80+80+50+24=234\)。A贪心+双指针。根据贪心思想,大值选大、小值选小。我们按绝对值从大到小给\(a\)排序,再按从小到大给\(b\)排序,取双指针\(l=1,r=m\)......
  • 每日一题:https://codeforces.com/contest/2005/problem/B1
    题目链接:https://codeforces.com/contest/2005/problem/B1(开局看掉m=2和q=1)includeincludeusingnamespacestd;intmain(){longu;cin>>u;for(;u>0;u--){longn;longm,q;longarr1[3];longcha;cin>>n>>m>>q;for(inti=0;i<2;i++){......
  • 软件测试报告-布里斯托网址/曼彻斯特网址的自动化测试Testsuite.side和用户故事UserSt
    软件测试报告-布里斯托网址/曼彻斯特网址的自动化测试Testsuite.side和用户故事UserStory和java_code曼切斯特/java+junit+seleniumIDE+side软件测试实现/布里斯托bristol.ac.uk的LinkGraphAdequacy 也就是userstory软件测试#testsuites.side 执行日志log先演示......
  • 【Atcoder训练记录】AtCoder Beginner Contest 381
    训练情况赛后反思简单题A题做红温了,怒吃6罚时,C题双指针其实差不多想出来了,但是对于判断字符串合法其实可以只判断两个端点,不需要全部遍历,中途还想了二分做法(?),然而写到最后发现并没有二分单调性。A题记得判断字符串的长度必须是奇数,\(1\sim\frac{n+1}{2}-1\)是1,\(\frac{......
  • AtCoder Beginner Contest 381
    这场比赛打的冷汗直流,然后无奈寄掉。C-11/22Substring本以为直接暴力就可以,但是需要加前缀和优化,一个正向处理,一个反向处理,然后查找/。abc381_d赛前2分钟hack掉自己的代码,然后寄掉。双指针答案必须是连续的区间,所以想到双指针维护区间合法性,但需要处理以下细节:\(a_r\n......