分享

代码是如何控制硬件的?(一)

 图书馆收藏文库 2024-03-28 发布于山东

代码是如何控制硬件的?

代码控制硬件的基本原理就是靠代码控制芯片引脚来输出电平(电压)的高低来实现的。计算机世界的010101001都是通过电平电压来表示的。

一款芯片有各种各样的引脚,芯片就是通过这些引脚来与外部模块通信。这些引脚有GPIO口,USB口,PCIE,SDIO等不同的名字,以实现不同的功能,GPIO是其中最简单最常用的一种,例如下图的P0/P1/P2/P3口。

单片机引脚图

那代码怎么控制芯片引脚呢?代码控制芯片的所有功能都是靠操作一个叫寄存器的东西来实现的,只要给这个寄存器赋值,芯片就会自动干活。哪怕是一款发射核弹的芯片,也是要靠代码给核弹按钮的寄存器赋值来操作发射核弹。

寄存器在计算机系统中其实就是一个内存编号,或者叫内存地址。比如上图中的P1 GPIO口,它的内存地址就是90H,我想让它的8个引脚全部输出高电平,那就只用给90H这个地址赋值为8个1就行了,立马输出高电平。

用汇编代码表示就是:MOV 90H, #11111111B;B表示八位二进制

稍微有点C语言基础的人都知道,内存地址无非就是指针嘛。所以寄存器就是指针嘛。

C语言表示(假如是ARM单片机):unsignedint*p=(unsignedint*)0x90;*p=0B11111111;//0B表示二进制数//可以简化为*((unsignedint*)0x90)=0B11111111;

注:为了方便理解,以上代码未必100%严格符合语法。

假如是让P1口的8个引脚全部输出低电平呢?那就把0B11111111改为8个0的0B00000000就行了。假如只是让2号引脚为低,其他全部为高呢?那就改为0B11111011就行了(引脚编号从0开始),以此类推。

所以,控制芯片做任何事情,只需找到相应的寄存器编号,代码只需往这个编号的寄存器里赋值就行了,编号即指针。

但是在实际的编程中,我们往往看到的不是这种控制寄存器的方式。为啥?因为给某个地址指针赋值太直接了,万一不小心搞错了,误碰到发射核弹的一个寄存器呢?所以啊,在实际的编程中,往往给操作寄存器的方式加上层层包装,加上层层权限检查,以防止非法修改,最终到码农手里去修改寄存器的时候,名字和方法都大变样了,但如果一层一层剥开,你会发现归根到底还是给指针赋值。

在实际中,寄存器的地址也非常长,寄存器的长度也不止八位,可能是16位,32位,每一个位的定义也不一样。比如下图是某芯片厂公开的芯片寄存器手册。

以下是四位网友的看法

该说不说,比我现在的大学教程通俗易懂多了[赞同]

也不是所有平台都这样,有些平台部分寄存器不映射内存而是单独编址,然后用专门的指令访问。比如x86。

真的太好了,说的都能看懂

还是没有说清楚寄存器参数如何影响引脚电平,我写一个1,为什么电信号会变化,这个1到底对应着什么物理含义,这里面的电路结构是什么样的?

代码是如何控制硬件的?(一)
代码是如何控制硬件的?(一)
代码是如何控制硬件的?(一)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多