hex文件如何在微控制器中转换为二进制文件

时间:2016-06-01 18:38:47

标签: embedded hex microcontroller

我是嵌入式编程的新手。我使用编译器将源代码转换为十六进制,我将烧录到微控制器。我的问题是:微控制器(所有IC)仅支持二进制数(0和1)。那它如何使用hex文件?

3 个答案:

答案 0 :(得分:2)

将程序/数据加载到闪存中的软件会读取它支持的任何格式,可能是intel hex,motorola srecord,elf,coff或原始二进制文件或其他格式。然后做正确的事情,只用相关的零和零来编程闪存。

答案 1 :(得分:1)

Hex,Decimal,Binary,它们只是表示数字的方式。

十六进制中的AA与十进制中的170和二进制中的10101010(以及252或八进制)相同。

使用十六进制表示的原因是因为在使用微控制器时非常方便,因为一个十六进制字符适合1个半字节。因此F是1111,FF是1111 1111,因此是第四。

答案 2 :(得分:0)

首先,您正在使用的PC内置处理器,其工作方式与其他任何微控制器一样。您正在使用它来浏览互联网,尽管内部" 1和0都在内部"。而且我认为你的实际固件目前还没有运行你的PC正在运行。

  

微控制器仅支持二进制数(0& 1)

您的想法"微控制器仅支持二进制数字(0& 1)"是一种误解。在它非常低的水平,是的,微控制器包含一堆晶体管,并且每个晶体管只能存储两种信息状态(一点点)。 但其原因仅仅是因为这是物理存储一小块数据的实用方法。

如果查看uC架构的汇编指导手册,您将看到大量指令在不同的数据宽度上运行(位分组为8,16或更大的块)。如果您的控制器是16位,那么这将是大多数指令的基本字大小,也是最有效的指令。用C编程时,这也是"特殊"的大小。 int类型,所有较小的整数类型都会扩展为。

换句话说,位只是硬件的构建块,并且大多数时候甚至不应该在固件级别关注您,更不用说更高的应用程序级别了。将它与人类生命形式相比较:人体是由细胞组成的,但也不仅仅是单细胞生物,不是吗?

  

我正在使用编译器将源代码转换为十六进制

实际上,您正在使用编译器为您的特定微控制器架构创建机器代码。 "十六进制"或者更确切地说Intel Hex file format,只是用于将机器代码存储到文件中的几种文件格式之一,并且它是方便的纯文本ASCII文件。你可以在记事本中轻松打开。

为了澄清,让我们说你写了一行简单的C代码:

a = b + c;

您的编译器需要知道您要定位的架构,以便将其转换为机器代码。对于虚构的uC架构,这将首先编译为以下虚构的assembly language

// compiler decides that a,b,c will be stored at addresses 0x1000, 1004, 1008

mov ax, (0x1004)   // move value from address 0x1004 to accumulator
add ax, (0x1008)   // add value from address 0x1008 to accumulator
mov (0x1000), ax   // move value from accumulator to address 0x1000

这些说明中的每一条都有自己的instruction opcode,可在装配说明书中找到。如果指令对一个或多个参数进行操作,uC将知道指令后面的字节是数据字节:

// mov ax, (addr)   --> opcode 0x10
// add ax, (addr)   --> opcode 0x20
// mov (addr), ax   --> opcode 0x30

mov ax, (0x1004)   // 0x10 (0x10 0x04)
add ax, (0x1008)   // 0x20 (0x10 0x08)
mov (0x1000), ax   // 0x30 (0x10 0x00)

现在您已经获得了机器代码,其编写为十六进制值,变为:

10 10 04 20 10 08 30 10 00

转换为二进制变为:

0001000000010000000010000100000...

要将其传输到控制器,您将使用Flash上​​传器知道如何阅读的文件格式,这是Intel Hex最常用的格式。

一旦传输到微控制器,它将作为一堆位存储在其闪存中,但控制器设计为以8位或更多位的块读取这些位,并将它们作为指令操作码或数据进行评估,具体取决于在上下文中。对于上面的示例,它将读取前8位,并且看到它是指令操作码0x10(它接受额外的地址参数),它将读取接下来的两个字节以形成地址{{ 1}}。然后它将执行指令并前进instruction pointer