一、编程语言
从处理器的角度看:一个指令只是一个操作,那么执行多条指令构成的程序就是完成一个完整功能的操作。
从程序执行的角度看:处理器读取指令后译码执行,完成所有操作。
从程序设计的角度看:用指令来描述所要实现的功能,并组织这些指令,将指令和数据放在规定的存储位置,最终让字符变成可以执行的二进制数。
1、机器语言
二进制语言是处理器能直接执行的唯一语言,也叫机器语言。程序设计就要按照指令的执行顺序将相应的二进制数值放在相应的存储空间。这种方式简单直接,写入后就可以执行,但是不便于编程。
2、汇编语言
采用一些助记符来规范指令的排列和数据的存放。它们与汇编指令共同构成汇编程序。这些指令和规范一起就构成了汇编语言。
汇编语言编写的程序通过汇编器生成目标模块,该目标模块描述了其他在存储区段需要的空间和内容,每个存储区段存有指令、数据或者两者兼有。
将这些目标通过链接器互连,就可以创建一个可执行文件,该文件把数据和目标代码分配到合适的存储区段。链接器可以决定标号的地址并自动更新所引用标号的机器指令中的值。
在存储器中,通过内存镜像来存放可执行的内核代码和数据,它们会出现在所生成的可执行文件。
3、高级语言
为了让更多的程序设计不依赖于处理器和汇编语言,高级语言应运而生。高级语言是面向处理的,它采用规范的数据定义、操作语句和程序结构,使程序更接近处理思路,更易读易懂。高级语言编写的程序通过编译器可以生成汇编程序。
目前,微处理器系统底层驱动应用开发采用C语言。C语言本身是一种高级语言,描述简洁且易用,便于进行数据处理和业务应用开发。C语言的大部分语句与汇编语句相通,可视为汇编语句的一种变形,因此C语句操作机制清晰,处理效率较高,便于进行底层电路的驱动开发。
二、程序的基本要素
数据是信息的表现和处理额对象,它决定如何进行存储和访问。
运算是数据的加工,决定如何处理数据。
流程是算法的体现,决定如何执行运算操作。
1、数据定义
数据定义的实质是完成存储分配,即确定数据的类型和数量。通常采用变量来定义数据,高级语言的变量可以保存在寄存器中,也可以保存在存储器中,而汇编语言中的变量都保存在存储器中。
2、处理数据
处理数据的实质是实现数据的加工。高级语言的运算语句是面向变量的,一条运算语句可能对应多条汇编语句并涉及多次寄存器或者存储器的数据操作;汇编语言的运算语句是面向ALU的,一条语句就是一次操作,涉及一次寄存器和存储器的数据操作。
3、流程控制
流程控制的实质是构建某一功能的处理流操作。常规的三种处理流程采用三种常用结构:顺序结构、分支结构、循环结构。高级语言有专用的结构构建语句,涉及比较运算和跳转操作;而汇编语言中只能用多个跳转语句来实现程序流程。
4、组织结构
组织结构的实质是将多个功能处理流程有机结合,从而完成一个复杂的功能。高级语言采用专用的函数和子过程来创建,自动完成堆栈操作和参数传递等工作;而汇编语言则通过标号定义和堆栈操作来实现。
三、汇编程序结构
1、分区
在汇编语言中,采用AREA对代码和数据分别分区,并指明存储类型。最简单的存储文件必须包括两个区;保存异常向量表的只读数据区和包含启动程序的只读代码区。
每个区的首个指令或者数据通常都要有标识,如果这个标识被其他文件使用,那么还要再用EXPORT语句来声明一次该标识。
2、异常向量表
异常向量表是在只读存储区中分配的数据,其中第一个字保存主栈指针MSP的值,第2个字保存重启异常服务程序向量标识Reset_Handler的值。这里MSP的值可以是人为指定的,也可以通过语句来自动分配。
3、栈和堆
堆栈,简称栈(STACK),是用户存放程序临时创建的局部数据。由于处理器加电时会自动获取MSP的值,因此系统启动时要自动分配一定空间的主堆栈。
堆(HAEP)是运行中被动态分配的存储段,大小并不固定。可动态扩张或者缩减。若在程序处理中需要堆,则在系统启动时应该分配足够的堆空间。
4、重启异常服务
假如重启程序代码的首地址标识为Reset_Handler,如果后续代码作为一个功能整体模块,那么加上PROC来进行标识,以ENDP作为模块代码的结束。由链接器的配置可知,Reset_Hnadler是汇编程序的入口标识,所以加上ENTRY语句,并由EXPORT语句将Reset_Handler设置为链接器可用的标识。
5、数据初始化
从存储器使用的角度看,指令放在ROM区,处理过程中所要使用的数据放在RAM区,堆栈也要放在RAM区。
通常情况下,程序需要构建三类区:只读区(RO区)、可初始化的读写区(RW区)和不初始化的读写区(ZI区)。
RO区中分配异常向量表、程序代码和只读数据
RW区中分配需初始化的数据。其中RW区的数据初值既要保存在ROM中以保证数据不丢失,也要保存在RAM中供处理器使用。保存在ROM中的RW区数据的初值在加电后要用指令将它们读出并写到相应的RAM中。
ZI区中分配不需要初始化的数据
四、集成开发环境
软件开发的三种主要工具:程序构建工具链、编程器和调试器。一个基本的集成开发环境(IDE)通常都包含这些工具。
1、程序构建工具链
程序构建工具链把程序翻译成机器指令并存储在一个可执行文件中。程序构建工具链如下图,其中包含C语言的armcc编译器、armasm汇编器和armlimk链接器,最终的内存映像会在Arm ELF形式的可执行文件中给出,文件后缀为.axf。
2、编程器
当微处理器上电或者复位时,无法将程序加载到存储器,因此程序必须提前写在存储器中。程序存储器是非易失性的,在断电的情况下也能保存所存储的内容。
编程器根据可执行文件的描述把程序放入微处理器的存储器中。它有硬件与软件两部分,硬件连接到Cortex-M4处理器的串行线调试(SWD)接口来使能存储器用于编程;软件部分可以是一个独立的程序,也可以构建于IDE中。
3、调试器
调试器使开发者在处理器运行程序时能够控制程序执行和测试程序状态。