嵌入式c语言面试题

2024-04-08

嵌入式c语言面试题(精选8篇)

篇1:嵌入式c语言面试题

考查的是结构体和数组的内存布局情况。

#include

#include

typedef struct array1{

int ID;

struct array1* next;

}A;

typedef struct array2{

int ID;

int a;

int b;

int c;

}* B;

int main

{

A s1[15];

A* s2;

B s3;

for(int i=0;i<10;i++)

{

s1[i].ID=i+64;

}

s2=s1+3;

s3=(B)s2;

printf(”%d/n“,s3->b);

return 0;

}

篇2:嵌入式c语言面试题

#include

#include

#include

char *GetMemory(char *p)

{

p = (char *)malloc(100);

return p;

}//当调用此函数时,会在栈里分配一个空间存储p, p指向堆当中的一块内存区,当函数调用结束后,若函数没有返回值,

//系统自动释放栈中的P

void Test(void)

{

char *str = NULL;

str=GetMemory(str);

strcpy(str, ”test“);

printf(”%s/n“,str);

}

char *GetMemory1(void)

{

char *p = ”Test1“;

return p;

}//若换成char p=”hello world“; 就会在函数调用结束后,释放掉为”Test1“的拷贝分配的空间,返回的P只是一个野指针

void Test1

{

char *str = ”“;

str=GetMemory1;

printf(”%s/n“,str);

//str=GetMemory;

}

void GetMemory2(char p, int num)

{

*p = (char *)malloc(num);

}//当调用此函数时,会在栈里分配一个空间存储p, p指向栈中的一变量str,在此函数中为str在堆当中分配了一段内存空间

//函数调用结束后,会释放p, 但str所在的函数Test2还没运行完,所以str此时还在栈里.

void Test2(void)

{

char *str = NULL;

GetMemory2(&str, 100);

strcpy(str, ”hello“);

printf(”%s/n“,str);

}

void Test3(void)

{

char *str=(char *)malloc(100);

strcpy(str, ”hello“);//此时的str指向的是拷贝到栈里的”hello“,所以当释放掉str指向的堆空间时,str指向的栈里的值还是不变

free(str);

if(str != NULL)

{

strcpy(str, ”world“);

printf(”%s/n",str);

}

}

int main

{

Test;

Test1;

Test2;

Test3;

篇3:探讨ARM嵌入式系统C语言编程

关键词:ARM,嵌入式系统,C语言

随着现代科学技术和计算机技术的发展,嵌入式系统广泛地应用在各类电子产品中,比如视频电子产品、汽车电子产品以及智能家电等,目前正朝向工业自动化控制、网络、航天产品等高端领域迈进。ARM是高端嵌入式处理器的代表,但其不具备自我开发能力,必需借助程序环境或开发工具来实现自我开发能力,而C语言正是实现ARM嵌入式系统强大动力的基础。本文简要概述ARM及嵌入式概念,探讨基于ARM嵌入式系统上C语言编程的一些方法。

1 ARM和嵌入式系统概述

嵌入式系统也成嵌入式计算机系统,其主要用于控制、监控机器装置或大型厂房,和普通的PC机相比,有以下差别:(1)普通PC机系统面向大众行业大众群体,嵌入式系统针对特定的应用范围;(2)普通PC机的软件储存在硬盘或者磁盘当中,嵌入式系统软件固化在单片机或存储器芯片上;(3)普通PC机具备自身开发能力,而嵌入式系统要基于一个编程环境或一套开发工具实现自身开发。和普通PC机相同的是,嵌入式系统由操作软件、应用软件两部分组成。嵌入式系统包括嵌入式处理器、外围设备、操作系统和应用软件,其中嵌入式处理器和普通PC机的CPU类似,其是嵌入式系统核心部件。

ARM嵌入式处理器是各种各样嵌入式处理器中性能较好的一款处理器,其具有功耗低、处理速度快、价格低廉等优点,因此,有极为广泛的应用前景。

2 基于ARM嵌入式系统的C语言编程

嵌入式系统中的系统引导、存储管理、外围驱动及其它一些应用程序多数都需要C语言来编程,因此,下面分析ARM嵌入式系统和C语言编程两者技术融合,并详细地从存储管理、外围驱动程序以及程序引导等技术融合方面进行研究。

2.1 存储管理

存储管理较为复杂,广泛意义上讲,片内高速Cache、磁盘文件系统以及内存等都属于存储管理范畴,而ARM嵌入式系统下存储管理指动态内存管理。ARM嵌入式平台C语言编程通过malloc和free两个标准库函数实现内存动态分配和释放,其中,malloc主要完成从ARM嵌入式系统空闲的内存中分配合适内存块,而free则主要负责内存块回收。malloc和free均需要操作系统内棱支持,一般在ARM裸平台上不可直接调用。基于此,编写m_alloc和m_free函数实现动态存储管理功能。

2.2 外围驱动程序

ARM嵌入式系统中驱动程序主要指最底层中断处理程序以及在其基础上建立的驱动程序两部分,一般情况下,驱动程序和外围设备关系密切,因此,驱动程序较为复杂。外围设备通过中断和嵌入式系统通信,在处理中断的相关变量时要谨慎小心。一般情况下,编译器优化选项打开之后,有关变量的操作要放置在寄存器中,中断服务往往会通过改变某些全局变量通知应用程序外部事件发生,但被改变的全局变量通常情况下是不能被优化的。为解决这个问题,在声明变量的时候要加上volatile修饰符,用这个修饰符通知编译器某个变量有可能被异步事件改变。另外,在C语言编写过程中要考虑C语言编写形式,比如,Array[idx/4]=&~1实现对数组元素的操作,这里不能写为Array[idx>>4]=&~1,“>>”是一种移位运算符,有其对应的机器指令,“/”是一种除法运算符,运算方法很复杂。

2.3 系统引导

C语言从main函数开始,main函数指令原型为:int main(int argc,char**argv),其中,argc代表参数个数,argv代表指向参数的指针数组。Main函数运行原理如下:操作系统内核启动main函数,在操纵系统内核指导下函数完成变量初始化,调用结束之后,检查main函数返回值,如果返回值是0,说明运行正常,如果返回值是1,说明程序运行错误。ARM嵌入式系统中,没有操作系统内核,所以,对main函数初始化由系统引导模块完成。

嵌入式系统缺乏操作系统的内核,系统对main函数初始化需要借助系统引导模块完成,而汇编语言可以完成系统引导的工作。一般而言,系统引导模块完成初始化任务后,在一条跳转指令的引导下进入主入口main,最终可实现应用程序控制权转移。从这个意义上来说,ARM嵌入式系统和C语言的技术融合点在嵌入式系统引导可通过控制权转移至C语言的main函数。

3 结语

随着嵌入式应用的普及,嵌入式软件受到了大众的关注,本文简要介绍了ARM嵌入式系统和C语言的结合,通过ARM嵌入式系统和C语言的结合,有效解决了ARM嵌入式系统自身存在的一些问题,比如内存资源有限而栈容量不能自动扩展,或标准库函数不能直接借用等等,基于ARM嵌入式平台上的C语言很大程度上促进了ARM系统的完善,提升了嵌入式的技术水平。随着嵌入式软件、系统的不断成熟和C语言编程的运用,相信ARM嵌入式系统会越来越广泛地应用在生活中的各个领域。

参考文献

[1]过怡.基于ARM的高效C语言编程[J].单片机与嵌入式系统应用,2010.

[2]孙婧.ARM嵌入式系统C语言编程分析[J].计算机光盘软件与应用,2012.

篇4:DSP嵌入式系统下的C语言开发

关键词:DSP嵌入式系统;C语言;软件开发

中图分类号:TP368.12 文献标识码:A 文章编号:1674-7712 (2014) 06-0000-01

随着社会的不断发展,技术的发展速度也在不断飞跃,在通信领域、电子信息领域、自动控制领域、软件无线电领域和信息家电领域等,DSP都取得了较为广泛的发展和应用。按照以往的经验来说,在对DSP嵌入式产品进行开发的时候往往都采用控制器的汇编语言来进行编写,但是到目前来说,很多领域都认为采用C语言进行DSP嵌入式的语言开发更加方便。

一、DSP嵌入式系统下的C语言开发过程

本研究采用TMS320F240芯片进行研究,其整个开发过程可分为五步。

(一)对C语言的源程序进行编辑

在对该系统软件进行编写的时候可以采用任何的编辑器进行源程序的书写,比如NOTEPAD、EDIT等,需要注意的是,程序的命名需要以“.C”为后缀进行存盘。而程序的源代码既可以写在一个“C文件”里,也可以写在多个“C”文件里面,但是对于一些函数的原型声明或者是预定义变量则可以集中地放置在一个头文件里面。要特别注意,一定要在C程序的前面用#include“c240.h”将寄存器的文件包括在其中。

(二)对源程序进行编译

编辑好C语言的源程序以后就可以采用DSPCL编译程序对其进行编译,最终生成OBJ文件。

在编译的时候所采用的格式:DSPCL 源文件名 参数

举例来说:DSPCL EX1.C -V2XX -GK -MN

其常用参数的意义是:V2XX表示C编译器选择的处理器是2XX系列;GK代表的是保留编译所生成的汇编文件,也就是(.ASM)文件;MN表示正在进行的正常优化。而其他的参数则需要参考DSP的编译器手册,假如存在多个源文件,那么需要对其分别进行编译,每一个源文件在编译之后都会生成一个ASM文件和OBJ文件[1]。

(三)目标文件的链接

IT公司的汇编器和编译器所创建的目标文件采用的是COFF的格式文件,这种格式能够更好地进行模块化的编程,能够使代码段的管理和对目标系统存储器的管理更加的方便和灵活。给COFF格式进行C语言或者汇编程序的编写的时候,不需要对变量目标地址和程序代码进行指定,这也为程度的移植和程序的编写提供了很大的方便。而链接器对块的处理主要有两种功能,一种功能是对COFF目标文件当中的块进行利用,用其建立数据块和程序,再将这些块组合起来,就能够成为被DSP芯片执行COFF输出的模块,而第二种就是链接器为输出的块指定存储的位置[2]。因此链接器需要为上述两个功能提供指令,分别是MEMORY、SECTTONS。MEMORY命令对目标系统的存储器进行定义,程序员可以选择对每一块存储器的长度和起始地址做出定义,而SECTIONS命令则是用来对输入块组合以及输出块放置在存储器当中的位置进行定义的。加入在具体的编写当中不采用以上两种命令的话,也可以使链接器以缺省的分配算法进行,笔者建议使用者两种命令,但是在使用的时候需要注意这两个命令要在CMD文件当中使用。

(四)程度的仿真

EMURST仿真器会对命令做出复位,EMU2XXW EX1.OUT将COFF格式的二进制代码载入并进行仿真运行,而有关调节器则按照规定使用即可。

(五)程序的固化

等到程序仿真运行通过之后,就需要将其固化到FLASH ROM当中,TMS320F240内有16k字的FLASH ROM可以用来对程序进行固化,在其程序不大于16k的时候,它不需要外扩EPROM。接下来将主要采用JTAG口的固化方法来对进行分析说明。

先要采用EMURST命令对调试器进行复位,然后在对三个批处理文件做出执行。第一个是执行BC0.BAT批处理文件,对FLASH ROM的(CLEAR)进行清除,使其全部为“0”;接下来是执行BE0.BAT批处理文件,对FLASH ROM的(ERASE)进行擦除,使其全部为“1”。这两步对于软件包当中自带的这个两个BAT文件不需要做出修改。下面是第三步,对BP16K.BAT批处理文件做出执行,需要将自己的OUT文件加入到DSP内部的FROM当中,在此之前需要先对BP16K.BATJ进行修改,对待写入的OUT文件做出替换,替换成自己的OUT文件。需要注意的是,在对程序进行固化的时候,一定要将CPU控制在20MHz的频率之下,然后在SRC目录当中配置一个C240_CFG.I的文件。

二、结束语

在本研究当中,笔者主要以TMS320F240芯片为例,针对DSP嵌入式系统下的C语言开发的开发过程作出了简要分析,文中笔者也根据自身理解和自身经验提出了一些主观意见。希望本篇文字能够对读者有所启发,也希望相关的工作人员再接再厉,进行不懈的努力,争取开发出更新的语言来服务DSP嵌入式系统,为系统开发作出更多的贡献。

参考文献:

[1]瞿新吉.嵌入式系统的BootLoader技术浅析[J].科技经济市场,2010(10):28.

篇5:C语言面试题大11

2. 请列举一个软件中时间换空间或者空间换时间的例子。

void swap(int a,int b)

{

int c; c=a;a=b;b=a;

}

--->空优

void swap(int a,int b)

{

a=a+b;b=a-b;a=a-b;

}

6. 请问一下程序将输出什么结果?

char *RetMenory(void)

{

char p[] = “hellow world”;

return p;

}

void Test(void)

{

char *str = NULL;

str = RetMemory();

printf(str);

}

RetMenory执行完毕,p资源被回收,指向未知地址。返回地址,str的内容应是不可预测的, 打印的应该是str的地址

写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)

功能:

在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr所指内存。例如:“abcd12345ed125ss123456789”的首地址传给intputstr后,函数将返回

9,outputstr所指的值为123456789

int continumax(char *outputstr, char *inputstr)

{

char *in = inputstr, *out = outputstr, *temp, *final;

int count = 0, maxlen = 0;

while( *in != “�” )

{

if( *in >47 && *in < 58 )

{

for(temp = in; *in >47 && *in < 58 ; in++ )

count++;

}

else

in++;

if( maxlen < count )

{

maxlen = count;

count = 0;

final = temp;

}

}

for(int i = 0; i < maxlen; i++)

{

*out = *final;

out++;

final++;

}

*out = “�”;

return maxlen;

}

不用库函数,用C语言实现将一整型数字转化为字符串

方法1:

int getlen(char *s){

int n;

for(n = 0; *s != “�”; s++)

n++;

return n;

}

void reverse(char s[])

{

int c,i,j;

for(i = 0,j = getlen(s) - 1; i < j; i++,j--){

c = s[i];

s[i] = s[j];

s[j] = c;

}

}

void itoa(int n,char s[])

{

int i,sign;

if((sign = n) < 0)

n = -n;

i = 0;

do{/*以反序生成数字*/

s[i++] = n%10 + “0”;/*get next number*/

}while((n /= 10) >0);/*delete the number*/

if(sign < 0)

s[i++] = “-”;

s[i] = “�”;

reverse(s);

}

方法2:

#include

using namespace std;

void itochar(int num);

void itochar(int num)

{

int i = 0;

int j ;

char stra[10];

char strb[10];

while ( num )

{

stra[i++]=num%10+48;

num=num/10;

}

stra[i] = “�”;

for( j=0; j < i; j++)

{

strb[j] = stra[i-j-1];

}

strb[j] = “�”;

cout<<< p>

}

int main()

{

int num;

cin>>num;

itochar(num);

return 0;

}

前几天面试,有一题想不明白,请教大家!

typedef struct

{

int a:2;

int b:2;

int c:1;

}test;

test t;

t.a = 1;

t.b = 3;

t.c = 1;

printf(“%d”,t.a);

printf(“%d”,t.b);

printf(“%d”,t.c);

谢谢!

t.a为01,输出就是1

t.b为11,输出就是-1

t.c为1,输出也是-1

3个都是有符号数int嘛,

这是位扩展问题

01

11

1

编译器进行符号扩展

求组合数: 求n个数(1....n)中k个数的组合....

如:combination(5,3)

要求输出:543,542,541,532,531,521,432,431,421,321,

#include

int pop(int *);

int push(int );

void combination(int ,int );

int stack[3]={0};

top=-1;

int main()

{

int n,m;

printf(“Input two numbers:”);

while( (2!=scanf(“%d%*c%d”,&n,&m)) )

{

fflush(stdin);

printf(“Input error! Again:”);

}

combination(n,m);

printf(“”);

}

void combination(int m,int n)

{

int temp=m;

push(temp);

while(1)

{

if(1==temp)

{

if(pop(&temp)&&stack[0]==n) //当栈底元素弹出&&为可能取的最小值,循环退出

break;

}

else if( push(--temp))

{

printf(“%d%d%d ”,stack[0],stack[1],stack[2]);

pop(&temp);

}

}

}

int push(int i)

{

stack[++top]=i;

if(top<2)

return 0;

else

return 1;

}

int pop(int *i)

{

*i=stack[top--];

if(top>=0)

return 0;

else

return 1;

篇6:C语言面试题大8

要求算法复杂度不能是O(n^2)

谢谢!

可以先用快速排序进行排序,其中用另外一个进行地址查找

代码如下,在VC++6.0运行通过。给分吧^-^

//快速排序

#include

usingnamespacestd;

intPartition (int*L,intlow,int high)

{

inttemp = L[low];

intpt = L[low];

while (low < high)

{

while (low < high && L[high] >= pt)

--high;

L[low] = L[high];

while (low < high && L[low] <= pt)

++low;

L[low] = temp;

}

L[low] = temp;

returnlow;

}

voidQSort (int*L,intlow,int high)

{

if (low < high)

{

intpl = Partition (L,low,high);

QSort (L,low,pl - 1);

QSort (L,pl + 1,high);

}

}

intmain

{

intnarry[100],addr[100];

intsum = 1,t;

cout << “Input number:” << endl;

cin >>t;

while (t != -1)

{

narry[sum] = t;

addr[sum - 1] = t;

sum++;

cin >>t;

}

sum -= 1;

QSort (narry,1,sum);

for (int i = 1; i <= sum;i++)

cout << narry[i] << “ ”;

cout << endl;

intk;

cout << “Please input place you want:” << endl;

cin >>k;

intaa = 1;

intkk = 0;

for (;;)

{

if (aa == k)

break;

if (narry[kk] != narry[kk + 1])

{

aa += 1;

kk++;

}

}

cout << “The NO.” << k << “number is:” << narry[sum - kk] << endl;

cout << “And it”s place is:“ ;

for (i = 0;i < sum;i++)

{

if (addr[i] == narry[sum - kk])

cout << i << ” “;

}

return0;

}

1、找错

Void test1()

{

char string[10];

char* str1=”0123456789“;

strcpy(string, str1);// 溢出,应该包括一个存放”�“的字符string[11]

}

Void test2()

{

char string[10], str1[10];

for(I=0; I<10;I++)

{

str1[i] =”a“;

}

strcpy(string, str1);// I,i没有声明,

}

Void test3(char* str1)

{

char string[10];

if(strlen(str1)<=10)// 改成<10,字符溢出,将strlen改为sizeof也可以

{

strcpy(string, str1);

}

}

2.

void g(int**);

int main()

{

int line[10],i;

int *p=line; //p是地址的地址

for (i=0;i<10;i++)

{

*p=i;

g(&p);//数组对应的值加1

}

for(i=0;i<10;i++)

printf(”%d“,line[i]);

return 0;

}

void g(int**p)

{

(**p)++;

(*p)++;// 无效

}

输出:

1

2

3

4

5

6

7

8

9

10

3. 写出程序运行结果

int sum(int a)

{

auto int c=0;

static int b=3;

c+=1;

b+=2;

return(a+b+c);

}

void main()

{

int I;

int a=2;

for(I=0;I<5;I++)

{

printf(”%d,“, sum(a));

}

}

// static会保存上次结果,记住这一点,剩下的自己写

输出:8,10,12,14,16,

4.

int func(int a)

{

int b;

switch(a)

{

case 1: 30;

case 2: 20;

case 3: 16;

default: 0

}

return b;

}

则func(1)=?

// b定义后就没有赋值。

5:

int a[3];

a[0]=0; a[1]=1; a[2]=2;

int *p, *q;

p=a;

q=&a[2];

则a[q-p]=a[2]

篇7:c语言面试题及答案

答案:指向常量的指针所指向的内容不能被修改但能够指向其它的量,而常指针是指向的内容可以被修改但指针不能再指向其它地方。

12. if (a=b)

printf(“a==b”)

else

printf(“a!=b”);

输出结果为:

A.a==b B.a!=b C.不一定 D.不能运行

答案:不一定,这要根据b的内容来决定。通常再编程时不要使用此类的赋值语句。

13.在内联函数中使用static变量,比如

inline test

{ static couter = 0;

counter++;

}

会有什么问题?

答案:会造成多次定义该变量,因此再内联函数中禁止定义静态变量

14. F是一个结构类型,有如下定义:

F f1,f2;

问:f1=f2;语句是否成立?

答案:该语句成立,不过有的编译器不支持。实际上编译器也是用内存拷贝函数来实现的。

15.全局变量、局部变量、模块变量在内存空间中如何存放?(数据区or栈空间?)

答案:全局变量在全局空间分配,局部变量在栈空间分配,模块变量在全局空间分配。

16.struct A{

......

......

union {

int x;

.....

};

}

struct A a;

问:a.x这样的表示法是否成立?

答案:成立

如果结构定义改为如下定义

.struct A{

......

int x;

union {

int x;

.....

};

}

那a.x表示法是否成立?

答案:不成立,编译时会报x变量重定义

17. #define REDEF(name,arg1,arg...)

_##name (arg1,##arg)

问:以下两个语句宏展开的结果

REDEF(test_fn1,int a,int b);

REDEF(test_fn2,int a);

答案:

_test_fn1(int a ,int b)

_test_fn2(int a);

注意:在VC中不支持,gcc才支持该参数宏函数。

18. fnxxxx_max(char str[])

{

putchar str[0];

str++; //(1)

printf(“%s”,str);

}

main()

{

char str[20]={“ABCDEFG”};

fnxxxx_max(str);

str++; //(2)

printf(“%s”,str);

}

问:语句(1)和语句(2)是否成立?

答案:语句(1)成立,语句(2)不成立

19.#define SRR 0x001;

#define SRT 0x002;

#define SRI 0x0900;

EVENT = SRR|SRT|SRI

问:上面的语句有什么问题?EVENT的值会是多少?

答案:宏展开后变为:

EVENT = 0x001; 0x002;0x0900;

篇8:嵌入式c语言面试题

自1978年AMI公司发布世界上第一个单片DSP芯片及1980年日本NEC公司推出第一块单片DSP器件以后, 美国TI公司于1982年推出了第一代DSP芯片即TMS32010系列, 到目前为止已研发了第六代DSP芯片——TMS320C62X/C67X、TMS320C64X等;而美国Analog Device公司也推出了一系列有自己特色的定点、浮点的DSP芯片。随着芯片生产技术的发展, DSP嵌入式系统也相应得到大力发展, 无论是国际或是国内, 对于DSP系统的研发都有了一定成就。

1.1 国外发展现状

最早的DSP嵌入式系统是从国外发展起来的, 而且随着国外先进技术的迅速发展, 国际DSP系统始终保持着良好的发展势头, 尤其是以欧美为主的国际市场, 发展极其迅猛。如美国的Pentek公司、DSP research公司、Motorola公司以及加拿大的Dy4公司等, 都是发展规模相当大的DSP生产公司, 很多DSP系统的情况都可以从这些知名公司推出的产品信息来获得。比如说Pentek公司的4293处理板, 用8片TI公司生产的300MHz、有19200MIPS处理能力的TMS320C6203芯片, 集成了同等数量的32M同步动态随机存储器 (SDRAM) , 而数据吞吐为每秒600M。

上个世纪80年代以来, DSP系统随着数字信息处理技术的发展被迅速推入市场, 伴随着日趋激烈的竞争, 各DSP生产公司不断调整、优化发展规划, 深化了DSP系统产业化进程, DSP系统进入产业化是DSP应用程序成功的一个重要标志。

1.2 国内发展现状

近些年来, 随着我国信息技术产业的飞速发展, DSP嵌入式系统也有了较好的发展, 并已被我国数字信号处理、数字通信、雷达以及图像处理等高科技领域广泛应用, 为我国高新技术产业乃至整个国民经济发展做出了很大贡献。

目前, 我国许多高校以及科研机构都在致力于DSP嵌入式系统的研发, 同时取得了相当大的成就。但是, 我国主要的核心处理器件几乎都是从国外进口, 相较于国际先进技术水平, 我国在数字信号处理理论方面以及对高速率、高性能处理器的设计和制造方面都还有很大差距。因此, 我国在半导体研究领域更要投入大量的研发力度、人才及资金等, 这就要求我国科研人员要有敢于拼搏、艰苦奋斗的精神和坚持不懈的毅力。

2 DSP嵌入式系统应用情况

目前, 全球生产DSP的公司有80多家, 而生产出来的DSP芯片也多达300多种。生产DSP的公司主要有TI公司、Lucent公司、Analog Device公司以及Motorola公司, 其中TI公司以及AD公司极具代表性, 被以高新技术生产领域为主的各个生产领域广泛使用。

自从TI公司研发了第一代DSP芯片以来, 其在业界始终处于领军地位, 尤其是到现在为止生产到第六代DSP芯片系列, 都促进了DSP系统的发展。其中以:TMS320C2000、TMS320C5000和TMS320C6000系列被我国引进并广泛投入数字信号处理领域。其中TMS320C2000系列的高性能、高效率被广泛应用于工业控制领域, 该系列处理控制能力强外, 还提供了方便与高性能外围器件相连的接口, 其主要型号有TMS320C24X/28X系列;TMS320C5000系列性能高但功耗低, 最低功耗可以达0.33mA/MHz, 而最高达到900MIPS的处理速度, 适用于移动、手持系统, 其主要有TMS320C54X/55X系列型号;TMS320C6000系列可以说是高端DSP系统的代表, 其浮点运算可达600~1 800MFLOPS、定点运算可达1 200~8 000MIPS的运算速度, 其中浮点系列主要型号为TMS320C64X, 是TI公司最新研发的高性能定点DSP处理器, 浮点系列主要型号为TMS320C67X。

另外一个DSP生产势头良好并发展迅速的是美国AD公司, 其所生产的DSP系统主要有SHARC、TigerSHARC以及Blackfin系列。其中SHARC系列被广泛应用于商用或军用雷达、声纳信号处理等领域, 虽然其单片处理能力不高, 但连接组成DSP阵列便能提高速率及性能;而从SHARC改进的TigerSHARC为高端DSP, 其不仅处理能力极高, 而且有容量极大的随机存储器 (RAM) , 适用于软件无线电领域;至于Blackfin则是功耗低但性能高的DSP, 适用于便携式的通信产品。

我国某高校研发的基于TMS320C6201的高速实时DSP处理平台, 其允许输入数据的动态范围为16比特, 若512点的FFT可以在59微秒内完成, 若是1 024点的FFT, 也可以在130微秒内完成。我国某电子技术研究所研发的DSP雷达数字信号处理通用模块用6片美国AD公司生产的ADSP21060芯片和大量可编程器件构建而成。以快速傅里叶变换 (FFT) 算法来看, 以FFT、IFFT及复数乘法3个流水处理过程实行DSP组成的并行处理, 若在33MHz的时种下, 0.7毫秒就可以实现1 024点处理, 而实现的单通道数据率是1MHz, 双通道的并行工作率是2MHz。

3 C语言开发下DSP系统应用技术分析

TI公司DSP芯片的硬件编程主要有:用汇编语言、用C语言及用DSP/BIOS可视化编程工具。其中汇编语言程序指令不易读懂, 且通用性极差, 而对于底层的硬件控制, DSP/BIOS可视化编程工具又显得极为抽象难懂, 相较于此二者, C语言适当平衡了二者的优缺点。首先, 它作为一种高级语言, 以其自上而下的模块化设计原则发挥了可移植性强、易读懂的优势, 其次, 它可以取代汇编语言的硬件控制能力, 极细致地改写硬件寄存器数值。

本文以TI公司生产的TMS320VC33为例, 介绍C语言开发下的DSP嵌入式系统在TI公司提供的与DSP芯片相匹配的软件集成开发环境Code Composer下的研发技术情况。

对TMS320VC33芯片的C语言开发, 主要从以下几个步骤来实现:

(1) 编辑C语言源程序。

在Code Composer环境下, 新建一个CSRJ.MAK工程, 然后再新建一个以C语言源程序为内容的C源代码文件CSRJ.C以及一个程序设计时对TMS320VC33寄存器定义的头文件VC33.H, 并将这两个文件添加到CSRJ.MAK工程。

(2) 编译和链接。

Code Composer环境下的汇编器及编译器建立的公共目标文件格式COFF极易于实行模块化编程, 而且提高了编写程序的可读性及可移植性, 使代码段以及存储器的管理更加灵活而有力, 也提高了C语言程序编写的便捷性。公共目标文件格式中最小单位段在COFF目标文件中是及其重要的, 它在存储器中占据着连续空间的数据块或代码。而链接器对段的处理主要是将公共目标文件中建立起的数据块以及程序块组合成可以被DSP芯片执行的COFF输出模块以及为每一个输出块指定存储地址。以下是—个TMS320VC33芯片的被命名为CSRJ.CMD的典型CMD文件:

(3) 在线仿真。

连接仿真器与目标板。打开Option菜单下的Program Load选项, 将所有选项全选, 若要编译或载入链接生成的CSRJ.OUT文件, 单击界面上Rebuild All按钮即可, 而单击界面上的Run按钮, 则为仿真运行。

(4) 固化程序。

TMS320VC33芯片要存储固化程序, 通常是外挂FLASH或EPROM, 也就是说, 固化程序前要按照外挂的具体要求, 把CSRJ.OUT文件转换为相应的格式, 然后将其写入FLASH或EPROM。

4 DPS系统发展趋势

首先, 目前生产的DSP主要基于精简指令集 (RISC) 结构, 具有功耗低性能高并且尺寸小的优点, 将MPU核、DSP核、专用处理单元以及外围电路单元并存储单元汇集在一个芯片上, 向着集成DSP方向发展是未来DSP系统的一个发展趋势;其次, 会在高性能处理器占主要地位的为单指令多数据流 (SIMD) 和多通道结构、超长指令字结构 (VLIM) 、多流水标量结构以及可并行的超级哈佛结构;并且, 为使DSP系统在各个生产、生活领域更方便应用, 进一步降低功耗和尺寸, 提高速率及性能, 尤其是便携式手持系统方面的应用, 更应在保证性能的基础上注重减小尺寸;最后, 可与可编程器件形结合, DSP系统在实际应用时经常需要借助其他器件, 比起单独的DSP系统应用, 能够更好地提高工作速率。

5结语

综上所述, 数字信号处理 (DSP) 系统在科学技术与社会经济发展中起着不可替代的作用, DSP处理器不仅速率快、性能高, 而且功耗低、尺寸小, 被许多高新技术产业广泛认可并大规模投入应用。而相较于汇编语言编写的DSP应用程序, 用高级C语言研发的DSP嵌入式系统可移植性高、可读性强, 并且易于修改及维护。因此, 以高级C语言编写的DSP应用程序有很大的可开发性, 是以后DSP系统的重要发展方向, 对高新技术产业乃至于整个国民经济建设的发展有极大的促进作用。

摘要:嵌入式系统已随着芯片制造技术的发展在计算机应用领域占有一席之地, 并成为计算机领域的一个重要的发展方向。当前, 很多嵌入式系统的开发都是以数字信号处理器 (DSP) 为核心研发DSP嵌入式系统。而用汇编语言研发DSP系统存在着一些如开发难度大、周期长及维护性极差等问题, 但若是用高级语言C语言编写的DSP应用程序, 有很高的可读性和可移植性, 并且易于维护及修改。从DSP嵌入式系统的发展现状、应用情况、研发技术以及发展趋势等方面对C语言开发下的DSP嵌入式系统进行了论述。

关键词:C语言,DSP,嵌入系统

参考文献

[1]周华.DSP嵌入式系统下的C语言开发[J].中国高新技术企业, 2010 (8) .

[2]李从宇, 王宝光.嵌入式DSP系统C语言硬件编程技术[J].测控技术, 2007 (4) .

[3]苏延川.基于ADSP-TS101的嵌入式系统混合编程及优化方法[J].现代电子技术, 2009 (20) .

[4]胡世锋, 张海涛.用C语言实现DSP程序设计的新方法[J].河北北方学院学报, 2009 (3) .

[5]张晓林, 路程, 崔迎炜.DSP技术的应用现状和发展[J].测控技术, 2004 (21) .

[6]顾颖.浅谈如何借鉴MISRA规范减少DSP程序设计的隐患[J].信息化研究, 2009 (10) .

[7]常丹华, 贺树猛.基于DSP的嵌入式视频监测系统的设计与实现[J].电子技术, 2009 (3) .

[8]肖宛昂, 曾为民.如何用C语言开发DSP嵌入式系统[J].单片机与嵌入式系统应用, 2003 (1) .

上一篇:和火有关的神话故事下一篇:怎样用黯然失色造句

本站热搜

    相关推荐