⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 源程序是在VisualDSP环境下开发出来的
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************

** 文件名:main.c

** Copyright (c) 1998-1999 *********公司技术开发部

** 创建人:

** 日 期:2003.01.22

** 修改人:

** 日 期:2003.05.25

** 描 述:主函数、中断服务子程序、以及一些只会被主函数调用的函数等

** 版 本:

******************************************************************/
#include <signal.h>
#include <stdio.h>
#include <def21160.h>
#include <21160.h>
#include <math.h>

#include "hddamacros.h"
#include "globalvar.h"
#include "drawgraph.h"
#include "textout.h"
#include "asmfunctions.h"

void initDSP(void);
void initial(int channel);
void IRQ0interrupt(int useless);
void IRQ2interrupt(int useless);
void EP1interrupt(int useless);
void EP2interrupt(int useless);
void EP3interrupt(int useless);
void LP0interrupt(int useless);
void GetParas(void);
void Show(void);
void ClearOutputBuffer(void);
void Compute(void);
void SoftReset(int channel);

/*****************************************************************

** 函数名:Compute

** 输 入: 无

** 输 出: 无

** 功能描述:计算一帧画面

** 全局变量:numofresult;numoftoberotated;numofrotatedresult;numofhorizontalline;

** 作 者:

** 日 期:2003.01.22

** 修改人:

** 日 期:2003.05.25

** 版 本:

****************************************************************/

void Compute(void)
{
//将输出缓冲区中上一次的数据清空
	ClearOutputBuffer();
//	GetParas();
	switch(g_nParameters[1])
	{
//		case 4:		BITproc();break;
//		case 11:	NAVproc();break;
		case 0:		EFISproc();break;
		default:	break;
	}
	RemoveOutsidePoints();
	return;
}
/*****************************************************************

** 函数名:main

** 输 入: 无

** 输 出: 无

** 功能描述:主函数

** 作 者:

** 日 期:2003.01.22

** 修改人:

** 日 期:2003.05.25

** 版 本:

****************************************************************/

void main(void)
{
	/////////////////调试用的,正式版本不需要
	int cycle0,cycle1;int i=0;float f,sum=0;
	int cyclesoflastframe=0;
	int j=100;int mode=0;
	bool btemp=false;int ntemp=HEIGHT;
	//////////////////////////////////////////
	initial(0);
	initDSP();
	Compute();
	while(1)
	{
		while(!g_bBeginCompute)
		{
			idle();
		}
		g_bBeginCompute=0;
		//////////////////调试用,计算使用的周期数
		cycle0=count_start();

		//////////////////////
		//产生一副图形
		Compute();
		//////////////////////
		//g_bChangeChannel为1表示IRQ2到来时的g_nCurrentLineIn有变化,有可能是信号断了用当前通道重初始化
		if(g_bChangeChannel)
			SoftReset(g_nCurrentChannel);
		//////////////////测试用,自动切换//////////
		if(j--<0)
		{
			j=500;
			if(mode++>=3)
			{
				mode=0;
				g_bCurrentParaBuf=!g_bCurrentParaBuf;
				if(++ntemp>3)ntemp=0;
				switch(ntemp)
				{
					case 0:		memcpy(g_nParameters,g_nParaCruise,NUMOFPARAMETERS);break;
					case 1:		memcpy(g_nParameters,g_nParaHSI,NUMOFPARAMETERS);break;
					case 2:		memcpy(g_nParameters,g_nParaAPR,NUMOFPARAMETERS);break;
					case 3:		memcpy(g_nParameters,g_nParaFAN,NUMOFPARAMETERS);break;
					default:	ntemp=0;break;
				}
			}
			if(mode==0){SoftReset(0);}//SoftReset(1);}
			if(mode==1){g_bWithoutBG=1;}
			if(mode==2){g_bWithoutBG=0;}
			if(mode==3){SoftReset(1);}//SoftReset(0);}
		}
			StringOut(g_sChineseString0,10,20,RED,BFINALRESULT);
			Int2Str(j/25,100,20,RED,BFINALRESULT,0);
			StringOut("mode:",150,20,RED,BFINALRESULT);
			Int2Str(mode,210,20,RED,BFINALRESULT,0);
	
		//////////////////在屏幕上显示资源使用情况
		PutChar('%',Float2Str(f=3.0/80000*(cyclesoflastframe),50,TOP-20,WHITE,BFINALRESULT,4),TOP-20,WHITE,BFINALRESULT);
		if(i++<360)
		sum+=f/360;
		else
		PutChar('%',Float2Str(sum,StringOut("Average of 1440 Times:",200,TOP-20,GREEN,BFINALRESULT|BLINKING),TOP-20,WHITE,BFINALRESULT,4),TOP-20,WHITE,BFINALRESULT);
		///////////////////////////////////////
		
		//将产生好的图形输出到片外帧缓存
		Show();
		
		//////////////////调试用,计算使用的周期数
		cycle0=count_end(cycle0);
		cyclesoflastframe=cycle0;
		///////////////////////
	}
}

/*****************************************************************

** 函数名:initDSP

** 输 入: 无

** 输 出: 无

** 功能描述:初始化DSP内部的控制寄存器

** 作 者:

** 日 期:2003.01.22

** 修改人:

** 日 期:2003.05.25

** 版 本:

****************************************************************/


void initDSP(void)
{
	asm("#include <def21160.h>");
	asm("bit clr FLAGS FLG2;");
	//配置DSP的控制寄存器
	asm("MODE1=0;MODE2=0x78044;\
		ustat1=0;\
		dm(WAIT)=ustat1;\
		ustat1=0x48000;\
		dm(SYSCON)=ustat1;");
	//配置天地球的大小和颜色
	ConfigSkyEarthBall(150,30,CAMBLUE,BROWN);
	//产生字符与对应字库地址的映射表
	GenerateCharIndex();
	//通知CPLD做初始化
	asm("bit clr FLAGS FLG1|FLG2;nop;nop;nop;nop;nop;");
	asm("bit set FLAGS FLG2;");
	//开中断
	interrupts(SIG_IRQ0,IRQ0interrupt);
	interrupts(SIG_IRQ2,IRQ2interrupt);
	interrupts(SIG_IRQ1,EP1interrupt);
	interrupts(SIG_EP1I,EP1interrupt);
	interrupts(SIG_EP2I,EP2interrupt);
	interrupts(SIG_LP0I,LP0interrupt);
	LP0interrupt(0);
	return;
}


/*****************************************************************

** 函数名:SoftReset

** 输 入: int channel

** channel---想要切换到的输入视频通道号

** 输 出: 无

** 功能描述:重新初始化,可用来切换输入视频通道

** 作 者:

** 日 期:2003.12.02

** 修改人:

** 日 期:2003.12.4

** 版 本:

****************************************************************/
void SoftReset(int channel)
{
	asm("#include <def21160.h>");
	//如果有DMA正在被执行,结束它
	asm("r0=0x4000;\
		DM(DMAC10)=r0;\
		DM(DMAC11)=r0;\
		DM(DMAC12)=r0;\
		DM(DMAC13)=r0;");
	//拉低各FLAGS引脚
	asm("bit clr FLAGS FLG0|FLG1|FLG2;");
	//关闭所有中断
	asm("IMASK=0;");
	asm("MODE1=0;");
	//重初始化
	initial(channel);
	//保存当前接通的是哪个通道
	g_nCurrentChannel=channel;
	//配置DSP的控制寄存器
	asm("MODE1=0;\
		ustat1=0;\
		MODE2=0x78044;\
		dm(WAIT)=ustat1;\
		ustat1=0x48000;\
		dm(SYSCON)=ustat1;");
	//初始化各全局变量
	g_pCurrentBufferIn=g_xExtBuffer+PAGE;
	g_pCurrentBufferOutput=g_xExtBuffer+PAGE*2;
	g_pCurrentBufferOut=g_xExtBuffer;
	g_nCurrentLineIn=0;g_nCurrentLineOut=0;
	g_pOutLineAddress=g_xExtBuffer;
	g_pInLineAddress=g_xExtBuffer+PAGE;
	g_bChangeChannel=true;
	//通知CPLD做初始化
	asm("bit clr FLAGS FLG2;nop;nop;nop;nop;nop;");
	asm("bit set FLAGS FLG2;");
	//开中断
	interrupts(SIG_IRQ0,IRQ0interrupt);
	interrupts(SIG_IRQ2,IRQ2interrupt);
	interrupts(SIG_IRQ1,EP1interrupt);
	interrupts(SIG_EP1I,EP1interrupt);
	interrupts(SIG_EP2I,EP2interrupt);
	interrupts(SIG_LP0I,LP0interrupt);
	LP0interrupt(0);
	return;
}
/*****************************************************************

** 函数名:GetParas

** 输 入: 无

** 输 出: 无

** 功能描述:从链路口缓冲区拷贝参数到参数缓冲区

** 作 者:

** 日 期:2003.01.22

** 修改人:

** 日 期:2003.05.25

** 版 本:

****************************************************************/
void GetParas(void)
{
	int temp;
	
/*	if(g_bCurrentParaBuf)
	{//copy parameters to the buffer from parabuf0
		memcpy(g_nParameters,g_nParaBuf0,NUMOFPARAMETERS);
	}
	else
	{//copy parameters to the buffer from parabuf1
		memcpy(g_nParameters,g_nParaBuf1,NUMOFPARAMETERS);
	}*/
	if(g_bCurrentParaBuf)
	{//copy parameters to the buffer from parabuf0
		temp=g_nParaBuf0[0];
	}
	else
	{//copy parameters to the buffer from parabuf1
		temp=g_nParaBuf1[0];
	}
	switch(temp&0xff)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -