dsp的c语言编程

2024-10-13

dsp的c语言编程(精选8篇)

1.dsp的c语言编程 篇一

第12讲C语言的常用语法小结

1、标识符

由字母、数字和下划线组成。标识符必须以字母或下划线开头。大、小写的字母分别认为是两个不同的字符。不同的系统对标识符的字符数有不同的规定,一般允许7个字符。

2、注释

“/*”和“*/”必须成对出现; 注释不能嵌套;

注释可出现在程序的任何位置。

3、常量

整型常量十进制常数(八进制常数、十六进制常数、长整型常数); 字符常量(用单引号括起来的字符); 字符串常量(用双引号括起来的字符序列); 浮点型常量(小数形式、指数形式)。

4、表达式

算术表达式(整型表达式、实型表达式);

逻辑表达式(用逻辑运算符连接的整型量,结果为一个整数0或1,逻辑表达式可以认为是整型表达式的一种特殊形式); 字位表达式;

强制类型转换表达式(用“类型”运算符使表达式的类型进行强制转换); 逗号表达式;

赋值表达式(将赋值号“=”右侧表达式的值赋给赋值号左边的变量); 条件表达式;

指针表达式(对指针类型的数据进行运算)。

5、数据定义

对程序中用到的所有变量都需要进行定义。对数据定义其类型,需要时要指定其存储类别。类型标识符可用:int、short、long、unsigned、char、float、double、struct 结构体名、union 共用体名等;存储类别可用:auto、static、register、extern(如不指定存储类别,作auto处理)。注意:外部数据定义只能用extern或static,而不能用auto或register。

6、函数定义

形式为:存储类别 数据类型 函数名(形参表列);形参说明;函数体。

函数的存储类别只能用extern或static。函数体是用花括弧括起来的,可包括数据定义和语句。

7、变量的初始化

可以在定义时对变量或数组指定初始值;静态变量或外部变量如未初始化,系统自动使其初值为零(对数值型变量)或空(对字符型数据);对自动变量或寄存器变量,若未初始化,则其初值为一不可预测的数据;只有静态或外部数组才能初始化。

2.dsp的c语言编程 篇二

数字滤波器是数字信号处理的重要环节,其实质是用有限精度算法实现的离散时间线性时不变系统,从而完成对信号进行滤波处理的功能。具有可靠性好、精度高和灵活性大等优点,广泛应用于语音、图像处理、HDTV、模式识别和频谱分析等方面[1]。数字滤波器根据其单位冲激响应函数的时域特性可分为2类:无限冲激响应( IIR)滤波器和有限冲激响应(FIR)滤波器。FIR滤波器是有限长单位冲激响应滤波器,在结构上是非递归型的。它可以在幅度特性随意设计的同时,保证精确严格的线性相位,广泛应用于数字信号处理[2]。

1 FIR数字滤波器的结构

设h(n),n=0,1,2…N-1为滤波器的冲激响应,输入信号为x(n),则FIR滤波器就是要实现下列差分方程[2,3]:

undefined。 (1)

式中,y(n)为输出信号,即经过滤波之后的信号;N为滤波器阶数。FIR滤波器的最主要特点是没有反馈回路,因此是无条件稳定系统,其单位脉冲响应h(n)是一个有限长序列。由式(1)可见,FIR滤波算法实际上是一种乘法累加运算,不断地输入样本x(n),经延时(z-1)做乘法累加,再输出滤波结果y(n)。对式(1)进行Z变换,整理后可得FIR滤波器的传递函数为:

undefined。 (2)

FIR滤波器的一般结构如图1所示。

2 FIR滤波器的C语言算法实现

由上述分析可知,FIR滤波器的算法实际上是一个乘累加运算。在这个乘累加运算中,主要涉及到3个要素:输入信号x(n)、冲击响应即滤波器系数h(n)和输出信号y(n)。其中,x(n)和h(n)为已知,y(n)为待求。

2.1 输入信号x(n)的获取

假设输入信号是频率为1 000 Hz和2 500 Hz的正弦波合成的波形,希望得到输入信号的256个抽样点,为了与整个系统保持一致,抽样频率fs规定为8 000 Hz。利用C语言得到256个点的输入信号的源代码如下:

代码说明:由于TMS320VC5402 DSP是一款定点的16位DSP芯片,在定点DSP中,表示数字要用Q表示法[4]。根据本算法中数字的大小范围选用Q15格式。

2.2 滤波器系数h(n)的获取

设计一个FIR低通滤波器,其截止频率fc=1 500 Hz,抽样频率fs=8 000 Hz,阶数N=17,选择Hamming窗。利用MATLAB软件设计滤波器方法有很多,可以采用FDATool滤波器设计分析工具箱和SPTool 信号处理工具[5],还可以直接编程实现,在此采用编程实现,代码如下:

h=fir1(16,1500/8000*2);

得到17个滤波器系数转化成Q15格式,即分别乘以32768(215),转化成Q15格式的滤波器系数如下:

h[]={0,158,263,-290,-1406,-951,3186,9287,12272,

9287,3186,-951,-1406,-290,263,158,0}。

理论上,上述输入信号(频率为1 000 Hz和2 500 Hz的正弦波合成的波形)经过此低通滤波器滤波后的输出信号应该为频率为1 000 Hz的正弦波。

2.3 在CCS上调试FIR滤波器算法[6]

CCS是TI推出的用于开发其DSP芯片的继承开发调试工具,集编辑、编译、链接、软件仿真、硬件调试及实时跟踪等功能于一体,极大地方便了DSP程序的设计与开发,此外还提供图形显示功能,方便用户观察特定地址的波形。

在CCS中实现FIR低通滤波器的C语言算法的主要代码如下:

此外,还需向工程中添加vector.asm、fir.cmd和rts.lib文件。其中rts.lib文件是TI提供的运行时支持库,如果是C代码写的源程序,必须要包含该库,该库由TI公司做好放在CCS的cgtoolslib中,源代码TI网站可以下载。

2.4 仿真波形及结果分析

采用CCS的图形显示功能,分别观察输入信号x(n)、输出信号y(n)的时域波形和频域波形,输入信号波形如图2所示。

图2中有2个冲激,分别对应的频率为1 000 Hz和2 500 Hz,由此可以看出输入信号是频率分别为1 000 Hz和2 500 Hz的2个正弦波的叠加。这里设计的FIR低通滤波器截止频率为1 500 Hz,理论上,上述输入信号如果通过此滤波器将会滤除其高频分量,而只保留低频分量。输出信号波形如图3所示。

图3(a)为输出信号的时域波形,是一正弦波;图2(b)为输出信号的频域波形,为一冲激,频率为1 000Hz,由此可以看出输出信号是一频率为1 000Hz的正弦波,此FIR低通滤波器实现了其滤波功能,将高频分量2 500Hz的正弦波滤掉了,保留了频率为1 000Hz的正弦波,与理论上一致。

3 结束语

采用C语言算法在DSP平台上实现了FIR低通数字滤波器,并且通过仿真波形说明了此算法的正确性和高效性。C语言算法相比于汇编算法可移植性很强。这里是在TMS320VC5402 DSP为平台编写的C语言算法,此算法可以稍加改动用在其他DSP芯片上,而汇编算法则不然。

参考文献

[1]李娟.MATLAB平台下的FIR数字滤波器设计与分析[J].Journal of Science of Teachers′College and University,2010,30(3):64-67.

[2]赵顺珍,马英.基于DSP的FIR数字滤波器设计与实现[J].微计算机信息,2009,25(2):162-163.

[3]丁玉美.数字信号处理[M].西安:西安电子科技大学出版社,2001.

[4]乔瑞萍.TMS320C54X DSP原理及应用[M].西安:西安电子科技大学出版社,2005.

[5]张化光.MATLAB/SIMULINK实用教程[M].北京:人民邮电出版社,2009.

3.探析基于C语言的DSP程序设计 篇三

【关键词】C语言 程序设计 DSP程序 移植性

【中图分类号】TP311.1 【文献标识码】A 【文章编号】2095-3089(2013)12-0242-01

传统的汇编语言依赖于计算机硬件,程序的可读性和可移植性较差,其适用性面临着很大的挑战,目前急需要进行相应的改变。一般的高级语言具有很好的可移植性,其可以很好的利用函数库进行编辑,这就给了DSP程序编辑机会,发展机遇C语言的DSP程序编辑成为了DSP的发展方向。C / C + +语言,作为一种高级语言,能够访问物理地址和位置操作,可以直接操作硬件,适合DSP开发语言。

一、C语言的结构

C语言是需要按照其特定的结构进行编辑,才能够完美运行的。最基本的C语言包括:其一,C语言的入口,即main()函数的C语言源文件(.C);其二,链接命令文件,该文件包含一个DSP和目标板存储空间和定义的代码和数据段,其主要职能是决定如何存储空间分配等问题;其三,运行文件库,这里提供了C语言编辑的环境、标准库函数等。DSP的C语言编程基础上的一般过程是:中断模块的第一个指令设置为“B_c_int00”, rts2xx控制。自由_c_int00 必须做为C运行时环境的入口点,在上面c_int00()函数来完成初始化堆栈指针和全局变量的初始化操作,然后调用main()函数,将控制的功能,从而为应用程序执行。

二、C程序中部分CMD文件以及在程序中的具体应用

C语言程序编程环境与汇编语言编辑类似,编辑器对编译后的程序也会进行哎能够与的初始化操作,产生相应的初始化和未初始化段,在TMS320C2xx的C/C++编译器会产生以下几种初始化段和为初始化段:首先,初始化部分一般包括数据表或可执行代码,编辑生成的初始化部分汇编语言是相似的,只是名称不同,主要有:文本段。,cinit段落、常量、开关部分,这几个初始化部分内容:可执行代码分别和常量,初始化和固定数量的表,字符串常量和明显的初始化定义的全局和静态变量和初始化,switch语句列表。其次,未初始化的部分,其主要用途是空间保留为目的,保证程序的运行,也类似于汇编语言,只是名字改变,主要有:BSS,。Ebss部分、堆栈,sysmem段落、Esysmem节,这几未初始化的全局变量和静态变量分别为:保留存储空间,远到修改全局和静态变量的存储空间,保留通过堆栈可以传递参数到函数或局部变量分配空间,让空间动态内存分配,离开空间远修改动态内存分配(函数调用malloc(),()或者calloc realloc())。下面是利用C语言中断服务程序的实例:

.ref_e_into,_sehedulerTimer_ISR,wd—disable,—nothing

.seet“veetors,,

rset:Bwd_disable;OOhreset

intl:B—nothing;OZhINTI

intZ:B—nothing;O4hINTZ

int3:B—sehedulerTimer—ISR;O6hINT3

int4:B—nothing;OshINT4

ints:B—nothing;OAhINTS

int6:B—nothing;OChINT6

中断服务程序MW—e24xx—csl·C:

interruptvoidnothing(void)

{

三、C编程的其他问题

(一)关键字

DSP的C语言编辑器同样支持关键字、主包下面的四个关键词:其一,const关键字,它的主要功能是限制不能改变变量和数组。其二,volatile关键字,主要是起到修饰的效果,使用的关键变量,被访问的时候,不涉及原因变量存储更改,同时使用关键字可以使变量更快的阅读。其三,crgister关键字,这中关键字是一种调用高级语言的关键字,其可以使用高级语言直接进行DSP控制寄存器的访问,但是前提条件是此关键字修饰的对象需要符合寄存器的命名规则,不然会产生错误。crgister修饰不可以使用在函数的内容,仅仅对整型、指针变量进行crgister修饰,结构性的不能使用,否则程序报错。其四,中断关键字,是一种中断程序中,为一个特定的函数使用修改,使得程序中断,程序在运行时,这个函数的调用,自动返回中断,可以有效地保护寄存器。但是使用中断修改函数的入口就是必须使用空类型,同时,返回值也需要空类型,这样才可以正确的操作。

(二)C运行支持库

C运行库是支持C语言运行的基础,其中主要是库函数,通过使用库函数来完成相应的程序编辑器。C运行库支持库文件位于\C2000\cgtools\lib,其中包括支持C语言库函数和相应的运行操作功能和程序入口等。如果用户需要对运行支持库中的相关文件进行修改,需要利用归档器和建库器,对C语言的支持库进行相关的操作,没有过硬的技术,一般不需要进行更改,以免产生程序错误。

四、结语

程序是计算机操作上的基础,经过多年的发展,DSP已经经历了机器语言程序设计、汇编语言,如低级语言,那么当前转变逐步向高级语言C语言。C语言进行程序设计,其可移植性高,并且操作相对简单,将成为以后程序编程的主要语言。C语言的操作遵循相应的程序的原理,基于C语言的DSP编程,需要遵守C语言的相关原则,只有这样进行编程,才能保证编辑程序的正确运行。

参考文献:

[1]冯家旺.计算机程序设计的要点与规范分析[J].计算机光盘软件与应用,2013(04).

[2]王玮,万隆.DSP原理与实例应用[M].北京:清华大学出版社,2011(06).

[3]王西美.Java语言与C语言代码运行效率的比较[J].计算机光盘软件与应用,2013(06).

4.实验三_LINUX的C语言编程 篇四

要求:

1、请查阅资料,掌握vi编辑器的基本使用,包括两种不同模式的区别,如何在两种模式之间切换,以及常用的编辑命令等;

2、使用vi编写一个c程序,要求该程序通过命令行接收用户的输入,其输入参数为FreeBSD系统中的任意文本文件,接收输入后,c程序读取该文件内容,并打印在屏幕上。编辑好后,存为.c文件(如a.c),使用gcc编译该文件,运行结果文件。

3、详细记录学习的内容和实验的整个过程,包括用到的vi命令,c程序源代码,gcc命令,以及执行结果文件的命令等;

4、对整个实验过程进行分析总结,给出详细步骤;

一:vi编辑器的使用

vi 的两种命令模式;

Command(命令)模式,用于输入命令; Insert(插入)模式,用于插入文本;

Visual(可视)模式,用于视化的的高亮并选定正文;

Command 模式是vi或vim的默认模式,如果我们处于其它命令模式时,要通过ESC键切换过来。

当我们按ESC键后,接着再输入:号时,vi会在屏幕的最下方等待我们输入命令; 文件的保存和退出 :w 保存;

:w filename 另存为filename; :wq!保存退出;

:wq!filename 注:以filename为文件名保存后退出; :q!不保存退出;

:x 应该是保存并退出,功能和:wq!相同 光标移动

j 向下移动一行; k 向上移动一行; h 向左移动一个字符; l 向右移动一个字符;

插入模式(文本的插入)i 在光标之前插入; a 在光标之后插入;

I 在光标所在行的行首插入; A 在光标所在行的行末插入;

o 在光标所在的行的上面插入一行; O 在光标所在的行的下面插入一行;

s 删除光标后的一个字符,然后进入插入模式; S 删除光标所在的行,然后进入插入模式; 文本内容的删除操作 x 一个字符;

#x 删除几个字符,#表示数字,比如3x; dw 删除一个单词;

#dw 删除几个单词,#用数字表示,比如3dw表示删除三个单词; dd 删除一行;

#dd 删除多个行,#代表数字,比如3dd 表示删除光标行及光标的下两行; 恢复修改及恢复删除操作; u 撤消修改或删除操作;

查找

/SEARCH 注:正向查找,按n键把光标移动到下一个符合条件的地方; ?SEARCH 注:反向查找,按shift+n 键,把光标移动到下一个符合条件的 替换

:s /SEARCH/REPLACE/g 注:把当前光标所处的行中的SEARCH单词,替换成REPLACE,并把所有SEARCH高亮显示;

:%s /SEARCH/REPLACE 注:把文档中所有SEARCH替换成REPLACE;

:#,# s /SEARCH/REPLACE/g 注:#号表示数字,表示从多少行到多少行,把SEARCH替换成REPLACE;

二:编写程序和编译程序

先在home文件夹下建立test文件夹,用于自己的程序开发。

根据题目要求编写相应程序:

编写完程序后保存。

使用gcc命令编译时发现如下问题:

后来上网查找后发现FreeBSD默认不再使用GCC构建,使用Clang/LIVM替代GCC作为默认的C/C++编译器。

于是使用clang命令进行编译如下:

得到输出文件后,再新建一个test.txt文件用于测试。然后执行可执行文件:./a.out

由上可以看出,在执行编译命令后我并没有指定输出文件的类型和名称,a.out为默认输出的名称和类型,可以使用clang a.c –o test来生成不同类型和名称的输出文件。另外看到提示是输入文件的路径,如果是当前文件下的文件,则可以只输入文件的相对路径,如果在别的文件夹下则需要输入文件的绝对路径。如使用#cp /home/test/test.txt /home/test2.txt复制一个文件到别的目录后读取。测试如下:

三:程序源代码

#include int main(){ FILE *file;//定义文件指针

char path[20];//文件路径字符串

char msg[100];//读入数据缓存区

printf(“please enter the path of your filern”);//输出提示

scanf(“%s”,path);//获取文件路径

file = fopen(path);//打开文件

while(fgets(msg,sizeof(masg)-1,file)!=NULL)//逐行读取文件 直到文件末 { printf(“%s”,msg);//输出读取到的文件内容 } fclose(file);//关闭文件 return 0;//返回 } 四:实验总结和分析

本次实验首次使用vi编辑器编写了一段代码,并成功的编译并运行。首先说一下vi编辑器的使用感受,和window不太一样,它有不同的模式,只有在特定的模式下才能执行相应的命令或者操作。而且我发现了另一个很好用的ee编辑器,使用这个编辑器可以很方便的进行文件的操作,主要是它有很丰富的提示。但是为什么vi编辑器是大家常谈的呢?主要是vi编辑器体积小巧,功能强大,虽然在大的系统工程方面不太好用,但是正常的使用来说还是足够的,几乎所有的类似操作系统都会装有这一编辑器,学会vi编辑器的使用可以使自己在没有别的编辑器的情况下还能进行文件的编辑和系统的配置。这样对于日后的开发有很大的好处。另外在发现FreeBSD中没有安装gcc时,我尝试过给器安装一个gcc编辑器,但是却失败了,截图如下(图1),希望通过后面的学习安装上去。

图1:安装gcc编译器失败

5.C语言的一些题目 篇五

感觉自己不会的东西越来越多,面对计算机的时间也越来越长,眼睛现在已经有点模糊了,

希望自己能对得起自己的这份努力,加油,加油,加油!

____________________________________________________________

1.下面的程序输出结果是多少?

#include

int main()

{

int x=2,y,z;

x *=(y = z = 5);printf(“%d ”,x);//10 后面表达式的结果是5

z = 3;

x ==(y = z); printf(”%d ”,x);//10 只是判断,没有给x赋值

x =(y == z); printf(“%d ”,x);//1

x = (y&z); printf(”%d ”,x);//3 位与操作

x = (y&&z); printf(“%d ”,x);//1

y = 4;

x = (y | z); printf(”%d ”,x);//7 位或操作

x = (y || z); printf(“%d ”,x);//1

return 0;

}

____________________________________________________________

2.下面的程序输出结果是多少?

#include

main()

{

int b = 3;

int arr[] = {6,7,8,9,10};

int *ptr = arr;

*(ptr++)+=123;// arr[0]变成129,ptr指向arr[1]

printf(”%d,%d “,*ptr,*(++ptr));

}

/*这种题目是很有争议的,在vc和Linux的gcc编译器下输出的结果都是8,8,

但是在我的Mac系统下的gcc输出的结果却是7,8。在vc下的printf函数解释是从右到左,

靠堆栈传递,所以*(++ptr)先进入堆栈,然后*ptr进入,具体的我也解释不太清,坐等高人解答

*/

____________________________________________________________

3.下面的程序输出结果是多少?

#include

int main()

{

unsigned char a = 0xa5;//a中装着一个16进制数 二进制为:1010 0101

unsigned char b = ~a>>4;//a参与运算,自动转换为int,b的结果二进制为

//1111 0101

printf(”a = %d “,a);//a的十进制为165

printf(”b = %d “,b);//b的十进制为245

return 0;

}

____________________________________________________________

4.下面程序的结果是多少?

#include

int main()

{

unsigned int a = 0xCCCCCCF7;

unsigned char i = (unsigned char)a; //i中装着a的后两位,也就是F7

char* b = (char*)&a;//b指向a

printf(”%08x,%08x“,i,*b);//16进制输出,000000F7 ,FFFFFFF7

return 0;

}

//这道题目也很有趣,普通的变量进入printf,补位的时候补0;

//然而指针变量补位的时候补的是F,

____________________________________________________________

5.用一个表达式,判断一个数X是否是2n次方(2,4,8,16…),不可用循环语句。

?

1

(x & (x-1) == 0) ? printf(”yes “) : printf(”yes “)

运用位操作,2^n次方数的二进制只有1位是1,运用一个表达式就可以判断。

____________________________________________________________

6.下面程序的结果是多少?

#include

main()

{

int count = 0;

int m = 9999;

while(m)

{

count++;

m = m&(m-1);

}

printf(”%d “,count);//8,进两次循环m的二进制去掉一位

}

____________________________________________________________

7.如何将a和b的值进行交换,并且不使用任何中间变量。

a = a + b;

b = a - b;

a = a - b;

//还有更快的位操作版本:

a = a ^ b;

b = b ^ a;

a = a ^ b;

____________________________________________________________

8.编写一个函数,要求输入年、月、日、时、分、秒,输出该时间的下一秒。

如输入12月31日23时59分59秒,则输出1月1日0时0分0秒。

就是单纯的判断,在这里就不赘述了

____________________________________________________________

9.编写一个函数,实现把C/C++程序代码中的注释去掉,并把结果返回。A.c---b.c

比较有难度的一道题,另写一篇博文解释。

____________________________________________________________

10.一个5位数字ABCDE*4 = EDCBA,这5个数字不重复,请编程求出来这个数是多少?

五个变量,五个循环加一个判断就可以。

____________________________________________________________

11.用预处理指令#define声明一个常数,用以表示1年中有多少秒(忽略闰年)。

#define S (365*24*60*60)

____________________________________________________________

12.编写一个”标准“宏MIN,这个宏输入两个参数并返回其中较小的一个。

6.dsp的c语言编程 篇六

学习C语言不是一朝一夕的事情,但也不需要花费十年时间才能精通。如何以最小的代价学习并精通C语言是本文的主题。请注意,即使是“最小的代价”,也绝不是什么捷径,而是以最短的时间取得最多的收获,同时也意味着你需要经历艰苦的过程。

一、要读就读好书,否则不如不读

所有初学者面临的第一个问题便是:如何选择教材。好的开始是成功的一半,选择一本优秀的教材是事半功倍的关键因素。不幸的是,学校通常会帮你指定一本很差劲的C语言课本;而幸运的是,你还可以再次选择。

大名鼎鼎的谭浩强教授出了一本《C语言程序设计》,据说发行量有超过400万,据我所知,很多学校都会推荐这本书作为C语言课本。虽然本人的名字(谭浩宇)跟教授仅仅一字之差,但我是无比坚定地黑他这本书的。这本书不是写给计算机专业的学生的,而是给那些需要考计算机等级考试的其它专业学生看的。这本书的主要缺点是:例子程序非常不专业,不能教给你程序设计应该掌握的思考方式;程序风格相当地不好,会让你养成乱写代码的恶习;错误太多,曾经有人指出过这本书的上百个错误,其中不乏关键的概念性错误。好了,这本书我也不想说太多了,有兴趣大家可以百度一下:)

Kernighan和Ritchie的《The C Programming Language》(中译名《C程序设计语言》)堪称经典中的经典,不过旧版的很多内容都已过时,和现在的标准C语言相去甚远,大家一定要看最新的版本,否则不如不看。另外,即使是最经典最权威的书,也没有办法面面俱到,所以手边常备一本《C语言参考手册》是十分必要的。《C语言参考手册》就是《C Reference Manual》,是C语言标准的详细描述,包括绝大多数C标准库函数的细节,算得上是最好的标准C语言的工具书。顺便提一句,最新的《C程序设计语言》是根据C89标准修订的,而《C语言参考手册》描述的是C99标准,二者可能会有些出入,建议按照C99标准学习。还有一本《C和指针》,写得也是相当地不错,英文名是《Pointers on C》,特别地强调指针的重要性,算是本书的一个特点吧。不过这本书并不十分适合初学者,如果你曾经学过C语言,有那么一些C语言的基础但又不是很扎实,那么你可以尝试一下这本书。我相信,只要你理解了指针,C语言便不再神秘。

如果你已经啃完了一本C语言教材,想要更进一步,那么有两本书你一定要看。首先是《C Traps and Pitfalls》(中译名《C陷井与缺陷》),很薄的一本小册子,内容非常非常地有趣。要注意一点,这本书是二十多年前写成的,里面提到的很多C语言的缺陷都已被改进,不过能够了解一些历史也不是什么坏事。然后你可以挑战一下《Expert C Programming》(中译名《C专家编程》),书如其名,这本书颇具难度,一旦你仔细读完并能透彻理解,你便可以放心大胆地在简历上写“精通C语言”了。

切记一个原则,不要读自己目前还看不懂的书,那是浪费生命。如果你看不懂,那你一定是缺失了某些必需基础知识。此时,你要仔细分析自己需要补充哪些内容,然后再去书店寻找讲述的这些内容的书籍。把基础知识补充完毕再回头来学习,才会真正的事半功倍。

二、Unix/Linux还是Windows,这是个很大的问题

不同的编程环境会造就出不同思维的程序员。Windows的程序员大多依赖集成开发环境,比如Visual Studio,而Unix程序员更加钟爱Makefile与控制台。显而易见,集成开发环境更容易上手,在Windows上学习C语言,只需要会按几个基本的Visutal C++工具栏按钮就可以开始写Hello, World!了,而在Unix下,你需要一些控制台操作的基本知识。有人也许认为Unix的环境更简洁,但习惯的力量是很大的,大家都很熟悉Windows的基本操作,而为了学习C语言去专门装一个Unix系统,似乎有点不划算。

对于一个只懂得Windows基本操作、连DOS是什么都不知道的新手而言,尽快做一些有趣而有意义的事情才是最重要的。用C语言写一个小程序远比学习ls、cat等命令有趣,况且我们要专注于C语言本身,就不得不暂时忽略一些东西,比如编译链接的过程、Makefile的写法等等等等。

所以我建议初学者应该以Visual C++ 6.0(不是VisualC++.NET)或者Dev C++作为主要的学习环境,而且千万不要在IDE的使用技巧上过多纠缠,因为今后你一定要转向Unix环境的。Visual C++ 6.0使用很方便,调试也很直观,但其默认的编译器对C标准的支持并不好,而Dev C++使用gcc编译器,对C99的标准都支持良好。使用顺带提一下,很多大学的C语言课程还在使用Turbo C 2.0作为实验环境,这是相当不可取的,原因其一是TC 2.0对C标准几乎没有支持,其二是TC 2.0编译得到的程序是16位的,这对今后理解32位的程序会造成极大的困扰(当然,用djgpp之类的东西可以使TC 2.0编译出32位程序,不过那过于复杂了)。

等你学完一本C语言的教材,你一定要转向Unix平台继续学习,几乎所有的C语言高级教程都是基于Unix平台的(比如《C专家编程》)。转变的过程是痛苦的,你需要面对的是各种纷繁复杂的命令,完全不同于Windows平台的思考方式,但是这种痛苦是值得的。Unix与C是共生的,Unix的思考方式和习惯更加符合C语言的思考方式和习惯。在Unix下,你可以找到无数优秀的源代码供你尽情阅读,你可以方便地查看某个库函数的联机手册,还可以看到最优秀的代码风格

归结起来就是一句话:初学C语言,建议使用Windows系统和集成开发环境,在准备向“高手”方向努力时,请先转向Unix平台。

三、万事俱备,你就是东风

书已选定,环境配置完成,正所谓万事俱备,只欠你自己的努力了。请从书的前言开始,仔细地阅读手头的教材,很多人看书喜欢直接从第一章开始看,这是错误的做法。前言是作者对整本书的大体介绍,作者一般会告诉你需要什么基础才能够顺利阅读本书,这可以帮助你检验自己的基础知识是否已经具备。看完前言,还要浏览一下目录,了解一下书的整体结构,顺便给自己安排一下学习计划。

学习C语言,必需注意每一个细节,书上的例子代码一定要自己亲自敲一遍,编译执行输出都跟书上说的一致才能算是学完了一个例子,如果不一致,就要仔细找原因。出了书本上有的例子,自己还要“创造”一些例子,比如学习运算符优先级的时候,可以写几个相同的表达式,在不同的位置加上括号,看看有哪些不同的行为,比如*p++和(*p)++,又比如a = b == c、(a = b)== c和a =(b == c)等等。自己抄的书上的例子以及改造之后的例子,还有自己“创造”的例子,都应该仔细地归类保存,并且要在源代码中写上简短的注释,阐述这个例子的意图。

例子之后就是习题了,我建议初学者把所有的习题都独立做一遍,然后对照答案的代码,看看自己的代码有那些不足,再试着修改自己的代码。很多人不重视习题,这是极大的错误,因为作者通常会在习题中说明一些重要的道理,而不是单纯地检验前面的知识。

也许你认为这样学习太慢,其实不然。学得细致就不用走回头路,等你学到后面才发现自己前面没搞清楚,那才是真的得不偿失。一般说来,整本书读完,你应该完成数千行乃至上万行的代码,无论是原封不动照抄书上的,还是自己心血来潮写就的,都是今后继续学习的一笔财富。以我自己举例,阅读《Windows核心编程》时(我只阅读了3/4的内容),除了抄书上的代码,还自己写了很多例子,一共有5574行(用unix下的wc工具统计),时隔多日,我早已记不清Windows的系统编程了,但只要花几分钟翻出以前的代码看看,便会重新了然于胸。所谓好记性不如烂笔头,就是这个道理。

仔细读书、认真抄写源代码、独立完成习题外加更进一步的实验,最后将所有的代码留下,成为自己的经验和财富,绝对的辛苦,也绝对的事半功倍。当然,这种方式只适合学习需要精通的技术,如果不是学习C语言,你还要具体情况具体分析。

7.C语言编程技术的分析研究 篇七

1 C语言各类运算与技术分析概述

C语言创始于1967年,其语言非常的复杂,且其不同于人的大脑的思考,需要很多的定义与规则才可以实现真正的运算,得到人们想要的结果,在运算符号上除了一般的加减乘除以外还有判断符号等等,有各种各样的数值类型,并且有指针、地址、字节大小等等各类的名称。在数据类型上分为:整形、字符型、浮点型、指针型等等10余种,还有常量与变量的区分,还引入新的字符串概念,以及一系列的新的关键字,来代表不同的语句,例如:if、do、while等条件语句;char、case、register等数值类型;short、float等字符串长度等等。C语言对于软件发展有很大的贡献,为人们的生活带来更多的便利。

2 混合运算

C语言中一定会有很多的数学运算,而这些包括数值型的数据的输入与处理,例如整数、浮点数等等。在军训混合运算时可能会出现一些问题,例如输入数据溢出可计算范围,或者输入数据不符合程序原定规定时,程序会出现错误,且程序在运算时也会自动的对数值进行数值类型的转换,因此编程时会出现错误,为了将这种情况避免并保证程序的运转的正常,在编程时需要对数值进行定义,并对数据的转换有一定的提前说明与重新定义,因为电脑毕竟不是人类的大脑可以自动进行兑换,因此这就需要在运算时将不同类型的数据转换为同一类型,然后才能够进行正常的运算过程。

在C语言中会有两种情况需要对转换进行定义:其一是在使用者未进行定义时系统进行自动的转换,例如在对6+2.2进行运算时,6为整数,而2.2为浮点数,这在电脑看来是两种完全不一样的数据,无法进行统一的运算,因此电脑会自动地将6变成6.0这样的同数值的数据与2.2进行运算。而另一种情况为用户强制的进行定义,在编程程序中由创作者对其进行定义,例如在对3+2.14进行运算时,用户将2.14定义为只运算整数部分,于是就会编程为3+(int)2.14,这样2.14在电脑看来就是整数2,因此运算的结果为5。

在电脑的运算过程思维中是这样定义的,如果两个运算的符号两端的数值是不同类型的,那么就会先将等号右侧的部分进行先运算,之后结果是按照等号左侧的数值类型进行转换。例如:在signed int m=453333;short n;n=m;此语句中,就是将m的数值先传输给n,但是n在定义时却是short类型,且最高位是符号位,因此n此处变为负数,因此最终n的值为-1。

在C语言中会有很多的规定,因为电脑毕竟不似人脑的灵活,因此需要很多的规则来使得很多中可能不会出现困难与障碍,也使得C语言有更多的运算容纳量,在数据类型上会有很多的先后顺序,在运算上也有先后顺序,有从左至右的,也有从右至左的,学习者应注意其异同点,不要混淆,多加练习才能够熟练掌握。

3 指针运算

指针是C语言中一个较为重要的数据类型,也是在复杂的运算中常常会使用的一种方便的运算类型,且其可以有效地节省编程的空间,但是指针又往往是使用者会使用错误的一种运算方式,且错误的隐蔽性比较强,一般不易检查出来,需要使用者好好地学习与练习才可以掌握的一种较为复杂的运算。

指针运算一般分为动态分配与静态分配两种模式。静态分配主要是指C语言编程时已经确定了存储的空间,例如在对全局变量进行运算时,语句为static char b[size],那么在对于b的数据进行运算时就已经控制了为size大小的空间来储存数据,对于局部变量也是一样的情况,例如语句char c[size],那么在进行对于c局部的变化时,其空间也只有size字节的大小,但是在使用完后,程序会自动的释放局部变量的空间。而动态分配则是在储存的空间大小是不确定的,会根据数值的输入与需要来进行大小的调配,例如语句malloc(size),是指会在库函数中分配size个字节的连续的空间,在调用此空间结束后会返回一个只想分配好的储存的空间的指针,但是需要注意的是在使用完该存储空间后需要使用free()来释放此空间,因为动态分配不会自动的在使用完后将空间释放。

4 程序优化

对于一个程序员来说,C语言的运用是非常灵活的,而初学者可能只是对其能够运行且正确就是目标,但作为一个程序员来说,如何运用最简便的方式,以及最少的空间来完成该结果才是最终目标,而C语言中一些程序的使用可以达到优化程序的目的,下面简要介绍几种:

4.1 Register语句使用

Register语句可以使得变量在操作时不占用存储的空间,因其运算是在CPU的寄存器中操作的,且CPU的运算会比存储内存的运算速度快很多,一般会对一些会重复使用很多遍的变量定义为register变量类型,这样在多次循环中可以使得整个运算变快,但是其数量也要控制,因为CPU中寄存器的数量是有限的,因此把握这个度是程序员需要掌握的经验。

4.2 循环体内优化

循环体是一般复杂程序中不可缺少的一部分,因为会重复进行使用,因此优化循环体内部,会使得内存与运算速度都会有很大的提升,系统在执行一个函数的运算时,都需要保存以及恢复当前的情况,进行一个进栈与出栈的过程,如果循环体中有很多次的调用函数,系统就会有很大的负担,一旦函数较为复杂,那么就会导致系统的瘫痪,因此优化是一个优秀的程序员需要具备的品质,例如可以适当的采用宏定义(#define),其本身不是函数,但却可以用作函数;也可以在多重循环中将最长的循环放在内层,有效地减少CPU跨循环的使用次数,可以加快运算效率。

5 结束语

通过本文的叙述可以看出,C语言可以有效地在许多计算领域提供帮助,复杂的运算或是循环的筛选都可以很快地实现,使得很多的问题都可以有效的借助计算机来实现,大大地增加了效率以及准确度,为人们的生活带来很多的便利,但是C语言编程本身还需要程序员的更多的掌握以及熟练的运用才可以更好的使得C语言为工程以及各种方面的应用带来便利,这个技术需要程序员多积累、多实践才能够真正的掌握,愿在不久的将来,会有更多的优秀程序员为社会的发展作出更多的贡献。

摘要:C语言是一种新型的语言,可能对于我们来说是一种符号的堆积,但是对于电脑来说,就一种命令性的交流,这也是实现人与机器的一种交流与沟通的结果,C语言的灵活运用就可以解决许多的复杂问题,使得更多的复杂的算术以及数学问题得以快速的解决,大大地提高运算的效率以及运算的范围,可以解决生活上许多事情,具有非常好的使用价值,但是语言的严谨性以及复杂性往往会使得使用者出现问题,且语言问题出现后的解决也是复杂的,调试的时间往往会比编程的时间更久,因此下文便主要从这个方面来进行探讨,使得C语言可以变得更为便利。

关键词:C语言,编程技术,分析研究

参考文献

[1]段煅.C语言编程技巧在C语言学习中的应用[J].电脑编程技巧与维护,2010(20).

[2]余勍,王捷.浅谈C语言编程技巧在C语言学习中的应用[J].信息通信,2013(7).

8.dsp的c语言编程 篇八

关键词:MCS-51;C语言;应用;方法

中图分类号:TP311.52文献标识码:A文章编号:1007-9599 (2011) 03-0000-02

MCS-51 Programming Application Based on C Language

Zeng Zhi

(Xianning Vocational Technical College,Xianning437100,China)

Abstract:The machine is a compilation of software source code by compiling into machine code for the MCS-51 microcontroller assembler software early A51,with the development of SCM technology continues to evolve,from assembly language to the increasingly widespread use of advanced language development,SCM Keil development software is constantly evolving software development is the most popular MCS-51 MCU software,the simulator from recent years manufacturers have announced full support for Keil to be seen.

Keywords:MCS-51;C language;Application;Method

一、对MCS-51的介绍

对无论规模大小、性能高低,计算机的硬件系统都是由运算器、储存器、输入设备、输出设备以及控制器等单元组成。在通用计算机中,这些单元被分成若干块独立的芯片,通过集成电路连接而构成一台完整的计算机。这成为当时这一类芯片的典型特征,因此就以Single Chip Microcomputer来称呼这一类芯片,中文译为单片机。

嵌入式计算机系统的应用越来越广泛,给我们的生活和工作带来了极大的影响。单片机是嵌入式计算机系统的CPU,是系统的控制核心。以Intel公司的8051和8052为内核的8位单片机及其衍生产品——MCS-51系列单片机经过了20多年的发展,现在已经有数百种之多,由于其具有成本低、可靠性高、集成度高、易于扩展、处理能力强等优点,在智能仪器仪表、过程控制、机电一体化系统等领域被广泛应用。在8位单片机领域,MCS-51系列单片机多年来都保持非常大的市场占有率。近些年新推出了许多各具特色的RISC单片机,如Microchip公司的PIC系列单片机和Atmel公司的AVR系列单片机等,这些新单片机具有速度高、功耗低、I/O驱动能力强等特点,并且具有一定的模拟信号处理能力,给MCS-51系列单片机带来了很大的冲击。尽管如此,经过诸如Dallas、ADI、Philips、Infineon等许多全球著名半导体公司的努力,MCS-51系列单片机中近些年也推出了许多高性能的产品。如Dallas公司(被Maxim公司收购)的DS89C420单片机采用8052内核,其速度可达50 MIPS;ADI公司的ADμ8xx系列、Maxim公司的MAX7651/52、TI公司的MSC1210、Cygnal公司的C8051Fxxx系列等都是全兼容8051或8052的混合信号单片机,它们都具有相当强的模拟信号处理能力,被称之为“混合信号单片机”。

二、单片机的外部结构

1.P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平)。

2.电源VCC(PIN40)和地线GND(PIN20)。

3.高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位)。

4.内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍)。

5.程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序)。

6.P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1。

三、查表程序设计

数据补偿、修正、计算、转换等各种功能,具有程序简单、执行速度快等优点。查表就是根据自变量x,在表格中寻找y,使y=f(x)。执行查表指令時,发出读程序存储器选通脉冲/PSEN。在MCS-51的指令系统中,给用户提供了两条极为有用的查表指令:(1)MOVC A,@A+DPTR。(2)MOVC A,@A+PC指令“MOVC A,@A+DPTR”完成把A中的内容作为一个无符号数与DPTR中的内容相加,所得结果为某一程序存储单元的地址,然后把该地址单元中的内容送到累加器A中。指令“MOVC A,@A+PC”以PC作为基址寄存器,PC的内容和A的内容作为无符号数,相加后所得的数作为某一程序存储器单元的地址,根据地址取出程序存储器相应单元中的内容送到累加器A中。指令执行完,PC的内容不发生变化,仍指向查表指令的下一条指令。优点在于预处理较少且不影响其它特殊功能寄存器的值,所以不必保护其它特殊功能寄存器的原先值。缺点在于该表格只能存放在这条指令的地址X3X2X1X0以下的00-FFH之中。表格所在的程序空间受到了限制。

四、编程实现

(一)创建一个基于对话框的应用程序

打开VC++6.0集成开发环境,选择菜单项File/New,在出现的对话框中选中Projects标签中的MFC AppWizard(exe),然后在Project Name框中填入MyCOMM(可根据需要命名),之后点OK按钮。在接着出现的对话框中选中Dialog Based项,然后点NEXT按钮。以下的各对话框都按照缺省设置,这样即可生成一个基于对话框的应用程序。在资源编程器中会出现其对话框模板。

(二)子程序的设计

1.子程序设计原则和应注意的问题,一种能完成某一特定任务的程序段。其资源要为所有调用程序共享。因此,子程序在结构上应具有独立性和通用性,在编写子程序时应注意以下问题:(1)子程序的第一条指令的地址称为子程序的入口地址。该指令前必须有标号。(2)主程序调用子程序,两条子程序调用指令:a.绝对调用指令:ACALL addr11。b.长调用指令:LCALL addr16。(3)注意设置堆栈指针和现场保护。(4)最后一条指令必须是RET指令。(5)子程序可以嵌套,即子程序可以调用子程序。(6)在子程序调用时,还要注意参数传递的问题。

2.插入MSCOMM控件,选择菜单项Project/Add to project/Components and Controls…,在弹出的对话框中选择Registered ActiveX Controls文件夹下的Microsoft Communications Control,version6.0,然后按下Insert按钮,接着会弹出一个对话框,提示生成的类名及文件名,按OK按钮即可实现控件的插入。这时在对话框的控件工具栏上会多出一个电话机模样的控件图标,Workspace的Classview中也多了一个类CMSComm。此时即可将MSCOMM控件加入到对话框模板,加入方法与其他控件一样。然后还要在对话框类中相应加入一个成员变量,此处我们将其命名为m_comm。

3.设置属性,可以在两个地方对控件的属性进行设置:(1)对话框资源编辑器中。在对话框模板上,用右键单击MSCOMM控件,然后选择Properties…菜单项,最后便可设置各项属性。此处只对以下几处进行改动,其他接受缺省设置:Rthershold:1,InputLen:1,DTREnable:不选,InputMode:1-Binary。(2)对话框类的OnInitDialog()函数中。

五、在VC++中MSCOMM控件的实现

(一)事件驱动方式

当通信事件发生时,MSCOMM控件会触发OnComm事件,调用者可以捕获该事件,通过检查其CommEvent属性便可确认发生的是哪种事件或错误,从而进行相应的处理。这种方法的优点是响应及时、可靠性高。

(二)查询方式

在程序的每个关键功能之后,可以通过检查CommEvent属性的值来查询事件和错误。如果应用程序较小,这种方法可能更可取。

六、结语

汇编语言在实时性方面具有较大的优越性,虽然使用Keil C51可以在C语言程序中嵌入汇编代码,但是复杂度明显提高。实验证明,只要合理地运用C语言,在延时编程方面就可以达到与汇编语言相近的精度。为了获得精确的时间延迟,可通过Keil C工具的仿真功能,调整延迟量,从而得到较理想的结果。

参考文献:

[1]邵峰.MCS-51单片机地址指针及其应用.安徽科技,2009,5

[2]葛世超.在MCS-51单片机上移植μC/OS-Ⅱ.信息化研究,2010,1

[3]田野.MCS-51单片机在表决系统中的应用.山西电子技术,2010,6

上一篇:变量下一篇:冒险岛4转任务攻略