Chinaunix首页 | 论坛 | 博客
  • 博客访问: 73939
  • 博文数量: 12
  • 博客积分: 396
  • 博客等级: 一等列兵
  • 技术积分: 110
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-08 23:52
个人简介

真诚与善良是最大的财富

文章分类

全部博文(12)

文章存档

2015年(1)

2011年(3)

2010年(8)

分类: 嵌入式

2010-08-17 08:33:55

一、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中定义的.vecsL2空间*/

    .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

   
所有我们的内存分配,应该尽量包含上面的初始化段和未初始化段中所定义的段。
阅读(2403) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~