首页 > 编程语言 >CPU_和C++_计算机组成原理-嵌入式系统-C++

CPU_和C++_计算机组成原理-嵌入式系统-C++

时间:2024-12-06 11:01:01浏览次数:8  
标签:-- C++ 嵌入式 内存 寄存器 堆栈 CPU

CPU

CPU(Central Processing Unit,中央处理器)
 CPU 缓存 流水线Pipelining 超线程 Hyper-Threading
 CPU调度(CPU Scheduling)和上下文切换(Context Switching)

让控制器从存储器中读取二进制并解释然后让运算器去计算数值

CPU核心组件:

  算术逻辑单元(ALU):执行算术和逻辑操作。
  寄存器文件:包含通用寄存器和特殊寄存器,如程序计数器(PC)。
  控制单元:解码指令并生成控制信号。
  流水线结构:提高指令执行效率。
  
01.ALU四要素:
    操作码(Opcode)    Instruction 
	操作数(Operand) 
    运算结果 Result 
	和标志位 Falgs
 操作数和运算结果--》寄存器Registers 以及DataMemory
 指令
 标志位--status 寄存器 
 
指令寄存器(IR,Instruction Register),用于暂存当前正在执行的指令 
    指令寄存器--指令顺序执行和指令跳转执行 
程序计数器(Program Counter Register)  是用于存放下一条指令所在单元的地址的地方--指令计数器
    跳转后返回原位置--初期采用 程序返回地址寄存器--后续采用了栈的结构(stack) 先进后出
cs(Code Segment)是硬件CPU中的代码段寄存器	
     变量太多了,寄存器不够用,
	 需要用内存来存变量,这时候遇到的本质问题就类似于寄存器保存的问题,都是要在内存中开辟一片空间
	
   栈--一段连续的存储空间  堆栈寄存器Stack-pointer  栈溢出  顺序执行和跳转执行pc+offset
        对应编程中的--函数返回值地址  栈区主要用于存储局部变量、函数参数和返回地址等
		(Stack Frame)
		Stack Leak(栈泄漏) overflow  一般发生在递归函数或者函数中有大循环,其有定义局部变量
		  越界访问--跑飞了
		Stack Frame Corruption栈帧破坏
		栈是多线程编程的基石: 在操作系统中 上下文切换
   堆 heap 向下分配--
      内存管理不当,会导致内存泄露(堆泄露)。而内存泄漏可能会堆栈的不足,进而出现堆栈溢出
	    堆内存泄漏(heap leak),是程序员在分配一段内存后,分配的内存未被释放且无法再次访问时发生
  	   
    Buffer overflow(缓冲区溢出):固定大小缓冲区的写操作超出其边界
       缓冲区溢出经常导致堆栈上的数据被覆盖
	Memory Allocation Failed
        请求大量内存时,可能会因为内存不足或者没有足够的连续内存导致分配内存失败。
  
电路--存储器--地址
     存储器单元实际上是时序逻辑电路的一种
	   存储器内部结构由地址译码器、存储单元、控制逻辑电路等部分组成
	地址--从编程和硬件的抽象上看
硬件电路 --有序的高低电压--指令--一套驱动编码-CPU识别的0/1机器码---程序--软件只是对硬件的一种反映

控制单元

  取指令->解码->执行
    控制单元”负责选择正确的寄存器作为输入,并配置ALU执行正确的操作,同时作为缓冲区保存ALU计算结果
	“时钟”来负责管理的。时钟以精确的间隔,触发电信号,控制单元会用这个信号,推进CPU的内部操作,确保一切按步骤进
   时钟周期
   开关的通断  程序本身就是高低电平的组合  通过数字电路得到一种逻辑实现
   译码电路
内存是计算机中重要的单元,而堆栈是内存中最重要的应用组成。


实际执行中 :动态内存分配
   在标准工作负载、最小负载和最大负载下,对真实目标运行堆栈分析,以全面了解堆栈的使用情况
   
工具链 
   编译工具链,包括编译器(如 GCC)、汇编器、链接器等	
操作系统管理硬件资源,提供多任务、内存管理等功能   


CPU的减、乘、除都是基于加法、移位等操作实现的。
   加法过程依赖CPU的ALU累加器,
   累加器背后的电路是数字电路异或门和与门的组合

语言特性

  高级语言,离机器很远,但是很容易被人的逻辑理解

  C++程序中,不必要的对象复制会导致额外的CPU和内存开销。使用移动语义和引用(尤其是右值引用)可以避免这种开销
  学习往往伴随着不断的试错和调整,这就像是我们的大脑在逐渐优化其解决问题的“算法”
  
  
 C语言中的动态内存管理为我们揭示了计算机内存的工作机制
     C语言来进行编程,你就必须要了解计算机工作原理方面
      了解数据结构和算法		 
 C++  编译错误、运行错误、链接错误  
     编译错误:
	    书写错误和用法错误
	 链接错误 
	    找不到库文件
		库文件和项目工程版本不一致
     运行错误 
	    数组越界访问,除数位零
示例: 
    空指针  在访问指针之前,务必检查其是否为空
	悬挂指针 指向动态分配内存的指针在释放内存后仍被继续使用
	
	
	缓冲区溢出--数组越界写入--使用 C++11之后的std::string
     无符号整数溢出  不恰当的数组边界检查
    未捕获的异常   未正确关闭文件  动态内存分配和释放不匹配  全局对象的时序和作用域问题
	浮点数精度丢失  隐式类型转换 无符号整数循环条件错误  错误的类型转换
	字符串字面量和字符数组混淆

   多线程竞争条件:
      多个线程同时读写同一数据,未加锁保护。  使用互斥量(mutex)或其他同步机制保护共享资源
	  死锁:两个线程分别持有对方需要的锁,互相等待导致死锁  遵循锁的获取顺序一致性原则,或者使用更高级的并发原语避免死锁

参考

  ARM控制器与嵌入式系统  清华大学 曾鸣 https://www.blazar.org.cn
  嵌入式系统与μC/OS实时操作系统

标签:--,C++,嵌入式,内存,寄存器,堆栈,CPU
From: https://www.cnblogs.com/ytwang/p/18590217

相关文章

  • 2023年12月GESPC++二级真题解析
    一、单选题(每题2分,共30分)题目123456789101112131415答案CADDDADCDBCDCBB1.以下不可以做为C++变量的是()。A.FiveStarB.fiveStarC.5StarD.Star5【答案】C【考纲知识点】变量的定义与使用(二级考纲知识点范畴),具体涉及到变量名的命名规则。在C++语言中,变量名有严格......
  • 【嵌入式】-VMware-Ubuntu-Linux- 基础指令 | 使用工具安装 | 常见问题
    ### 本篇博客主要记录我在学习过程中用到的比较好的工具以及遇到的一些问题及解决办法。###   目录一、常用Shell命令及快捷键##shell命令##文件操作快捷键二、VIM编辑器三、OpenVMTools安装(1)更新软件包列表(2)安装open-vm-tools-desktop(3)安装必要的依赖项......
  • 《C++神经网络编程:激活函数的策略性遴选》
    在当今数字化浪潮汹涌澎湃的时代,人工智能尤其是神经网络技术正以前所未有的速度革新着各个领域。而在C++神经网络算法的构建进程中,激活函数的选定无疑是一项极具策略性与技巧性的关键环节,它宛如神经网络的“智慧开关”,深刻左右着模型的学习效能、适应性以及整体的表现水准......
  • 《C++与AI共舞:模型压缩率与预测准确率的平衡之路》
    在人工智能的璀璨星空中,C++以其卓越的性能与高效的执行效率,成为众多开发者构建智能应用的得力工具。而在这一过程中,如何巧妙地平衡模型压缩率与预测准确率,恰似一场精妙绝伦的共舞,考验着每一位开发者的智慧与技艺。一、模型压缩与准确率的跷跷板困境模型压缩,旨在减少模型的......
  • 11C++循环结构-for循环(1)——教学
    一、for语句(第27课老狼老狼几点钟)参考1引出问题:当需要重复执行某一语句时,使用for语句。for语句最常用的格式为:for(循环变量赋初值;循环条件;循环变量增值)语句;注:“语句;”就是循环体,可以是一个简单的语句,也可以是一个用“{}”括起来的复合语句。它的执行过程如图示:编......
  • c/c++中的静态链接与动态链接
    一、静态链接静态链接是编译程序时把库文件中的代码和数据复制到可执行文件中的链接方式,程序运行时不依赖外部库,方便移植,但文件较大,更新库需重新编译程序。特点:1. 生成一个单独的可执行文件:在链接阶段,将所有需要的目标模块(包括库函数)都整合到一个单独的可执行文件中。这意......
  • C++中的封装性
    定义:封装性:1.将属性(成员变量)和行为(成员函数)作为一个整体,表现在生活中的事物2.将属性和行为加以权限控制(将事物的属性(成员变量)和行为(成员函数)封装在一起形成一个类,并且设置相应的访问权限)C++中如何实现封装:将数据成员设为私有或保护类型,再提供公有成员函数访问和修改数据,......
  • C++中对象的初始化和清理
    一、.初始化:对象的初始化使用构造函数构造函数构造函数:主要作用在于创造对时为对象的成员属性(成员变量)赋值,构造函数由编译器自动调用,无需手动调用语法:类名(){}1.构造函数没有返回值,函数名前也不用写void2.函数名与类名相同3.构造函数可以有参数,因此可以发生重载4.程序在......
  • 痞子衡嵌入式:简析i.MXRT1170 XECC开启及Data Swap功能对于外部RAM的访问性能影响
    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是i.MXRT1170XECC开启及DataSwap功能对于外部RAM的访问性能影响。文接上篇《i.MXRT1170XECC功能特点及其保护串行NORFlash和SDRAM之道》,这篇文章里痞子衡给大家介绍了XECC原理及在其使能下操作NORF......
  • C++学习日记---第18天(5k字 重载运算符快速通关)
    (本文包含了从基础到中等的运算符重载内容,以及一些在编写代码时可能遇到的问题) 笔记复习1.运算符重载以代码实现一个类的两个对象相加为例#include<iostream>usingnamespacestd;classperson{ intm_deposit=1000; intincome=100;};intmain(){ person......