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

📄 复件 main.c

📁 ucos II操作系统的源代码。程序完整
💻 C
📖 第 1 页 / 共 3 页
字号:
/****************************************Copyright (c)**************************************************
**                               苏州江海通讯发展实业有限公司
**                                        设计三室 
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件名: main.c
**创 建人: 黄凯
** 版  本: v2.0
**最后修改日期: 2007年01月4日
**描        述: 29号机控制软件
**操作系统版本:uc/os-II v2.52 
**             
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 黄凯
** 版  本: v1.0
** 日 期: 2006年11月10日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人: 黄凯
** 版  本: v1.1
** 日 期: 2006年11月14日
** 描 述: 按照标准c格式修改书写格式
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 黄凯
** 日 期: 2006年12月10日
** 描 述: 按照新的跳频方案改写程序
**
**---------------------------------------------------------------------------------------------
*************************************************************************************************/

#include "config.h"
#include "stdlib.h"

extern INT8U fre_char3[100][3841];

#define  EachGroupLen			3841
#define  MaxGroupNo				99
#define  MinGroupNo             0
#define  MaxFreValue            41
#define  MinFreValue            1

#define  BegSector				9
#define  EndSector				21		//384k
#define  SectorAddr				0x00010000
#define  WriteDataLen			512*8	//每次IAP数据长度
#define  Len                    512*16+8	//每次接收数据长度
#define  TotalLen				3841*10	//数据总长
#define  ShakeHander            0x28	//握手信号

#define  FreSaveAddr            3
#define  PowSaveAddr            4
#define  FreConvAddr            5

#define  FreTabUpdataLen        96
#define  Uart1ReceStkLen		96
#define  InfoGatherStkLen       96
#define  Each3sCommStkLen		96

OS_STK   FreTabUpdataStk[FreTabUpdataLen];
OS_STK   Uart1ReceStk[Uart1ReceStkLen];
OS_STK   InfoGatherStk[InfoGatherStkLen];
OS_STK   Each3sCommStk[Each3sCommStkLen];

OS_EVENT *ReceMbox;

#define  test_on()      { IO1SET = 1<<24; }
#define  test_off()     { IO1CLR = 1<<24; }
#define  sel_led_on()   { IO0CLR = 1<<18; }
#define  sel_led_off()  { IO0SET = 1<<18; }
#define  sn74_oe_on()   { IO0CLR = 1<<19; }
	

typedef struct _flags {
		unsigned  warn		   	: 1;		//告警标志(0: 正常; 1: 告警)		
		unsigned  key			: 1;		//键盘状态(0: 按下; 1: 释放)						
		unsigned  test			: 1;		//环测标志(0: 拆环; 1: 环测)
		unsigned  fre			: 1;		//频率改变(0: 未变; 1: 改变)					
		unsigned  pow			: 1;		//功率改变(0: 未变; 1: 改变)			
		unsigned  test_change	: 1;		//环测事件(0: 无  ; 1: 有)	
		unsigned  freconvon     : 1;		//设备状态(0: 定频中; 1: 跳频中) 
		unsigned  freconvkey    : 1;		//跳频按键状态(0: 释放; 1: 按下)
		unsigned  freconvswitch : 1;        //跳频开关(0: 断开; 1: 闭合) 
		unsigned  firstiap		: 1;		//IAP状态(0:未开始;1:已开始)	
	} BITS;
BITS  flgs;

struct back0 {
			INT8U ffre; 
			INT8U ppow;
			} back ;
/*****
INT8U const fre_char[41]=  {		//频率控制字
					  0X00,0X01,0X02,0X03,0X04,0X05,0X06,0X07,
    				  0X08,0X09,0X0A,0X0B,0X0C,0X0D,0X0E,0X0F,
    				  0X10,0X11,0X12,0X13,0X14,0X15,0X16,0X17,
    				  0X18,0X19,0X1A,0X1B,0X1C,0X1D,0X1E,0X1F,
    				  0X20,0X21,0X22,0X23,0X24,0X25,0X26,0X27,
    				  0X28
    				  };
****/
INT8U warn_info;	//保存告警信息	
INT8U fre_value;	//保存频率信息
INT8U pow_value;	//保存功率信息
INT8U test_value;	//保存环测信息
INT8U fre_group;	//保存跳频图谱组号
INT8U fre_char2[EachGroupLen];//保存跳频表
INT32U fre_cnt;		//保存跳频计数
INT32U rece_data[(Len+1)/4]; 

void  FreTblUpdata(void *pdata);
void  Uart1Rece(void *pdata);
void  InfoGather(void *pdata);
void  Each3sComm(void *pdata);


void CtrlOut(INT8U ctrl_data, INT8U ctrl_no);
void LedRefresh(INT8U dat,INT8U fresh_no);
void LpcInitialize(void);
void KeyDecode(INT8U key_value);
void FrePowChange(void);
void Eint2Exception(void);
void Eint3Exception(void);
void FreConverInfo(void);
void WarnInfo(void);
void KeyInfo(void);
INT8U Uart1Send(void);
void I2cE2rom(INT8U SaveAddr, INT8U const *SaveData, INT8U SaveNo);

/*****************************************************************************************
** 函数名称: FreTabUpdate
** 功能描述: 更新跳频表 注意:每次更新数据长度不能超过384k
** 输 入: pdata        任务附加参数(指针)
** 输 出: 无
** 全局变量: 无
** 调用模块: 
**
** 作 者: 黄凯
** 日 期: 2006年12月30日
**------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-----------------------------------------------------------------------------------------------
*********************************************************************************/
void FreTabUpdate(void *pdata){
	INT8U *cp;
	INT8U i;
	INT8U temp[3];
    INT16U rxlen;		//每次串口接收长度
    INT16U rxlen1;		//每组发送数据长度(包括起始符、终止符、长度及crc值)
    INT32U rxedlen;		//总的接收长度(不包括起始符、终止符、长度及crc值)
    INT32U x; 
    INT32U iapcnt2;   
    INT32U iapcnt3;
    

    #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
	#endif
	   
    pdata = pdata; 
    
    LpcInitialize();
    
    while (1)    {
    	x = 0;
		rxlen = 0;
        rxedlen = 0;
        iapcnt2 = 0;
        iapcnt3 = 0;
        
        flgs.firstiap = 0;        
        cp = (INT8U *)rece_data;
        /******debug********
        //do
    	//{
    		rece_data[0] = 0;
    		UART_read(0, cp, 1, 0);
    	//} while (*cp != 0);
    	fre_group = *cp;
    		OS_ENTER_CRITICAL(); 
			memcpy(fre_char2, fre_char3[fre_group], EachGroupLen);
			OS_EXIT_CRITICAL(); 
			cp = fre_char2;
			UART_write(0, cp, EachGroupLen, 12000); 
         ***/    
         do
    	{
    		rece_data[0] = 0;
    		UART_read(0, cp, 1, 0);
    	} while (*cp != ShakeHander);
		
		do
		{
			err:
				rxlen = UART_read(0, cp, 4, 20);	//接收每组数据的长度
				if (rxlen != 4)
				{
					rxlen = 0;
					goto err;
				}
				rxlen1 = *(cp+2)<<8 + *(cp+3) + 8;	
				x = rxlen;		
        		do
    			{
    				rxlen = UART_read(0, cp+x, Len-x, 20);
    				x += rxlen;
				} while (x<rxlen1);
				
				if ((rxlen=GetCRC16(cp+2, rxlen1-4))!=0)	//出错处理
				{
					rxlen = 0;
					temp[0] = 0x1f;		//重发本组数据
					UART_write(0, temp, 1, 4);
					goto err;
				}
				
			rxedlen = rxedlen + x - 8;
			
        	UART_write(0, cp, Len, 4800);

        	iapcnt2 = (rxlen1-8) / WriteDataLen;	//计算每组数据所需IAP的次数
       		if (((rxlen1-8) & 0x0fff) != 0)
       		{
       			iapcnt2 ++;
       		}
			OS_ENTER_CRITICAL();
		
			temp[0]=MAMCR;
			temp[1]=MAMTIM;
			temp[2]=(INT8U)PLLSTAT;
		
			MAMCR=0;
			PLLCON=0;
			PLLFEED = 0XAA;
			PLLFEED = 0X55;
		
			ReadParID();
   			BootCodeID();
				
			if (flgs.firstiap)
			{
				flgs.firstiap = 1;
				SelSector(BegSector,EndSector);
				EraseSector(BegSector,EndSector);
				BlankCHK(BegSector,EndSector);
			}
			for (i=iapcnt2; i>0; i--)
			{							
				SelSector(BegSector,EndSector);
				RamToFlash(SectorAddr+WriteDataLen*iapcnt3,(INT32U)rece_data+4+WriteDataLen*iapcnt3,WriteDataLen);
				iapcnt3++;
			}
			BlankCHK(BegSector,EndSector);
				
			MAMCR = temp[0];
			MAMTIM = temp[1];
				
			PLLCON = 1;
			PLLCFG = temp[2];
			PLLFEED = 0xaa;
    		PLLFEED = 0x55;
    		while((PLLSTAT & (1 << 10)) == 0);
	    	PLLCON = 3;
	    	PLLFEED = 0xaa;
    		PLLFEED = 0x55;

			OS_EXIT_CRITICAL();	
			
			temp[0] = 0x0f;		//可以接收下一组数据
			UART_write(0, temp, 1, 4);								
		} while(TotalLen > rxedlen);
		
		cp=(INT8U *)SectorAddr;				
        UART_write(1, cp, Len, 12000); 
        
    }
} 
/*****************************************************************************************
** 函数名称: Uart1Rece
** 功能描述: 从UART1接收数据
** 输 入: pdata        任务附加参数(指针)
** 输 出: 无
** 全局变量: 无
** 调用模块: 
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**----------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**--------------------------------------------------------------------------------------
*********************************************************************************/
void Uart1Rece(void *pdata){	
    INT8U Uart1Buf[4];
    
    pdata = pdata; 
	
    while (1){  			
    	UART_read(1, Uart1Buf, 1, 0);
    	#ifdef __DEBUG
    	UART_write(0, Uart1Buf, 1, 3);
    	#endif
    	switch (Uart1Buf[0])
    	{
    		case 0xf1 :
    		{
				flgs.test = 1;
				pow_value = 1;
				test_on();	
				LedRefresh(pow_value,0x0f);	
    			break;
    		}
    		case 0xf2 :
    		{
    			flgs.test = 0;
				pow_value = back.ppow;
				test_off();
				LedRefresh(pow_value,0x0f);
    			break;
    		}
    		default: break;
    	}
    }
}
/*********************************************************************************************************
** 函数名称: Each3sComm
** 功能描述: 每隔3s发送一次,
** 输 入: pdata        任务附加参数(指针)
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Each3sComm(void *pdata){	
	pdata = pdata ;
	while (1)
	{
		OSTimeDly(3*OS_TICKS_PER_SEC);
		Uart1Send();
	}
}
/*********************************************************************************************************

⌨️ 快捷键说明

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