振南技术干货集:振南当年入门C语言和单片机的那些事儿(3)

news2024/11/25 3:21:04

注解目录

第一章《振南当年入门 C 语言和单片机的那些事儿》

1、注定堕入单片机

1.1 懵懂好奇的我

(小时候好奇的性格经常让我屁股开花。初中开始对计算机产生兴趣,并一发不可收拾。)

1.2 我的 C 语言学习经历

(上大学后自学 C 语言。遇到“能人”加入 ACM 竞赛。感觉 C 语言乐趣多多,程序如人生。)

1.3 C 语言的顶级赛事

(ACM 国际程序设计竞赛在东北被我们发扬光大。ACM 竞赛浙大的一段传奇佳话。振南在关注的 IOCCC 国际混乱 C 代码大赛。网吧包宿学 C 语言惊呆室友。)

1.4 岔路口上选择单片机

(搞纯软件还是搞单片机,这是一个抉择。鬼才杜撰拉我进入单片机快车道。)

1.5 窗户纸破了

(入门阶段的困惑,看破 C 语言与单片机之间的鸿沟。)

2 、看穿单片机

2.1 CPU 模型

(CISC 与 RISC 指令集。CPU 如何执行指令。汇编不是第一代编程语言,打孔纸带才是。)

2.2 存储器模型

(存储器就是一个指令和数据的容器。)

2.3 总线模型

(地址、数据和控制三大总线。贯穿整个单片机芯片的通路。)

2.4 外设模型

3、单片机跑起来

3.1 时钟系统

(时钟是单片机激励和血液。时钟频率不能无限提高。)

3.2 二进制

(为什么单片机采用二进制?振南告诉你如果单片机使用十进制会怎样?)

3.3 中断机制

(中断不是在给 CPU 捣乱。中断对于单片机为什么如何重要?)

看穿单片机

经历了十多年的单片机开发,站在我现在的高度来回看单片机,可谓望眼欲穿。

下面振南要介绍的是“单片机的体系架构模型”,是超脱于任何一种具体型号的单片机芯片之上的(我感觉我要成仙),它具有很强的普适性。几乎所有的单片机,或是ARM、DSP以及更为高端的处理器都遵循这一模型。或者说,这一模型中的几大要素是必需的。我认为只有在这个层面上,午能真而“看深单片机”。

1.1 CPU模型


CPU,即中央处理单元,它是计算机系统的核心,占有至高无上的地位,拥有绝对的管理权与控制权,如图 1.5 所示。


图1.6 CPU在计算机系统中占有核心地位

CPU的核心要务是执行指令,比如计算两个数的和、读写寄存器、操作总线读写内存等等。每一个CPU都有自己事先设计好的一套指令集,或称指令系统,每一条指令完成一项具体的操作和功能。但是指令集并不是凭空存在的,每条指令必然都对应着一套电路。当CPU执行一条指令时,其实就是相应的电路在工作。所以,一个 CPU 的性能是否优异,一部分因素就在于指令集是否丰富,指令功能是否强大,指令电路是否强大而高效。从复杂程度上来说,CPU指令集主要分为两种:复杂指令集(CISC) 与精简指令集(RISC)。大多数的嵌入式CPU都是RISC的,这一方面表现在指令的数量上:指令少,则对应的电路就少,可以很大程度上降低CPU设计的难度,同时也降低了功耗;另一方面则表现在指令的功能量级上:指令本身一般不宜实现过于复杂的功能,这使得指令执行效率比较高CISC则不同(x86就是最为经典的CISC指集),它的指数量庞大(少的有300条左右,多的甚至超过500条,而 RISC通常不超过10 条),而且指令的功能都比较强大。这意味着采用CISC指令集的CPU在电路设计上的难度很大,研发周期比较长。但是它在功能和性能上都是RISC所无法企及的(一条 CISC指所完成的工作可能需要若干条RISC指令才能完成)。所以在大型服条器、工作站这些计算机系统中大多使用CISC指CPU实际上,CISC 与 RISC只是为了适应不同的需求而产生的,它们并非对立,反而是相互促进,取长补短的关系。CISC中已经开始加人部分RISC指令,而在嵌人式领域中也出现了一些CISC指令的CPU。融合了 CISC与RISC双重指集的新型CPU将是以后的发展趋势。上面是振南对CPU指令集的简要介绍,其实与指令集密切相关还有一些关键技术,比如流水线、指令预取、乱序执行等等,是它们让CPU的性能有了更大的提升(振南早期就职于In-tel 中国研究院,主要就是研究这方面技术,所以深有感触)。不过在这里振南不对其进行讲解,有兴趣的读者可以自行研究。

直到现在,仍然有很多人向我资询关于计算机基本原理、体系架构、硬件组成等等方面的问题,我在解答之余,也在问他们:“你们对计算机基础如此感兴趣,为什么起初不学计算机专业呢?”我其实明白,很多人在高考报志愿的时候,都是有些盲目的。

指令的实质是什么?是 C语言中的 a=0? 是汇编语言中的 MOV?不,大家看到的这些语句只是指令的一种表达形式而已。指令的实质上是一个有一定长度的二进制序列(比如0101111010101010 或 1011010111011011等)。CPU 在得到指今之后,首先由指令译码电路从中分离中操作码、操作数,如图 1.6 所示(以 51 的 MOV 指令为例进行说明)。


图1.7 对指令码的译码

01110100 即为指令 74H,它的功能是将后面的操作数(00010000,即10H)传送到 A 寄存器(51CPU中的累加器)。这条指令如果使用汇编语言来表示就是MOV A,# 10H,它通过汇编器翻译之后,就是上图中的16 位指令码(汇编语言的提出,只是对最原始的CPU二进制指令进行了封装,用一些便于记忆的标识,比如MOV、ADD、INC等对指令进行表示,经过汇编器翻译后,就是可直接进入CPU 进行执行的指令码序列了)。

振南经常想像在CPU问世初期人们是如何向 CPU输入指令的一“打孔纸带”,如图 1.7所示。

在汇编语言产生之前,程序指令的编制都要完全靠人工来完成。人们将编好的若干条指令通过纸带打孔方式输人到CPU中,让它可以依次执行,最终完成整个计算任务(纸带上的“孔’与“实’代表了1和 0)。从某种意义上来说,“纸带”才是第一代编程语言,然后“汇编语言”是第二代编程语言。它们都是离CPU指令最近的语言,所以我们称之为“低级语言”。最


图1.8 人们使用纸带打孔方式向CPU输入指令

后才产生了C语言,它与我们人类日常使用的自然语言(英语)已经非常接近,这意味着它离CPU指令很远了。它需要经过专门的编译器进行预处理、语义分析、编译等加工处理,生成中间代码(汇编),然后再进一步进行汇编,连接等处理才能得到真正可由CPU执行的指令码。所以,C 语言被称为“高级语言”。

综上所述,我们可以认为CPU就是一个取指令执行的机器,这就是CPU的主要功能和工作。但是CPU的体系结构又并非仅仅这么简单,如何协调取指令的过程,防止出错? 指令存储在哪里?CPU如何从存储器中取出指令?这些问题我们都要深刻理解,否则C语言和单片机是无法真正精通的。

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

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

相关文章

虚拟机网络没有有效的ip配置

虚拟机网络没有有效的ip配置: 原因猜测:或许是之前使用的操作系统把网络给占了。 解决方法:点击虚拟机的 遍历->网络编辑器->移除不要的网络,然后添加网络。(下面的图就是我把虚拟网络全部移除,然后…

ke10javaweb停更

<jsp:getProperty property"isval" name "username"/> property来修改属性,name是类 所以如果调用tip在前面那么就是没有设置值 证明是先到java里面去运转

JNPF开发平台:加速企业数字化转型,提升业务效率

如今&#xff0c;随着信息化的深入发展&#xff0c;数字化转型已经成为企业生存和发展的关键。为了在竞争激烈的市场中保持领先地位&#xff0c;企业需要快速地适应变化&#xff0c;优化业务流程&#xff0c;并提供优质的用户体验。而在这其中&#xff0c;低代码开发平台JNPF是…

VulnHub Nullbyte

一、信息收集 1.nmap扫描 arp-scan -l扫描内网存活主机 ┌──(root&#x1f480;kali)-[~/桌面] └─# nmap -sS -A -p- 192.168.103.201/24 -sS 半扫描 -A 扫描详细信息 -p- 扫描全端口发现开放了80、111、777、50978端口 且发现777端口开放了ssh服务&#xff0c;说明他把…

SQL Server 2022 安装步骤——SQL Server设置身份验证教程

目录 前言: 安装详细步骤: 第一步: 第二步: 第三步: 第四步: SQL Server 连接的方式: Window验证: SQL Server验证: 两者之间区别: 总结: SQL Server身份验证登录配置教程:​ 第一步: 第二步: 第三步: 番外篇: 前言: 本文讲解&#xff0c;如何安装SQL Server安…

Android修行手册-POI操作Excel实现超链接并且变为蓝色

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

RESTFUL是什么,为什么使用,有什么优点

ESTful&#xff08;Representational State Transfer&#xff09;是一种软件架构风格&#xff0c;用于设计网络应用程序和服务。它是一种面向资源的设计理念&#xff0c;强调资源的标识、表现层和统一接口。RESTful 架构的设计原则和优点使得它成为构建分布式系统和 Web 服务的…

【CMU 15-445】Proj1 Buffer Pool Manager

Buffer Pool Manager 通关记录Task1 LRU-K Replacement PolicyTask2 Disk SchedulerTask3 Buffer Pool ManagerFlushPageFlushAllPagesUnpinPageNewPageFetchPageDeletePage Optimizations CMU-15445汇总 本文对应的project版本为CMU-Fall-2023的project1 由于Andy要求&#xf…

切换数据库的临时表空间为temp1 / 切换数据库的undo表空间为 undotbs01

目录 ​编辑 一、切换临时表空间 1、登录数据库 2、查询默认临时表空间 3、创建临时表空间temp1&#xff08;我们的目标表空间&#xff09; 4、修改默认temp表空间 5、查询用户默认临时表空间 6、命令总结&#xff1a; 二、切换数据库的undo表空间 1、查询默认undo表…

护眼台灯横评|书客、明基、松下品牌大测评告诉你谁才是最亮的星!

护眼台灯哪个牌子好&#xff1f;随着护眼台灯普及率的日渐提高&#xff0c;护眼台灯市场也是十分火爆&#xff0c;但很多商家为了盈利&#xff0c;总是把重心放在宣传和营销手段上&#xff0c;从而导致护眼台灯的产品质量不过关&#xff0c;在使用过后不仅没有起到缓解眼睛疲劳…

【CASS精品教程】cass 3d基于osgb三维模型生成等高线的两种方法

对于植被、房屋稀少的地方,可以基于osgb模型直接生成等高线。本文讲解在cass11.0 3d中基于osgb三维模型生成等高线的两种方法。 一、加载osgb三维模型 二、生成等高线 1. 绘制等高线 cass11版本提供了绘制单个等高线的功能。 点击【绘制等高线】,提示输入等高距。 输入固定…

JVM中jhat虚拟机堆转储快照分析工具

jhat虚拟机堆转储快照分析工具 1、jhat jhat也是jdk内置的工具之一。主要是用来分析java堆的命令&#xff0c;可以将堆中的对象以html的形式显示出来&#xff0c;包括对 象的数量&#xff0c;大小等等&#xff0c;并支持对象查询语言。 使用jmap等方法生成java的堆文件后&a…

【考研数据结构代码题3】用栈实现十进制数转为八进制数

题目&#xff1a;将十进制数m1348转换成八进制数 难度&#xff1a;★ 算法思路&#xff1a;十进制转八进制的核心原理是“用辗转相除法不断对8取余&#xff0c;最后将余数反向输出”&#xff0c;即先求出来的余数后输出&#xff0c;符合“先进后出”的栈的特性&#xff0c;故设…

七个优秀微服务跟踪工具

随着微服务架构复杂性的增加&#xff0c;在问题出现时确定问题的根本原因变得更具挑战性。日志和指标为我们提供了有用的信息&#xff0c;但并不能提供系统的完整概况。这就是跟踪的用武之地。通过跟踪&#xff0c;开发人员可以监控微服务之间的请求进度&#xff0c;从而使他们…

C#基于inpoutx64读写ECRAM硬件信息

inpoutx64.dll分享路径&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rOt0xtt9EcsrFQtf7S91ag 提取码&#xff1a;7om1 1.InpOutManager&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServi…

多级缓存之缓存同步

缓存数据同步的常见方式有三种&#xff1a; 设置有效期&#xff1a;给缓存设置有效期&#xff0c;到期后自动删除。再次查询时更新 优势&#xff1a;简单、方便缺点&#xff1a;时效性差&#xff0c;缓存过期之前可能不一致场景&#xff1a;更新频率较低&#xff0c;时效性要…

d3.js

D3&#xff1a;Data-Driven Documents • 通过D3提供的接口来基于数据操控文档的各个图元。 标题对于D3(本讲解)最为重要的标签&#xff0c;主要操作的对象(画布) HTML - 导入D3.js D3.js作为JavaScript的外库&#xff0c;必须先将其导入&#xff0c;如&#xff1a; Python的…

[autojs]用户界面GUI编程

用户界面: UI视图: View attr(name, value)attr(name)whidgravitylayout_gravitymarginmarginLeftmarginRightmarginTopmarginBottompaddingpaddingLeftpaddingRightpaddingToppaddingBottombgalphaforegroundminHeightminWidthvisibilityrotationtransformPivotXtransformPivo…

移位操作符 位操作符详解

hello hello&#xff0c;想我了吗? &#x1f604;&#x1f604;&#x1f604; 首先是移位操作符&#xff1a;<< 左移操作符 >> 右移操作符 注&#xff1a;移位操作符的操作数只能是整数。 << 左移操作符&#xff1a;移位规则&#xff1a; 左边抛弃、…

我的AIGC部署实践03

我的AIGC部署实践03 这会是AIGC部署实践的第三回&#xff0c;用免费的GPU部署自己的stable-diffusion下面我们就开始吧。 1.创建项目 创建项目的镜像及数据集如下&#xff1a; 选择完成后点击创建&#xff0c;代码选择暂不上传。 2.初始化开发环境实例 点击最右侧的“开发…