嵌入式代码的编译、下载、执行

来源:互联网 发布:mac os x 升级系统 编辑:程序博客网 时间:2024/06/05 22:50

我们开始学习C语言,通常基于PC机的IDE(集成开发环境VC)编写代码。而那时的代码编写只是停留在抽象逻辑层面,不能体会如:printf(“”Hello World!\n“”)具体是如何实现的。后来学习单片机。单片机虽然性能有限,却是个很完整的系统。普遍使用的IDE集成了很多功能,包括工程管理,代码处理等。再加上单片机厂商提供了全面的库函数。所以初学者被屏蔽在底层软硬件之上,更加不能理解整个嵌入式体系以及软硬件交互过程。 作为嵌入式码农应当能把代码和硬件联系起来,因为所有功能的实际实现都是由硬件体现而软件只是负责告诉硬件做什么,如何做。

代码的编译:

例如我们写了一些c程序,这些程序分别包含在文件file1.c,file2.c,file3.c中。先忽略预处理部分,编译器将C文件转换成为汇编文件file1.s,file2.s,file3.s;汇编器将汇编文件转换成为二进制指令流 file1.o,file2.o,file3.o文件(目标文件)。注意:这里的程序和数据已经分开。程序为RO段,数据分为ZI为没有初值的全局变量段,RW为有初值的全局变量段。每个目标文件是独立编址的,也就是说每个目标文件的第一条指令都从相同的地址开始存放。链接器再把这些目标文件和一些事先编译的库.o文件等链接到一起生成一个完整的与实际物理内存相符合的内存映像文件,也会分配一个堆栈空间供临时变量处理。所以,连接器起到整合的作用

                                                                                               

代码的下载:

上面已经生产了二进制可执行文件,此时我们需要把它烧录到存储器对应的地址空间中。然后,CPU才开始从存储器对应某地址开始取指令,取数据,以及在实现约定好的堆栈空间处理一些数据。下面介绍下JTAG原理。JTAG内部包含数据存储器DR,指令存储器IR,旁路寄存器BR,测试访问控制器TAP,对应每个引脚内部都有一个移位寄存器,称为边界扫描单元。测试数据输入端口TDI,测试数据输出端口TDO,测试时钟TCK,测试方式选择TMS。指令寄存器和测试数据寄存器由TAP控制器产生的信号来控制。TAP控制器是一个时序电路,由TMS和TCK信号驱动。系统主控芯片通过地址总线、数据总线、片选、读写控制与外部Flash物理相连。只要把对Flash操作所需要的地址、数据、控制信号,由主控芯片的JTAG TDI串行输入,锁存到对应引脚的边界扫描单元,更新引脚状态,实现PC对在板Flash的操作。同样,引脚也可把接收的片外Flash数据或信号锁存到内部扫描单元,然后通过移位从TDO串行输出到系统以外的测试设备。这就是PC机通过JTAG和主控芯片信息交互的具体过程。程序的JTAG烧写即是外部测试设备通过JTAG直接对芯片引脚电平的高低进行控制的过程。



代码的执行:

类比用硬件描述语言如Verilog HDL在FPGA上做的一些小实验。把CPU比作FPGA中生成的硬件,软件就是给这硬件的激励。C代码经过编译下载到存储器中的二进制文件就包含这激励。芯片上电后会自动从存储器0x00000000地址开始取指、译码、执行。根据这些指令处理数据和控制具体外围设备。

原创粉丝点击