曙海教育集团论坛-在DSP6000中怎样编写您的第一个程序(1)
2010-07-20 13:48
411 查看
李现路:在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的主文件的书写规范:
.c的源文件完整内容如下:
#include
<stdio.h>
//#include <string.h>
#include
<stdlib.h> //stdlib 头文件里包含了C语言的一些函数,该文件包含了的C语言标准库函数的定义
#include
<csl.h> //调用CSL库函数头文件,CSL作用是用于配置、控制和管理DSP片上外设,C6000
DSP设计了自己的CSL库
#include <std.h> //包含了C语言的一些符号常量
#include
<csl_irq.h> //CSL中配置中断请求的头文件
#include <csl_chip.h>
//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段
所有我们的内存分配,应该尽量包含上面的初始化段和未初始化段中所定义的段。
完整版本请见http://www.51qianru.cn/bbs/
---------------------------------------------------------
---------------------------------------------------------
李现路:DSP6000中C/C++语言和汇编语言的混合编程的方法
一、混合编程的方法主要有以下几种:
(1)
独立编写C语言程序和汇编程序,分别编译形成各自的目标代码块,
然后用连接器将两种模块连接起来。
(2)直接在
C/C++程序中嵌入汇编语句块。
(3)对C/C++程序进行编译生成相应的汇编程序,手工对生成的汇编程序进行修改。
(4)
在C/C++程序中使用汇编语言的变量、常数、函数。
二、常用混合编程主要有下面两种:
1、直接在
C/C++程序中嵌入汇编语句块:
例如在C/C++程序中嵌入以下汇编代码:
asm("STR:
.string/"abs/"");
注意:不要把汇编代码加到C/C++太复杂的结构里
2、在C/C++程序中使用汇编
语言的变量、常数、函数
(1)在C/C++的函数中调用汇编函数:
1)在C/C++中所做工作
extern int asmfunc(int a);
int gvar="4";
void main()
{
int i;
i="asmfunc"(gvar);
i="i"+1;
}
2) 汇编里的处理
.global _asmfuc
.global _gvar
_asmfunc:
(2)在c/C++程序中访问汇编语言中的变量
第一种情况:在C/C++程序中访问.bss段中定义的变量
1)汇编:
.bss _var1,4
.global _var1
2)在C/C++中作的工作:
extern int var1;
第二种情况:在C/C++程序里访问没有定义在.bss段中定义的变量
1)汇编里要作的工作
.global _sine
.sect "sine_tab"
_sine:
.float 0.0
.float 0.124554
.float 0.99882
.float 0.45231
首先要在汇编程序里定义一个数据表,将该数据表放到一个自己定义的段中,然后
定义一个全局指针变量,并将该指针变量指向数据表的首个地
址。
2)在C/C++ 中要做的工作:
extern
float sine[];
float sine_p=sine;
f="sine"_p[4];
需要定义一C/C++的指针变量,该指针变量和汇编中的全局变量可以进行数据读取。
(3)在C/C++程序中访问汇编语言中的常量:
(1)汇编程序中的做法:
_tablesize .set 1000
.global _table_size
(2) C/C++程序中要做的工作:
extern int
table_size;
#define TABLE_SIZE ((int)(&table_size));
........
for(i=0;i<TABLE_SIZE;i++)
完整版本请见http://www.51qianru.cn/bbs/
曙海教育
曙海嵌入式学院
(课程:DSP培训,FPGA培训,MTK培训,Android培训,iPhone培训)
电话:021-51875830
网址:http://www.51qianru.cn
讲师:李现路
一、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
<stdio.h>
//#include <string.h>
#include
<stdlib.h> //stdlib 头文件里包含了C语言的一些函数,该文件包含了的C语言标准库函数的定义
#include
<csl.h> //调用CSL库函数头文件,CSL作用是用于配置、控制和管理DSP片上外设,C6000
DSP设计了自己的CSL库
#include <std.h> //包含了C语言的一些符号常量
#include
<csl_irq.h> //CSL中配置中断请求的头文件
#include <csl_chip.h>
//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段
所有我们的内存分配,应该尽量包含上面的初始化段和未初始化段中所定义的段。
完整版本请见http://www.51qianru.cn/bbs/
---------------------------------------------------------
---------------------------------------------------------
李现路:DSP6000中C/C++语言和汇编语言的混合编程的方法
一、混合编程的方法主要有以下几种:
(1)
独立编写C语言程序和汇编程序,分别编译形成各自的目标代码块,
然后用连接器将两种模块连接起来。
(2)直接在
C/C++程序中嵌入汇编语句块。
(3)对C/C++程序进行编译生成相应的汇编程序,手工对生成的汇编程序进行修改。
(4)
在C/C++程序中使用汇编语言的变量、常数、函数。
二、常用混合编程主要有下面两种:
1、直接在
C/C++程序中嵌入汇编语句块:
例如在C/C++程序中嵌入以下汇编代码:
asm("STR:
.string/"abs/"");
注意:不要把汇编代码加到C/C++太复杂的结构里
2、在C/C++程序中使用汇编
语言的变量、常数、函数
(1)在C/C++的函数中调用汇编函数:
1)在C/C++中所做工作
extern int asmfunc(int a);
int gvar="4";
void main()
{
int i;
i="asmfunc"(gvar);
i="i"+1;
}
2) 汇编里的处理
.global _asmfuc
.global _gvar
_asmfunc:
(2)在c/C++程序中访问汇编语言中的变量
第一种情况:在C/C++程序中访问.bss段中定义的变量
1)汇编:
.bss _var1,4
.global _var1
2)在C/C++中作的工作:
extern int var1;
第二种情况:在C/C++程序里访问没有定义在.bss段中定义的变量
1)汇编里要作的工作
.global _sine
.sect "sine_tab"
_sine:
.float 0.0
.float 0.124554
.float 0.99882
.float 0.45231
首先要在汇编程序里定义一个数据表,将该数据表放到一个自己定义的段中,然后
定义一个全局指针变量,并将该指针变量指向数据表的首个地
址。
2)在C/C++ 中要做的工作:
extern
float sine[];
float sine_p=sine;
f="sine"_p[4];
需要定义一C/C++的指针变量,该指针变量和汇编中的全局变量可以进行数据读取。
(3)在C/C++程序中访问汇编语言中的常量:
(1)汇编程序中的做法:
_tablesize .set 1000
.global _table_size
(2) C/C++程序中要做的工作:
extern int
table_size;
#define TABLE_SIZE ((int)(&table_size));
........
for(i=0;i<TABLE_SIZE;i++)
完整版本请见http://www.51qianru.cn/bbs/
曙海教育
曙海嵌入式学院
(课程:DSP培训,FPGA培训,MTK培训,Android培训,iPhone培训)
电话:021-51875830
网址:http://www.51qianru.cn
讲师:李现路
相关文章推荐
- 在DSP6000中怎样编写您的第一个程序(转)
- 李现路:在DSP6000中怎样编写您的第一个程序(二)
- 李现路:在DSP6000中怎样编写您的第一个程序(二)
- 李现路:在DSP6000中怎样编写您的第一个程序(二)
- C语言-将1到9这九个数字分成三个3位数,要求第一个3位数,正好是第二个3位数的1/2,是第三个3位数的1/3。问应当怎样分,编写程序实现。
- 微软等数据结构+算法面试100题(5)--怎样编写一个程序,把一个有序整数数组放到二叉树中
- 在linux系统上编写的第一个程序
- MyEclipse配置Tomcat 并编写第一个JSP程序
- 搭建java web开发环境、使用eclipse编写第一个java web程序
- 搭建Spring开发环境并编写第一个Spring小程序
- 怎样编写一个程序,把一个有序整数数组放到二叉树中?
- 消息队列(1):windows10+eclipse+cygwin编写第一个消息队列程序
- python编程结构(编写ArcGIS中的工具)--以我的第一个程序为例
- 使用Playground编写第一个Swift程序
- vs2008编写第一个Windows程序
- 用记事本编写第一个Java程序运行时 出现报错:错误: 类helloworld是公共的, 应在名为 helloworld.java 的文件中声明 public class helloworld {
- 第一个C语言编译器是怎样编写的?
- 怎样编写支持多国语言的程序, 让它能够根据所运行的操作系统自动显示相应的文字。
- 编写并运行第一个Lisp程序
- 编写你的第一个Hibernate程序 (在Hibernate中使用oracle的sequence产生主键 )