原创
DSP的C语言学习
2006-9-29 18:20
4343
9
8
分类:
处理器与DSP
CMD文件的作用:
在DSP里,程序执行过程中也有好多地方需要跳转,所以需要跳转的目标地址。如果你在编程序时知道你所要跳转的地址,那就更好的,但实际上,这是很不好控制的。所以就产生了.CMD。它有一个最大的好处,可以把每个段分配地址,所以比如你想从一个段跳到另一个段的时候,就很方便的知道这个段的起始地址。
CMD 它是用来分配rom和ram空间用的,告诉链接程序怎样计算地址和分配空间.所以不同的芯片就有不同大小的rom和ram.放用户程序的地方也不尽相同.所以要根据你的芯片进行修改.cmd文件分两部分.MEMORY和SECTIONS.
MEMORY
{
PAGE 0 ..........
PAGE 1.........
}
SECTIONS
{SECTIONS
{
.vectors .................
.reset .................
................
}
MEMORY是用来指定芯片的rom和ram的大小和划分出几个区间.
PAGE 0 对应rom;PAGE 1对应ram
PAGE 里包含的区间名字与其后面的参数反映了该区间的起始地址和长度.
如: PAGE 0 : VECS(区间名字): origin(起始地址) = 0h , length (长度)=040h /*VECTORS*/
SECTIONS:(在程序里添加下面的段名如.vectors.用来指定该段名以下,另一个段名以上的程序(属于PAGE0)或数据(属于PAGE1)放到“>”符号后的空间名字所在的地方。
如引用字段名“.vectors ”的程序或数据将被放到VECS ,VECS是PAGE0即是ROM空间 00H至40H的地方
SECTIONS
{
.vectors : { } > VECS PAGE 0 /* Interrupt vector table */
.reset : { } > VECS PAGE 0 /* Reset code */
............
}
.vectors,.reset都是段名。 加不加“.”随你便,即.vectors表示名为 “.vectors”的段。
{}表示段的全部,{}> VECS PAGE 0表示将段的全部放入名为 VECS PAGE 0的内存区。
example:
/****************************************************************************/
/******** Specify the memory configuration **********************************/
/****************************************************************************/
MEMORY
{
PAGE 0: VECS: origin = 00000h, length = 00040h
LOW: origin = 00040h, length = 03FC0h
SARAM: origin = 04000h, length = 00800h
B0: origin = 0FF00h, length = 00100h
PAGE 1: B0: origin = 00200h, length = 00100h
B1: origin = 00300h, length = 00100h
B2: origin = 00060h, length = 00020h
SARAM: origin = 08000h, length = 00800h
}
/*--------------------------------------------------------------------------*/
/* SECTIONS ALLOCATION */
/*--------------------------------------------------------------------------*/
SECTIONS
{
.text : { } > LOW PAGE 0
.cinit : { } > LOW PAGE 0
.switch : { } > LOW PAGE 0
.const : { } > SARAM PAGE 1
.data : { } > SARAM PAGE 1
.bss : { } > SARAM PAGE 1
.stack : { } > SARAM PAGE 1
.sysmem : { } > SARAM PAGE 1
}
1,系统定义:
.cinit 存放C程序中的变量初值和常量;
.const 存放C程序中的字符常量、浮点常量和用const声明的常量;
.switch 存放C程序中switch语句的跳针表;
.text 存放C程序的代码;
.bss 为C程序中的全局和静态变量保留存储空间;
.far 为C程序中用far声明的全局和静态变量保留空间;
.stack 为C程序系统堆栈保留存储空间,用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果;
.sysmem 用于C程序中malloc、calloc和realloc函数动态分配存储空间
2,用户定义:
#pragma CODE_SECTION (symbol, "section name";
#pragma DATA_SECTION (symbol, "section name"
DSP的C语言的特殊性
大家在使用51系列C语言时已经注意到,控制器的C语言和PC机上使用的C有一个显著的特点:经常要对硬件操作,程序中有大量针对控制器内部资源进行操作的语句。所以,开发者要明白怎样用C语言来操纵控制器的内部资源,既怎样用C语句操作寄存器和内部存储器等。
举个例子,在51汇编中我们写 MOV A,#20H,汇编程序能够识别A是指累加器,而在51 C程序中我们写 ACC=32;,编译器能够识别ACC是指累加器而不是一般的变量。即每一个寄存器都有一个专有名字供开发者使用,它们定义在一个头文件reg51.h 中,程序员只需在程序的开始部分用#include“reg51.h”语句将该文件包含进来即可。注意:这些寄存器的名字不能用做变量名。
同样,在TMS320F240的C语言中也有一个头文件C240.H定义各个寄存器的名称,这里摘录几条语句进行介绍。
比如:#define IMR ((PORT)0x0004)
#define XINT1_CR ((PORT)0x07070)
IMR 、XINT1_CR就对应两个寄存器,实际是寄存器的地址,用高级语言的说法是指针。我们也在程序的开始部分用#include“c240.h”语句将该文件包含进来。这样,在DSP的C语言中使用它们只需在前面加一个星号(*),例如,
*IMR=0X1010;/* 将16进制数1010H赋给IMR寄存器 */
*XINT1_CR=0X0A0B0;/*将16进制数A0B0H赋给XINT1_CR寄存器 */
最好将c240.h这个文件打印出来,弄清楚各个寄存器的定义名称。
TMS320F240芯片的C语言开发过程
简单地说,整个过程包括以下五个步骤:
1、编辑C语言源程序
2、编译源程序(注意编译参数)
3、链接目标文件(注意用CMD文件)
4、在线仿真
5、固化程序
用户116386 2007-4-18 10:59
thank you!
太谢谢楼主哈!
这样我就可以继续工作了哈!
等在遇到问题在来请教哈!
zhaoliang_0801_926809075 2007-4-18 07:48
zhaoliang_0801_926809075 2007-4-18 07:47
你说的没错,但是要注意,
模块在工作前你必须对它进行配置,使其工作在发射和接收状态,这个配只过程data的数据是输出,,
如果是发射,则还是输出,
如果是接收,那配置后就变成输入了!
用户116386 2007-4-17 21:43
哦!
谢谢提醒哦!
楼主说接收的时候data是双向的,我只有nrf2401英文版的数据手册,看了几次也没搞懂nrf2401在接收的时候是怎么个双向法!
我只知道nrf2401在配置为接收模式后,就处于监听状态,如果收到地址和CRC都正确的数据包就将DR1/2置高,然后nrf2401自动从数据包中解出有效数据,从data角输出!在这个过程中,data不是单向的吗?
楼主,我对nrf2401的接收过程是不是理解有错或者说不全面,请楼主指点一下!
zhaoliang_0801_926809075 2007-4-14 12:22
按照 nrf2401上的 发射和接收的时序 给出来 状态机,
再用 移位寄存器 发送数据,
注意发射和接收的不同点,接收的时候data是双向的,发射的时候是单向的 。
最难的地方是 时钟的同步问题 !
用户116386 2007-4-3 11:25
如果我的理解没错的话,要用FGPA来控制nrf2401是否就要先画好nrf2401工作过程中包括寄存器在内的各个状态图,并且明白各个状态之间的相互转换关系呢?
我现在只知道nrf2401的几种工作模式,以及几种工作模式间的转换条件和时序关系,还知道nrf2401整个工作流程!
那么这个状态转换图应该怎么来画呢?它应该包含些什么呢?
用户116386 2007-4-3 10:59
哦!先谢谢哈!
我的这次毕业设计的要求不高,只要能实现用FPGA控制nrf2401收发数据就行!对于系统的性能那些没太多要求!核心工作还是FPGA的编程!
由于是初学FGPA,我现在就是不知道编程应该何入手!那天问了下导师,说了半天也不是太明白,只知道他给我讲了有限状态机!
我理解的大概意思就是用FGPA做东西,应该先了解清楚最低层细到每个寄存器现在状态和下个状态是什么!掌握各个状态的转换关系,然后在根据这个关系来写程序进行控制!
那么我想请教一下,我对此理解是否有误呢?
(呵呵,另外说下,我是今年3月初做毕业设计才正式开始接触FPGA的,所以是个大菜鸟哈!要是提的问题水平太低,楼主别见笑哦!)
zhaoliang_0801_926809075 2007-3-29 22:33
做无线的这个东西,最麻烦了,最好的办法就是有一个对照,比如说你调试好了发射(假设),那么你开始调接收,如果不好用,你可以确定是接收部分的毛病,但是如果发射也有错误,那么就难办了,
我当事的办法是先用单片机(msp430)驱动好了,通过比较时序图和观测示波器一点一点调试出来的。
调试的时候,先用msp430发,fpga收,
再用fpga发,msp430收,方可以调试通过的!
用户116386 2007-3-29 17:11
比如说,我现在已经完全掌握了nrf2401的工作流程!
那么下一步,我就应该是用FGPA来控制nrf2401了吧!
这个时候我应该先做什么?在做什么啊?在这个过程中我应该考虑些什么因素呢?
用户116386 2007-3-29 17:04
谢谢!呵呵!放心吧!我理解哈!我不会问有关技术上的问题的!以前没做过这些!没什么头绪,不知道从哪入手,主要还是要学习做设计的思路和步骤,具体每一步怎么实现,我就自己来弄!