入门概念

I/O:是指中央处理器和外设的通信。
I/O端口:是外设的地址,即外设寄存器(数据寄存器、状态寄存器、控制寄存器)在处理器I/O空间的地址。每个外设占用的地址不相同。外设也像内存的存储单元那样通过地址进行区分。
映射:在计算机中是指处理器的地址空间与内存或外设的对应关系。

内存映射I/O空间是指外设的地址和内存的地址在同一个地址空间。ARM PowerPC
软件工程师:I/O端口的读写熟读外设的芯片手册。此乃软件驱动的九阴真经。
硬件工程师:片选,译码和时序。

中央处理器和外设通信方法:

1 IO端口

2 中断

硬中断:外设需要处理器的中断信号线。
软中断(陷阱):通过执行处理器的指令触发。
高优先级的中断会打断低优先级的中断。


硬件连接: 外设需要使用一根中断信号线,并将这一信号线与处理器中断输入管脚连接在一起。
外设主动改变中断线上的电平,产生中断信号进行通知。外设还的在其状态寄存器中设置对应的值,处理器读取状态寄存器的值,判断是那个中断发生,执行相应的中断服务程序。
处理器需要在外设工作之前初始化好处理器的中断控制器和中断服务程序(ISR)。并且中断控制器可以设置中断的触发类型。电平触发,边沿触发。边沿触发上升沿触发



中断服务程序的实现
保存中断时刻处理器的所有寄存器的值,目的是中断服务程序执行完了还能恢复到中断之前的状态并继续运行。处理器的寄存器资源在中断模式和非中断模式之间是共享的。
保存中断之前的寄存器的值需要使用栈,中断状态栈的方式有2种:放到当前正在运行程序的栈上。
方式2:为中断状态提供特定的栈。
1:读取外设中断状态寄存器的值
2:处理器处理完了之后,需要通知外设芯片,即向外设芯片的寄存器中的某一位写入一个值。
通常是清寄存器中的中断。
3:处理器清空外设芯片的中断。

字节序
内存是以字节为单位寻址。
大端模式:高字节放在低地址
小端模式:低字节放在低地址

测试大小端模式方法

         int number = 1;
  if(*(char *)&number)
  printf("Little-endian!\n");
  else
  printf("Big-endian!\n");

大端在数据类型的转换中存在问题,不利于程序的可移植性。
ARM芯片要么采用全部大端的方式储存,要么提供选项支持大端——可以在大小端之间切换。

边界对齐
32位处理器每一次读取操作都是32位的,即4个字节。
所以访问的起始地址必须是4的倍数。
采用边界对齐对变量的访问一次即可读取。
非边界对齐对变量的访问需要多次读取。
对于结构体和枚举,联合的边界对齐方法。

边界对齐的目的是提高处理器的工作效率。

在C编程中,对于结构体的对齐方式,暂时我是百度的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Graph(图)是一种非常重要的数据结构,它可以用来表示许多实际问题,比如社交网络、路线规划等。在这里,我将为你介绍图(Graph)的入门概念、存储结构、遍历方式以及Java代码的实现。 1. 入门概念 Graph(图)由节点(vertex)和边(edge)组成,节点表示图中的一个实体,边表示节点之间的关系。图可以分为有向图和无向图,有向图中每条边有一个方向,而无向图中每条边没有方向。图中的路径(path)是一系列节点,这些节点通过边相互连接。 2. 存储结构 图的存储结构一般有两种方式:邻接矩阵和邻接表。 邻接矩阵:将图中的节点用一个数组来表示,用一个二维数组来表示边的关系,当两个节点之间有边时,对应的二维数组中的元素为1,否则为0。 邻接表:将图中的节点用一个链表来表示,每个节点的链表中存储与其相连的节点。 3. 遍历方式 对于图的遍历,一般有两种方式:深度优先遍历(DFS)和广度优先遍历(BFS)。 深度优先遍历:从一个节点开始,一直沿着当前路径遍历到底,直到不能再遍历为止,然后回退到上一个节点,继续遍历其他路径。这种遍历方式一般用递归实现。 广度优先遍历:从一个节点开始,依次遍历与其相邻的节点,再遍历与这些节点相邻的节点,依次类推。这种遍历方式一般用队列实现。 4. Java代码的实现 以下是Java代码实现图(Graph)的基本操作: ```java import java.util.*; public class Graph { int[][] adjacencyMatrix; // 邻接矩阵存储图 LinkedList<Integer>[] adjacencyList; // 邻接表存储图 int numVertices; // 节点个数 public Graph(int numVertices) { this.numVertices = numVertices; adjacencyMatrix = new int[numVertices][numVertices]; adjacencyList = new LinkedList[numVertices]; for (int i = 0; i < numVertices; ++i) { adjacencyList[i] = new LinkedList<Integer>(); } } // 添加边 public void addEdge(int i, int j) { adjacencyMatrix[i][j] = 1; adjacencyList[i].add(j); } // 深度优先遍历 public void DFS(int startVertex) { boolean[] visited = new boolean[numVertices]; DFSUtil(startVertex, visited); } private void DFSUtil(int vertex, boolean[] visited) { visited[vertex] = true; System.out.print(vertex + " "); Iterator<Integer> i = adjacencyList[vertex].listIterator(); while (i.hasNext()) { int n = i.next(); if (!visited[n]) DFSUtil(n, visited); } } // 广度优先遍历 public void BFS(int startVertex) { boolean[] visited = new boolean[numVertices]; LinkedList<Integer> queue = new LinkedList<Integer>(); visited[startVertex] = true; queue.add(startVertex); while (queue.size() != 0) { startVertex = queue.poll(); System.out.print(startVertex + " "); Iterator<Integer> i = adjacencyList[startVertex].listIterator(); while (i.hasNext()) { int n = i.next(); if (!visited[n]) { visited[n] = true; queue.add(n); } } } } } ``` 以上就是图(Graph)的入门概念、存储结构、遍历方式以及Java代码的实现。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值