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