原创 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、固化程序
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户116386 2007-4-18 10:59

thank you!

太谢谢楼主哈!

这样我就可以继续工作了哈!

等在遇到问题在来请教哈!

zhaoliang_0801_926809075 2007-4-18 07:48

http://www.ednchina.com/blog/zl0801/5644/message.aspx

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

谢谢!呵呵!放心吧!我理解哈!我不会问有关技术上的问题的!以前没做过这些!没什么头绪,不知道从哪入手,主要还是要学习做设计的思路和步骤,具体每一步怎么实现,我就自己来弄!

相关推荐阅读
用户58572 2006-10-23 15:09
Gun汇编的保留字
Gun汇编的保留字不是很多书会提到的, 查找起来很不方便, 我自己整理了一下. 希望对以后有用. .ascii  “<string>”<?xml:namespace prefix =...
用户58572 2006-10-14 21:18
ARM学习笔记
1.寄存器R16用作CPSR(Current Program Status Register,当前程序状态寄存器),CPSR可在任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位...
用户58572 2006-10-14 21:12
画中画的硬件原理
要实现画中画功能,首先得有两个前提,背景图片,动画或视频,在图片中嵌入视频信息。    先用ARM产生图片信息,用视频解码芯片解调视频信息,再用FPGA把这两路信号合成,输出到FTF LCD上显示,难...
用户58572 2006-10-14 21:03
44B0的初始化程序的理解
 44B0的初始化程序就是初始化各个关键的寄存器,建立中断向量,然后转移到主函数去执行程序。      不过44B0不支持地址映射,所以程序不COPY到RAM种执行。44B0初始化对我们广大初学者来说...
用户58572 2006-10-14 21:02
通过网络烧写39VF160步骤
通过FTP烧写FLASH是一个编程工具,提供对39VF160的编程,这个程序出售时已经烧写到ARM anywhereII的29F040中,用户拿到开发板后可以直接使用。具体内容1.电路连接:     ...
用户58572 2006-10-13 20:39
砌墙工人的命运
三个工人砌一堵墙   有人过来说:“你们在干什么?”   第一个没好气的地说:“没看见吗?砌墙。”   第二个抬头笑了笑,说:“我们在盖一幢高楼。”   第三个边干边哼着歌曲,他的笑容很灿烂开心:我们...
我要评论
1
9
关闭 站长推荐上一条 /3 下一条