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

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实时操作系统
posted @ 2024-12-06 10:51  辰令  阅读(45)  评论(0)    收藏  举报