目前的C和C++语言标准有好几个版本,CCS的编译器目前支持的版本包括:
本文引用地址:http://www.eepw.com.cn/article/198372.htm
C语言的C89和C99版本的ISO标准(C99部分支持,主要是与C89一样的特性):通俗的讲就是我们学过的C语言里常用的功能都是支持的,除了一些多字节字符和一些极少数的特性等。不清楚的可以参考Kernighan和Ritchie编写的C语言书籍《The C Programming Language》第二版。
C++语言的2003版本的的ISO标准: 可以参考Ellis和Stroustrup编写的经典书籍《The Annotated C++ Reference Manual》。同时也支持一部分的嵌入式C++特性。因为C++的特性众多,而许多并不适用于这样一种嵌入式的环境,所以不支持的特性相比C要多一些。
2. 汇编器的作用是将汇编语言代码转换为机器语言(目标文件),这里的汇编代码包括前面由C/C++生成的汇编代码和我们直接编写的汇编代码。
3. 链接器是作用是把所有的库文件、目标文件等链接成为一个可执行的目标文件,其中包含程序的机器代码和数据,以及其他用来链接和加载该程序所需的信息(在TI DSP上是COFF格式,通俗地讲就是.out二进制文件),同时根据内存地址的分配对各目标文件进行重定位,并解析外部参考,例如在一个源程序里引用另一个源程序中定义的变量就可以理解为外部参考,假如一个目标文件引用了一个未定义的符号symbol,则链接器搜索其他目标文件中定义的全局符号,找到匹配的符号修补指令。否则报告一个错误;所以有时候编译所有程序完成在链接的时候会提示xxx symbol为定义,说明对应的文件没有加到工程里面。
4. 归档器archiver:也可以叫压缩器,看一下我们常用的压缩软件winrar的全称winrar archiver就不难理解了。
5. 实时支持库:包括标准C和C++的运行支持函数、编译器公用程序函数、浮点运算函数和C编译器支持的I/O函数,
6. 十六进制转换程序:把编译、链接等步骤生成的可执行文件,转换为十六进制文件,例如.HEX格式,然后可以烧写到EEPROM、FLASH等外部存储器之中。
7. 绝对列表器:读取目标文件并输出.abs文件,通过汇编.abs文件可产生含有绝对地址的列表文件,从而使得我们不用手工费时费力地去创建列表文件。这本来不就是软件该做的事情吗:-D
8. 交叉引用列表:与3中外部参考解析相关的,它用目标文件产生参照列表文件,可显示符号及其定义,以及符号所在的源文件。
9. C/C++命名还原工具:C/C++编译器会将程序中的变量名、函数名转换成内部名称,这个过程被称作Name Mangling,反过程被称作Name Demangling,即命名还原工具。内部名称包含了变量或函数的更多信息,例如编译器看到?g_var@@3HA,就知道这是:int g_var。具体的还原规则一般是不开放给我们用户的,只要编译器知道就行了。
10. 调试工具:例如我们电脑上装的CCS软件,让我们可以用断点、图形窗口等进行软件的调试。
此外,并没有明确列在前面的流程中,但是隐含在流程中,或者我们也有可能会用到的工具或者流程包括:
1. 优化工具:在编译时对代码进行优化的工具,可以根据我们期望的优化级别,进行从不优化到直至CPU寄存器级别的优化。
2. 反编译器:可以对目标文件进行解码,显示对应的汇编语言。在CCS的调试模式下,我们可以打开disassembler窗口,然后单步运行,就能看到一条条的汇编指令是如何执行的了。
3. 加载器:把可执行的二进制文件复制到DSP的内存中,并运行启动程序,使得程序从程序入口处开始运行,这个入口地址可能是地址0,也可能是带有一个偏移量的地址,这个具体的值我们可以以后再具体讨论。
4. 其它:补充一下名词的定义,包括:
符号:在整个编译、链接的过程中都会使用到符号symbol的概念,简单地理解,符号就是指一些变量、函数名字等。
库文件:多个目标文件的压缩包,包含了所有目标文件定义的全局符号的索引。在源程序中如果找不到某些符号的定义,链接器从尝试从库里面提取出对应的目标文件,然后链接到可执行文件里。