在DSP6000中怎样编写您的第一个程序

wanggq   2009-12-4 12:06 楼主
一、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的主文件的书写规范:
.c的源文件完整内容如下:

#include
//#include
#include //stdlib 头文件里包含了C语言的一些函数,该文件包含了的C语言标准库函数的定义

#include   //调用CSL库函数头文件,CSL作用是用于配置、控制和管理DSP片上外设,C6000 DSP设计了自己的CSL库
#include //包含了C语言的一些符号常量
#include //CSL中配置中断请求的头文件
#include //CSL库函数中芯片配置头文件

#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段
   所有我们的内存分配,应该尽量包含上面的初始化段和未初始化段中所定义的段

  曙海教育

回复评论 (10)

DSP6000图像位置移动与变形的典型算法(二)
  (void *)(disYbuffer + (numPixels>>1) + (numLines-1-i) * numPixels),
         numPixels>>1);

             /*传送Cb缓冲区*/
             //前半部分为原始图像
             DAT_copy((void *)(capCbbuffer + i * (numPixels >> 1)),
                      (void *)(disCbbuffer + i * (numPixels >> 1)),
                      numPixels>>2);
             //后半部分为垂直镜像图像
        DAT_copy((void *)(capCbbuffer + i * (numPixels >> 1)),
                 (void *)(disCbbuffer + (numPixels>>2) + (numLines-1-i) * (numPixels >> 1)),
                 numPixels>>2);                                      


                   /*传送Cr缓冲区*/
                   //前半部分为原始图像
             DAT_copy((void *)(capCrbuffer + i * (numPixels >> 1)),
                      (void *)(disCrbuffer + i * (numPixels >> 1)),
                      numPixels>>2);
             //后半部分为垂直镜像图像         
             DAT_copy((void *)(capCrbuffer + i * (numPixels >> 1)),
                      (void *)(disCrbuffer + (numPixels>>2) + (numLines-1-i) * (numPixels >> 1)),
                      numPixels>>2);                        
          }      


         /*启动显示模块*/
         bt656_display_start(vpHchannel1);
         /*建立显示的实时循环*/
         for(;;)
         {
                   /*当采集区的数据已经采集好,而显示缓冲区的数据已空*/
                   if((capNewFrame == 1)&&(disNewFrame == 1))
                   {
                            /*将数据装入显示缓冲区,并清采集完成的标志*/
                            capNewFrame =0;
                            disNewFrame =0;
                            for(i=0;i                             {
                                 /*传送Y缓冲区*/
                                 //前半部分为原始图像
                                     DAT_copy((void *)(capYbuffer + i * numPixels),
                                         (void *)(disYbuffer + i * numPixels),
                                         numPixels>>1);
                                     //后半部分为垂直镜像图像
                                     DAT_copy((void *)(capYbuffer + i * numPixels),
                      (void *)(disYbuffer + (numPixels>>1) + (numLines-1-i) * numPixels),
                      numPixels>>1);

                                /*传送Cb缓冲区*/
                                //前半部分为原始图像
                                DAT_copy((void *)(capCbbuffer + i * (numPixels >> 1)),
                                         (void *)(disCbbuffer + i * (numPixels >> 1)),
                                         numPixels>>2);
                                //后半部分为垂直镜像图像
                           DAT_copy((void *)(capCbbuffer + i * (numPixels >> 1)),
                                    (void *)(disCbbuffer + (numPixels>>2) + (numLines-1-i) * (numPixels >> 1)),
                                    numPixels>>2);                                      


                                     /*传送Cr缓冲区*/
                                     //前半部分为原始图像
                                DAT_copy((void *)(capCrbuffer + i * (numPixels >> 1)),
                                         (void *)(disCrbuffer + i * (numPixels >> 1)),
                                         numPixels>>2);
                                //后半部分为垂直镜像图像         
                                DAT_copy((void *)(capCrbuffer + i * (numPixels >> 1)),
                                         (void *)(disCrbuffer + (numPixels>>2) + (numLines-1-i) * (numPixels >> 1)),
                                         numPixels>>2);                        
                             }
                   }
         }        
}
点赞  2009-12-4 12:07
好东西 学习一下
点赞  2009-12-7 14:09
学习学习
点赞  2010-12-22 14:12
好东西 谢谢分享 学习中
点赞  2010-12-27 09:49
好东西 感谢楼主分享
点赞  2011-3-19 22:49
好东西啊,值得一看
点赞  2011-3-23 21:47
收了
点赞  2011-7-15 11:07
收来看看。
点赞  2013-12-26 15:33
学习了
点赞  2014-3-11 20:53
留着以后用!谢谢!!
点赞  2014-3-21 20:06
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复