实验一 关于本程序的整体说明: 本程序的目的是利用5402进行处理,在屏幕上显示“hello,world!” 其中使用了 #ifdef FILEIO 来选择是否输入字符串。 流程图如下:
定义了 FILEIO 么? | / \ Y / \ N 输出“hello,world!” 输出“hello,world!” | | 要求输入字符串 OVER | 输出读入字符串大小 | OVER
/* ======= hello.h ========== 头函数 struct PARMS { /*头函数中仅定义了一个结构体 PARMS*/ int Beta; int EchoPower; int ErrorPower; int Ratio; struct PARMS *Link; }; ======================= */ /* ======== hello.c ======== */ #include <stdio.h> #include "hello.h" #define BUFSIZE 30 /*定义BUFSIZE(缓冲空间)为30*/ struct PARMS str = /*全局变量是一个结构体 str*/ { 2934, /*Beta = 2934*/ 9432, /*EchoPower = 9432*/ 213, /*ErrorPower = 213*/ 9432, /*Ratio = 9432*/ &str /*Link 是指向str自己的指针。本程序中并未使用*/ }; /*PARAMS是在hello.h中定义的结构类型*/ /* * ======== main ======== 主函数 */ void main() { #ifdef FILEIO /*第一次运行程序时,FILEIO没有定义,此处不执行,只执行puts()一句。*/ int i; char scanStr[BUFSIZE]; /*输入字符存入scanStr数组中*/ char fileStr[BUFSIZE]; /*存储从文件中读出的内容*/ size_t readSize; /* size_t 是在stdio.h中定义的无符号整型,用来存储输入字符数目*/ FILE fptr; /*FILE是在stdio.h中定义的一结构变量,用来记录控制输入输出流的所有信息,fprt是文件指针*/ #endif /* 向标准输出设备写一字符串*/ puts("hello world!\n");
#ifdef FILEIO /*清除字符型数组*/ for (i = 0; i < BUFSIZE; i++) { scanStr[i] = 0 /* 预置的语法错误(少一个“;”)*/ fileStr[i] = 0; }
/* 从输入设备读入一字符串,并存入scanStr数组中 */ scanf("%s", scanStr);
/*在主机上打开一文件,然后向文件写入刚才的字符串 */ fptr = fopen("file.txt", "w"); fprintf(fptr, "%s", scanStr); fclose(fptr);
/* 在主机打开一文件,然后从中读入字符串 */ fptr = fopen("file.txt", "r"); fseek(fptr, 0L, SEEK_SET); /*SEEK_SET是stdio.h中通过宏定义定义的常量0x0000*/ /*此句如果没有,运行结果不改变,此处为了保证程序的规范(修改方便)*/ readSize = fread(fileStr, sizeof(char), BUFSIZE, fptr); /*获取文件大小,即输入字符数目*/ printf("Read a %d byte char array: %s \n", readSize, fileStr); /*输出“Read a ??(数字) byte char array: ??????(字符串)”*/ fclose(fptr); /*关闭文件*/ #endif }
实验二 /* ======== hello.c ======== */
/* DSP/BIOS 头文件*/ #include <std.h> #include <log.h>
/* 被配置工具创建的对象*/ extern far LOG_Obj trace;
/* ======== main ======== */ Void main() { LOG_printf(&trace, "hello world!"); /*本程序简单,仅有一句话意思很明了了。*/
/* 返回后进入DSP/BIOS闲置循环 */ return; } 实验三
/* ======== volume.h ======== */ #ifndef __VOLUME_H #define __VOLUME_H#ifndef TRUE #define TRUE 1 #endif #define BUFSIZE 0x64 #define FRAMESPERBUFFER 10 #define MINGAIN 1 #define MAXGAIN 10 #define MINCONTROL 0 #define MAXCONTROL 19 #define BASELOAD 1 #endif /* __VOLUME_H */ /*一些宏定义,定义了一些常量*/
#include <stdio.h> #include "volume.h"
/*定义全局变量 */ int inp_buffer[BUFSIZE]; /* 设置输入输出数据缓冲区 inp_buffer 和 out_buffer 大小为 0x64*/ int out_buffer[BUFSIZE]; int gain = MINGAIN; /* 增益设置,MINGAIN代表1,在volume.h中定义的 */ unsigned int processingLoad = BASELOAD; /*BASELOAD大小为1,也是在volume.h中定义的*/ extern void load(unsigned int loadvalue); /*该函数是一个汇编的处理函数,具体分析见后文*/ static int processing(int *input, int *output); static void dataIO(void); /*定义了三个函数load、processing、dataIO*/
/* ======== main ======== */
void main() { int *input = &inp_buffer[0]; /*指针赋初值*/ int *output = &out_buffer[0]; puts("volume example started\n"); /*输出一句话*/ /* 下面是一个无限循环 */ while(TRUE) { /* 使用探测器来连接住机上的文件. */ dataIO(); /*调用dataIO函数,实际上,dataIO是一个空函数。*/ processing(input, output); /*调用processing函数*/ } /*dataIO是一个空函数,实际上主函数完成的是对processing函数的无限次调用。*/ }
/* ======== processing ======== *
对输入信号进行数字信号处理变换. 参数:输入输出缓冲区的地址 */ static int processing(int *input, int *output) /*函数processing*/ { int size = BUFSIZE;
while(size--){ *output++ = *input++ * gain; } /*根据输入信号和gain大小,对输出信号进行赋值*/
/* load辅助程序*/ load(processingLoad);
return(TRUE); }
/* ======== dataIO ======== * 读入输入信号,写输出信号 */ static void dataIO() { return; }
;load函数,是一个保存在load.asm中的汇编函数。这里,就涉及到混编。DSP处理程序的一般形式在这里就看到了。过程的控制,使用C语言,利用高级语言较强的逻辑功能。处理的过程,则使用汇编语言,以提高处理速度,达到实时信号处理的要求。简单介绍一下load函数,这里不讲汇编语言的语言及其格式了,只说明一下这个函数的作用。该函数通过执行N*loadvalue来模仿在DSP上的一个负载。
|