📄 main.c
字号:
/******************************************************************
** 文件名: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 + -