李现路:在DSP6000中怎样编写您的第一个程序(1)
发布时间:2009-11-28 10:41
发布者:stst158
关键词:
DSP6000
李现路:在DSP6000中怎样编写您的第一个程序(一) Post By:2009-11-23 23:44:02 李现路:在DSP6000中怎样编写您的第一个程序(1) 一、C语言编写详解 1.工程目录最好放在: CCStudio_v3.3\MyProjects路径下 2.CSS下和DSP6000编程紧密相关的目录结构: a.CCStudio_v3.3\C6000\csl\include ---DSP6000常用头文件 b.CCStudio_v3.3\C6000\csl\lib ---DSP6000常用库文件 c.CCStudio_v3.3\C6000\cgtools\bin --各种编译工具 3.我们要编写的程序结构: a.含有main()函数的.c的源文件,而且这个文件的名字最好以main结尾 b.添加.cmd文件:内存的分配 c.添加.asm文件:中断向量表的文件 d.常用头文件: e.常用库文件: 4. 含有main()函数的.C的主文件的书写规范: 完整版本请见http://www.51qianru.cn/bbs/ .c的源文件完整内容如下: #include //#include #include #include #include #include #include #include "dm642.h" //dm642常用配置 #include "rtciic.h" //晶振总线配置,rtc即晶振,IIC即总线, #include "eeprom.h" //EEPROM的配置,EEPROM (Electrically Erasable Programmable Read-Only Memory),电可擦可编程只读存储器--一种掉电后数据不丢失的存储芯片。 #include "io&led.h" //输入输出及led配置 #include "dm642_ide.h" //IDE接口配置,IDE(Integrated Drive Electronics),即电子集成驱动器, #include "dm642_flash.h" //flash存储器配置 #include "dm642_uart.h" //通用异步收发传输器的配置,UART通常用在与其他通讯协定(如RS-232)的连结上 extern far void vectors(); //调用中断向量表 static GPIO_Handle hGpio; //GPIO句柄 void main() { /*-------------------------------------------------------*/ /* perform all initializations,开始初始化 */ /*-------------------------------------------------------*/ DM642_init(); /*----------------------------------------------------------*/ /*中断向量表的初始化*/ IRQ_globalDisable(); //Point to the IRQ vector table,指向中断向量表 IRQ_setVecs(vectors); /*----------------------------------------------------------*/ hGpio = GPIO_open(GPIO_DEV0,GPIO_OPEN_RESET); GPIO_reset(hGpio);////GPIO复位 //GPIO_config(hGpio,&MyGPIOCfg),GPIO的配置; GPIO_pinEnable(hGpio,GPIO_PIN15); //GPIO_PIN15管脚使能 GPIO_pinEnable(hGpio,GPIO_PIN4); GPIO_pinEnable(hGpio,GPIO_PIN5); GPIO_pinEnable(hGpio,GPIO_PIN6); GPIO_pinEnable(hGpio,GPIO_PIN7); GPIO_pinDirection(hGpio,GPIO_PIN15,GPIO_OUTPUT);//GPIO_PIN15管脚输出信号 GPIO_pinDirection(hGpio,GPIO_PIN4,GPIO_OUTPUT); GPIO_pinDirection(hGpio,GPIO_PIN5,GPIO_OUTPUT); GPIO_pinDirection(hGpio,GPIO_PIN6,GPIO_OUTPUT); GPIO_pinDirection(hGpio,GPIO_PIN7,GPIO_OUTPUT); while(1) { GPIO_pinWrite(hGpio,GPIO_PIN15,0); //输出0低电平,灯亮 DM642_waitusec(0x10000); //等待10000微妙,1秒=1000000微秒 GPIO_pinWrite(hGpio,GPIO_PIN15,1); //输出1高电平,灯灭 DM642_waitusec(0x10000); GPIO_pinWrite(hGpio,GPIO_PIN4,0); DM642_waitusec(0x10000); GPIO_pinWrite(hGpio,GPIO_PIN4,1); DM642_waitusec(0x10000); GPIO_pinWrite(hGpio,GPIO_PIN5,0); DM642_waitusec(0x10000); GPIO_pinWrite(hGpio,GPIO_PIN5,1); DM642_waitusec(0x10000); GPIO_pinWrite(hGpio,GPIO_PIN6,0); DM642_waitusec(0x10000); GPIO_pinWrite(hGpio,GPIO_PIN6,1); DM642_waitusec(0x10000); GPIO_pinWrite(hGpio,GPIO_PIN7,0); DM642_waitusec(0x10000); GPIO_pinWrite(hGpio,GPIO_PIN7,1); DM642_waitusec(0x10000); //这个程序是控制了GPIO15,GPIO4-7的高低电平 } } .c的源文件编写规范如下: a.首先引用头文件:头文件含有初始化设备的必要的接口函数,宏定义等 b.调用中断向量表: c.static:不被编译器优化,常用于句柄的修饰 d.自定义的函数可放在main()的前面或后面。 外部函数:自己定义的函数,引用外部的文件定义的函数 内部函数:DSP6000内部定义了的函数就是内部函数 e.DSP6000中的数据格式一般为十六进制。 f.主要while循环---while(1),while(0)的区别 二、.cmd文件要点讲解: 内存分配文件的源代码如下: MEMORY { boot: o = 00000000h l = 000400h /* all SRAM,在片内SRAM中保留一块Boot空间*/ L2 : o = 00000400h l = 0003fb00h /* all SRAM ,L2,为DSP片内存储器,是第2级存储器[第一级存储器包括独立的程序Cach(L1P)和数据Cach(L1D) ],它是一个统一的空间,部分程序和数据,统称为L2,可以作为普通的SRAM映射到存储空间 */ CE01: o = 80000000h l = 00100000h /* external memory */ CE02: o = 80100000h l = 00f000000h /* external memory */ } SECTIONS { .boot_load > boot /*引导程序入口映射到该boot空间*/ .vecs > L2 /*映射ves_dm642.asp中定义的.vecs到L2空间*/ .cinit > L2 /*初始化变量和常数表*/ .text > L2 /*可执行代码段的映射*/ .stack > L2 /*为系统堆栈分配存储器。该段用于将变量传递至函数或者用来分配局部变量。*/ .bss > L2 /*保留全局和静态变量空间。在启动和导入的时候,C/C++编译器会启动程序将.cint段中的数据复制出来,以初始化.bss段中的变量。*/ .const > L2 /*包含由C/C++限定词const定义的字符串常量和数据*/ .data > L2 /* 初始化数据段*/ .far > L2 /*供外部文件调用的变量*/ .switch > L2 /*控制语句段映射*/ .sysmem > L2 /*初始化系统空间*/ .tables > L2 /*初始化数据表*/ .cio > L2 /*io口*/ .external > CE02 /*外部变量的初始化*/ } 1、 cmd文件要点 a.boot:仿真的时候boot可以不配置,在把程序烧写到flash中时要配置,他的作用是 放bootload引导程序 b.怎样划分空间:o-origin 起始地址;l-length;区块的标记可以任意改,长度不可以 超越最终的空间地址 c.划分内存,不一定全部划分 2、.cmd文件之Section分析 C/C++的编译环境包含以下段 已初始化段: (1).cinit段:包含初始化变量和常量表 (2).const段:const定义的字符串常量和数据(他们不能同时被volatile定义) volatile--不能被编译器优化 (3).switch段:包含跳转表和大的switch声明 (4).text段:可执行代码段 未初始化段: (1).bss段:保留全局和静态变量空间 (2).far段:保留远程的全局和静态变量空间 (3).stack段:为系统堆栈分配存储器。用于将变量传递至函数或用来分配 局部变量 (4).system段:为动态存储器函数malloc,calloc,realloc分分配存储器空间。 如果程序没有用到上面的函数,就不会创建.system段 所有我们的内存分配,应该尽量包含上面的初始化段和未初始化段中所定义的段。 完整版本请见http://www.51qianru.cn/bbs/ 曙海教育 曙海嵌入式学院3G通信培训中心 (MTK培训,Android培训,iPhone培训) 电话:021-51875830 网址:http://www.51qianru.cn 讲师:李现路 版权所有-曙海教育 转摘请注明作者和出处 课程有: symbian培训班 dsp6000培训班 cadence pcb培训班 单片机培训班 android培训班 brew手机培训 嵌入式培训 dsp培训 嵌入式培训 |
网友评论