接上篇
这里有一个简单例程
在这一例程里,分别有以下几种文件
- 程序入口 (main.c等)
- 连接命令文件 (*.cmd)
- Target Configuration 文件
- C运行文件库 (rtsXXX.lib)
- .asm 文件
程序入口
即CPU启动或复位后开始执行的程序地址。一般默认程序入口有三种:地址 0000、_c_int00 和 _main
其中 _c_int00 定义在 rtsxxx.lib 库中,c_int00() 函数完成:初始化堆栈指针和页指针;初始化全局变量;最后调用 main()
此外还可以自行设置入口地址 Project properties-Built-C2000 Linker/C6000 Linker-Advance Options-Symbol Management
连接命令文件 (.cmd)
CMD文件内一般由三部分组成:输入输出定义、MEMORY 命令、SECTION 命令。
其中输入输出命令可以通过 CCS 的 Build Option 菜单设置,可以不在 CMD 文件中定义。MEMORY 命令描述系统实际的硬件资源。SECTION 命令描述“段”如何定位,另外注意使用的是"SECCTIONS",而非"SECTION"。
-l rts67plus.lib
-l dsp67x.lib
-l evmomapl137bsl.lib
-stack 0x00001000 /* Stack Size */
-heap 0x00001000 /* Heap Size */
MEMORY
{
AIS: o = 0x11800000 l = 0x00005000
DSPRAM: o = 0x11805000 l = 0x00035000
}
SECTIONS
{
.vecs > DSPRAM /*中断向量表*/
.bss > DSPRAM /*全局变量和静态变量*/
.cinit > DSPRAM /* 变量初值表*/
.cio > DSPRAM /*用于stdio函数*/
.const > DSPRAM /* 常数和字符串 */
.stack > DSPRAM /*堆栈 */
.system > DSPRAM /* 用动态分配内存,有malloc等函数才会出现*/
.text > DSPRAM /*程序代码 */
.switch > DSPRAM /*用于大型switch语句跳转表*/
.far > DSPRAM /*以far申明的全局变量和静态变量*/
.my_data >AIS
}
#pragma DATA_SECTION (GlobalBuf,”.my_data”)
#pragma DATA_ALIGN (GlobalBuf, 4);
int far GlobalBuf[2048];
#pragma CODE_SECTION (myFunc,”.my_code”)
void myFunc(int a, int b)
{
}
Vector.asm
.sect ".vecs"
.align 1024
_intcVectorTable:
_vector0: VEC_ENTRY _c_int00 ;RESET
_vector1: VEC_ENTRY _vec_dummy ;NMI
_vector2: VEC_ENTRY _vec_dummy ;RSVD
_vector3: VEC_ENTRY _vec_dummy
_vector4: VEC_ENTRY _vec_dummy
_vector5: VEC_ENTRY _vec_dummy
_vector6: VEC_ENTRY _vec_dummy ;_isrIps
_vector7: VEC_ENTRY _vec_dummy
_vector8: VEC_ENTRY _isrAdda
_vector9: VEC_ENTRY _isrUart
_vector10: VEC_ENTRY _vec_dummy
_vector11: VEC_ENTRY _vec_dummy
_vector12: VEC_ENTRY _vec_dummy
_vector13: VEC_ENTRY _vec_dummy
_vector14: VEC_ENTRY _vec_dummy
_vector15: VEC_ENTRY _vec_dummy