烽火众智DSP工程师笔试经验
我笔试的是dsp工程师。卷子只有一张纸,正反两页。一共10道题。答案作答在给的空白的纸上。
1.定点dsp芯片和浮点dsp芯片是什么?有什么优缺点?
定点dsp和浮点dsp主要是按dsp工作时的数据格式来区分的。数据以定点格式工作的dsp是定点dsp,数据以浮点格式工作的dsp是浮点dsp。浮点dsp能进行浮点运算,一次完成,由硬件实现。定点dsp无法直接进行浮点运算,完成浮点运算需要借助程序来实现。
优点:浮点dsp比定点dsp 的运算范围要大。浮点dsp 的寻址范围也大些。浮点dsp的精度大些。浮点运算速度大。
缺点:定点dsp需要时刻注意运算的溢出。精度不够,定点dsp运算速度慢。
2.dsp和通用cpu的最大区别是什么?有什么共同点?
(1)首先是体系结构:cpu是冯.诺伊曼结构的,而dsp有分开的代码和数据总线即\哈佛结构\。
(2) 标准化和通用性:cpu的标准化和通用性做得很好,支持操作系统,所以以cpu为核心的系统方便人机交互以及和标准接口设备通信,非常方便而且不需要硬件开发了;但这也使得cpu外设接口电路比较复杂,dsp主要还是用来开发嵌入式的信号处理系统了,不强调人机交互,一般不需要很多通信接口,因此结构也较为简单,便于开发。如果只是着眼于嵌入式应用的话,嵌入式cpu和dsp的区别应该只在于一个偏重控制一个
第 页码 页 / 总页数 总页数 页
偏重运算了。
(3)流水线结构:大多数dsp都拥有流水结构,即每条指令都由片内多个功能单元分别完成取指、译码、取数、执行等步骤,这样可以大大提高系统的执行效率。但流水线的采用也增加了软件设计的难度,要求设计者在程序设计中考虑流水的需要。
快速乘法器:信号处理算法往往大量用到乘加
(multiply-accumulate,mac)运算。dsp有专用的硬件乘法器,它可以在一个时钟周期内完成mac运算。硬件乘法器占用了dsp芯片面积的很大一部分。(与之相反,通用cpu采用一种较慢的、迭代的乘法技术,它可以在多个时钟周期内完成一次乘法运算,但是占用了较少了硅片资源)。 地址发生器:dsp有专用的硬件地址发生单元,这样它可以支持许多信号处理算法所要求的特定数据地址模式。这包括前(后)增(减)、环状数据缓冲的模地址以及fft的比特倒置地址。地址发生器单元与主alu和乘法器并行工作,这就进一步增加了dsp可以在一个时钟周期内可以完成的工作量。
硬件辅助循环:信号处理算法常常需要执行紧密的指令循环。对硬件辅助循环的支持,可以让dsp高效的循环执行代码块而无需让流水线停转或者让软件来测试循环终止条件。
3.占先式系统和非占先式系统有什么区别?dsp/bios 和ucosⅱ是哪一种?
占先式,当前任务运行中如果有优先级更高的任务进入就绪态,当前任务立即将cpu交给优先级更高的任务。
第 页码 页 / 总页数 总页数 页
非占先式:等当前任务执行完后再交给优先级更高的任务。 dsp/bios,ucosii是占先式的操作系统。 4.说一下对dsp map的认识。
map文件是ccs软件编译后产生的有关dsp用到所有程序、数据及io空间的一种映射文件。 一、生成方法
map文件主要有两种生成方法,一种是由系统自动生成,默认文件名为所建立的项目名(如xxx为项目名)加上.map后缀xxx.map,另一种在cmd文件中指定生成map文件,操作方法为在memory指令前面加上\abc.map\,文件名可以任意。 二、文件格式
map文件大概分为文件头、内存配置、段映射、全局符号四部分。内存配置与cmd文件中的memory指令关联,在cmd文件中定义的程序与数据区间定义,在该部分均可以找到对应,与cmd文件不同的时,在map文件中加入了一个实际使用的区间,即在程序中实际用到的空间长度。段映射部分与cmd文件中的section指令关联,在该部分程序中所有的段实际映射的起始地址与实际长度均有详细说明。可以具体到程序中progma指定的段和各个单独文件产生的obj文件。全局符号可以是程序使用的每一个函数、程序中定义的全局变量均可以在此找到对应的起始地址。map文件中采用两种方式列举,一种为按相应地址排列,另一种按全局符号字母排列。
5.简单的程序题。看程序,写出输出见过,用c写的。
第 页码 页 / 总页数 总页数 页
6. -7和10的16位二进制补码是什么? 写出q15 0.25和q15 0.5 ⑴正数的补码 与原码相同。
⑵负数的补码 负数的补码是对其原码逐位取反,但符号位除外;然后整个数加1。
-7转换成二进制原码是1000000000000111,反码是1111111111111000,补码是反码+1=1111111111111001
10的二进制原码是0000000000001010,是正数,补码和原码一样 dsp芯片的数以2的补码形式表示。每个16位数用一个符号位来表示数的正负,0表示数值为正,l则表示数值为负。其余15位表示数值的大小。
如,二进制数0010000000000011b=8195 二进制数1111111111111100b= -4 数的定标有q表示法和s表示法两种。
不同的q所表示的数不仅范围不同,而且精度也不相同。q越大,数值范围越小,但精度越高;
如,16进制数XXh=8192,用q0表示 16进制数XXh=0.25,用q15表示 7.说一下dsp开发的主要步骤。 8.写出strcpy的函数原型。
char* strcpy(char *strdest,const char * strsrc) { }
第 页码 页 / 总页数 总页数 页
9.写出创建单链表的函数。 struct stu_info{ int x;
struct stu_info *next; };
void inputstuinfo(struct stu_info**head,int n) { }
10. 对一个字符串进行重新排列,使字母在前,数字在后,并且字母和数字的相对位置不变。 include include include 函数名:fun
参数: char*s,int *m
函数返回值:chletter(数组chletter[n]的数组名)
局部变量:char chletter[n]; char chnumber[n]; int i,j,k; char *fun(char*s,int *m) { }
第 页码 页 / 总页数 总页数 页