首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >程序如何与硬件设备一起工作

程序如何与硬件设备一起工作
EN

Stack Overflow用户
提问于 2018-09-27 15:23:34
回答 2查看 307关注 0票数 0

我想知道一个程序如何与硬件设备一起工作。我想知道基本知识,而不是深层次的。

所有的编程代码都有以下内容。

  • 变量,如int、float、short等。
  • 函数和函数调用
  • 语句,如
  • 计算
  • 循环,如for循环,等等

我想当我们程序下载到硬件,数据去编程内存(ROM)。当我们运行程序以上提到的事情,去RAM还是它去特定的领域,如功能数据?

当我们考虑8位总线时,如何像10位字符这样的8位以上的数据,因为总线很小?

什么是Stack,以及如何使用它编程?

为什么void main功能是重要的?硬件是如何识别的?

请给我一些硬件程序的基本概念。

EN

回答 2

Stack Overflow用户

发布于 2018-10-03 15:58:06

你有很多问题要问。首先,让我们假设一个简单的情况,比如Arduino,它是软件和硬件的结合。软件部分首先编写一些简单的C++代码,例如:

代码语言:javascript
复制
byte ledPin = 13;
void setup(){
pinMode (ledPin, OUTPUT);
}
void loop(){
digitalWrite (ledPin, HIGH);
digitalWrite (ledPin, LOW);
}

接下来,您将编译代码。Arduino IDE ()做了一些工作(在后台,比如添加一个main(),它将调用setup()函数一次,循环()函数重复)将该C++转换为程序集代码,这些代码可能如下所示(而不是上面的实际输出):

代码语言:javascript
复制
; Define pull-ups and set outputs high
; Define directions for port pins
ldi r16,(1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0)
ldi r17,(1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0)
out PORTB,r16
out DDRB,r17
; Insert nop for synchronization
nop
; Read port pins
in r16,PINB

汇编程序,而不是接受该代码,并将其转化为十六进制格式的信息,程序员可以放在ROM上的Atmega328P微控制器。基本上,文件中的数据行(每行包含一行的起始地址,可能是16字节的数据)和校验和(以确保数据在处理过程中不会损坏):

代码语言:javascript
复制
000100005673495a6b4f5e205673495a6b4f5e24465

这不是真实的数据。0001000可能是ROM中的起始地址,接下来的32个字符是要编程的16个字节的数据,最后4个可能是通过操作数据创建的校验和。程序员接收数据,执行相同的操作,如果校验和正确,则将其烧入内存。

十六进制代码可以通过两种方式放入ROM --程序员可以控制芯片并将代码直接放入内存,复位后芯片只运行代码;复位后,引导加载程序可以从芯片上的ROM区域运行,并通过串行线路(Rx、Tx)与PC对话,接收数据,然后将数据写入ROM的不同区域。如果引导代码没有检测到试图与其对话的PC,它将跳转到该代码开始运行的ROM地址。

8位微控制器可能有大约16位寄存器,它可以用于捕获ADC转换的结果,或者将结果存储为两个8位字节,具有高和低的数据。

Stack可能是专用的硬件寄存器,也可能是SRAM的一个区域,用于保存类似数学操作的结果。代码负责将内容放到堆栈上并将其读取回来,通常不会处理编程问题。对于‘328 p,有2048字节的SRAM,所以您只需要确保没有太多的变量在代码中声明(比如字节ledPin = 13;),这些变量使用了所有这些变量,并且没有为代码留出空间。例如,在328 is中,这通常是由于尝试访问超出限制的数组而导致的,所以要么返回无稽之谈的结果,要么在写过数组结束时会导致程序崩溃。C++的灵活性很好,但是如果不小心的话,它也会让你陷入麻烦。

票数 1
EN

Stack Overflow用户

发布于 2018-10-03 14:01:02

正如@nos所说,要解释这个问题需要大量书籍。

在代码和硬件之间遗漏的是编译器。它的作用是将代码(C、C++或其他语言)转换为程序集。汇编大概是CPU或微控制器理解的非常低级别的一组指令。

当程序被翻译到程序集时,它被上传到内存中。根据体系结构的不同,它属于一般内存(Von )或程序内存(与哈佛体系结构中的数据内存相反)。

在讨论堆栈时,您也有指针。指针指向堆栈的一个“级别”(是的,指的是一个指针,呵呵)。例如,您有指向当前指令的“当前”指针。一旦完成当前指令,指针就会增加,因此指向下一个级别。当您调用子函数并指向停止父函数的级别时,将使用另一个指针。一个子函数完成了,你就回到你停止的地方。

这些指针存储在寄存器中,寄存器是芯片中的小内存(且速度快)。

在主要功能方面,硬件在编译时并没有对其进行识别。对于硬件,只需要执行一个程序(即主程序),调用子函数(即main中使用的函数)。

所以..。当您编写一些代码时,让我们用C来表示:

代码语言:javascript
复制
int main ()
{
    int a = 0;
    printf("a = %d", a);
    return 0;
}

main的内容被翻译成程序集,是您的“正常”程序。首先,它将0放在寄存器的一个单元格中。然后将其搁置以执行printf (它使用我们保存0的单元格中的值),并将其保存在指针中停止的位置。完成后,当前指针将取回保存的指针的值并继续。

关于公羊里的东西:你有不同程度的记忆。磁盘,硬态或固态,缓慢但大而便宜。拉姆,更快,但更明快,更小。高速缓存,内置于CPU中,速度非常快,体积更小,成本更高。寄存器,也内置,甚至更快,但更小。当CPU使用一个变量时,它会进入寄存器中。但是,现代CPU“猜测”(也称为预取)在不久的将来可能需要哪些变量(例如,您读取表的两个第一个单元格,它可能会在询问之前加载第三个单元格),并将其放入缓存中。否则,它是在拉姆。

希望这会有所帮助,可能会有一些捷径或不准确之处,但这大概就是它的工作原理。同样,很难用几行来概括上百页。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52540345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档