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

📄 appmain.c

📁 ARM得编程实例。很经典。在win ce5.0环境下的编程实例
💻 C
字号:
#include "general.h"
#include "appmain.h"

#define BYTE  INT8U
#define WORD  INT16U
#define UINT  INT16U

#include "crc.h"

#ifdef ARM_XSCALE_CPU
    #include "timer.h"
#endif

/* demo buffers */
BYTE testinbuf[1500];
BYTE testoutbuf[1500];
BYTE OutBuf[1500];
BYTE InBuf[1500];
BYTE CommBuf[1500];

#ifdef ARM_XSCALE_CPU
    TIMER syntimer;
#endif

void  WriteOCM(BYTE *pbegin, BYTE bval);
void FillTM480(BYTE *ptmp);
void FillTM490(BYTE *ptmp);

void TestTM422(void);
void TestTM480(void);
void TestTM490(void);
void TestTM490V2(void);
void TestNet(void);

#ifdef INTEL_X86_CPU 
    BYTE bwait = 0;
    BYTE bwaitack = 0;
#endif

BYTE bsyn = 0;
static BYTE nloop = 0;
BYTE RunSynBuf[1500];

void SendSyn(BYTE );

#ifdef INTEL_X86_CPU 
BYTE ReceiveSyn(BYTE , BYTE*);
#endif

#ifdef ARM_XSCALE_CPU
BYTE ReceiveSyn(BYTE bframetype, TIMER* ptimer);
#endif

void ICURunSync(void);


/* 计算给定长度数据的16位CRC */
UINT GetCrc16(BYTE* pData, UINT nLength){
    UINT fcs = 0xFFFF;                       
    for( ; nLength > 0; --nLength, ++pData){
        fcs = (fcs >> 8) ^ upCRCTab16[(fcs ^ *pData) & 0xFF];
    }
    return ~fcs;                            
}

/* 检查给定长度数据的16位CRC是否正确 */
unsigned int IsCrc16Good(BYTE* pData, UINT nLength){
    UINT fcs = 0xFFFF;                      
    for( ; nLength > 0; --nLength, ++pData){
        fcs = (fcs >> 8) ^ upCRCTab16[(fcs ^ *pData) & 0xFF];
    }
    return (fcs == 0xF0B8);            /*  0xf0b8是CRC-ITU的"Magic Value" */
}

#define SYNC_REQUEST   0x66
#define SYNC_RESPONSE  0x77
/*
    功能 : 发送同步数据 
    参数 : bframetype 帧类型 
           0x66表示请求帧(ICU1->ICU2)
           0x77表示应当帧(ICU2->ICU1) 
    返回值 : 无 
*/
void SendSyn(BYTE bframetype)
{
    RunSynBuf[0] = bframetype;
    RunSynBuf[1] = bframetype;
    RunSynBuf[2] = bframetype;
    RunSynBuf[3] = bframetype;
    RunSynBuf[4] = nloop;
    RunSynBuf[5] = *(BYTE*)(getIOOutp(7) + 0);
    RunSynBuf[6] = *(BYTE*)(getIOOutp(7) + 1);
    RunSynBuf[7] = *(BYTE*)(getIOOutp(7) + 2);
    RunSynBuf[8] = *(BYTE*)(getIOOutp(7) + 3);
    RunSynBuf[9] = *(BYTE*)(getIOOutp(7) + 4);
    RunSynBuf[10] = *(BYTE*)(getIOOutp(7) + 5);
    RunSynBuf[11] = *(BYTE*)(getIOOutp(7) + 6);
    RunSynBuf[12] = *(BYTE*)(getIOOutp(7) + 7);
    NetSend(CurNet.ICUIn, RunSynBuf, (long int)50);
}


#ifdef ARM_XSCALE_CPU
BYTE ReceiveSyn(BYTE bframetype, TIMER* ptimer)
{
    WORD dfrmlen = 0;
    
    RunSynBuf[0] = 0x00;
    RunSynBuf[1] = 0x00;
    RunSynBuf[2] = 0x00;
    RunSynBuf[3] = 0x00;
    
    starttimer(ptimer);
    do 
    {
        dfrmlen = ReceiveFrom(RunSynBuf, CurNet.ICUIn);
        if (dfrmlen > 0)
        {
            if ((bframetype == RunSynBuf[0])&&
                (bframetype == RunSynBuf[1])&&
                (bframetype == RunSynBuf[2])&&
                (bframetype == RunSynBuf[3]))
            {
                if (2 == getICU_ID()) nloop = RunSynBuf[4];
                stoptimer(ptimer);
                bsyn = 1;
                setSYNLED(INSYN);
                if (TRUE == IsEmpty(CurNet.ICUIn))
                {
                    return(0);
                }
            }
        }        
        
        if (isTimeout(ptimer))  /* 超时判断 */
        {
            stoptimer(ptimer);
            setSYNLED(NOSYN);
            return(1);
        }
    } while (1);
}
#else
/*
    功能 : 接收同步数据
    参数 : bframetype 帧类型
               0x66表示请求帧(ICU1->ICU2)
               0x77表示应当帧(ICU2->ICU1)
           pCounter 超时计数器指针 
    返回值 : 0 正常
             1 超时 
*/
BYTE ReceiveSyn(BYTE bframetype, BYTE* pCounter)
{
    WORD dfrmlen = 0;
    
    RunSynBuf[0] = 0x00;
    RunSynBuf[1] = 0x00;
    RunSynBuf[2] = 0x00;
    RunSynBuf[3] = 0x00;
    
    do 
    {
        dfrmlen = ReceiveFrom(RunSynBuf, CurNet.ICUIn);
        if (dfrmlen > 0)
        {
            if ((bframetype == RunSynBuf[0])&&
                (bframetype == RunSynBuf[1])&&
                (bframetype == RunSynBuf[2])&&
                (bframetype == RunSynBuf[3]))
            {
                if (2 == getICU_ID()) nloop = RunSynBuf[4];
                *pCounter = 0;
                bsyn = 1;
                setSYNLED(INSYN);
                if (TRUE == IsEmpty(CurNet.ICUIn))
                {
                    return(0);
                }
            }
        }        
        
        if (*pCounter > 10)  /* 超时判断 */
        {
            *pCounter = 0;
            setSYNLED(NOSYN);
            return(1);
        }
    } while (1);
}
#endif


/* 系统同步 */
void ICURunSync(void)
{
    bsyn = 0;
    
    settimer(&syntimer, 100);
    
    if (1 == getICU_ID())
    {
        SendSyn(SYNC_REQUEST);
        #ifdef INTEL_X86_CPU 
        bwaitack = 0;
        ReceiveSyn(SYNC_RESPONSE, &bwaitack);
        #endif
        
        #ifdef ARM_XSCALE_CPU
        ReceiveSyn(SYNC_RESPONSE, &syntimer);
        #endif
    }
    else
    {
        #ifdef INTEL_X86_CPU 
        if (0 == ReceiveSyn(SYNC_REQUEST, &bwait))
        {
            SendSyn(SYNC_RESPONSE);
        }
        #endif
        
        #ifdef ARM_XSCALE_CPU
        if (0 == ReceiveSyn(SYNC_REQUEST, &syntimer))
        {
            SendSyn(SYNC_RESPONSE);
        }
        #endif
    }
    
#ifdef DEBUG
    if (1 == bsyn)
    {
        flashLed(RNETA_LED);
    } 
    else
    {
        darkenLed(RNETA_LED);
    }
#endif
}


void Appmain(void)
{   
    TIMER  delay;
    
    settimer(&delay, 200);
    ICURunSync();
    
    ExchangeData();  
    PollIO(IO_ALL); 
    
    TestTM422();    
    TestTM480();
    TestTM490();
    TestTM490V2();
    TestNet();
    
    if ((1 == bsyn)&&(1 == getICU_ID()))
    {
        nloop++;
    }
    
    starttimer(&delay);
    while (isTimeout(&delay) != 1);
}


/* 处理TM422 */
void TestTM422(void)
{  
    BYTE *pinput;
//    BYTE *ptm470out;
//    BYTE i = 0;

    if ((getIOStructp(7) != (RunDEVSTRUCT *)NO_DEVICE_CONFIG) &&
        (getIOStructp(7) != NULL)) 
    {
        pinput = (BYTE*)getIOInp(7);
                
        switch (nloop % 5)
        {
            case 0: SetTM422LED(0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA);
                break;
            case 1: SetTM422LED(0x55, 0xAA, 0x55, 0x55, 0x55, 0xAA, 0xAA);
                break;
            case 2: SetTM422LED(0x55, 0x55, 0xAA, 0x55, 0x55, 0xAA, 0xAA);
                break;
            case 3: SetTM422LED(0x55, 0x55, 0x55, 0xAA, 0x55, 0xAA, 0xAA);
                break;
            case 4: SetTM422LED(0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA);
                break;
            default: 
                break;
        }
        
        
        /* 将输入数据发送到TM470的前30个通道 */
//        if ((getIOStructp(20) != (RunDEVSTRUCT *)NO_DEVICE_CONFIG) &&
//            (getIOStructp(20) != NULL))
//        {
//            if (getIOType(20) == OCM)
//            {
//                ptm470out = getIOOutp(20);
//                *ptm470out = getSysID();
//                for (i = 0; i < 30; i++)
//                {
//                    *(BYTE*)(ptm470out + i + 1) = *(BYTE*)(pinput + i);
//                }
//            }
//        }
    }
} 


/* 测试TM480 */
void TestTM480(void)
{
    BYTE *pinput, *poutput;
    
    if ((getIOStructp(8) != (RunDEVSTRUCT *)NO_DEVICE_CONFIG) &&
        (getIOStructp(8) != NULL)) 
    {
        pinput = (BYTE*)getIOInp(8);
        poutput = (BYTE*)getIOOutp(8);
        FillTM480(poutput);
    }
        
    if ((getIOStructp(9) != (RunDEVSTRUCT *)NO_DEVICE_CONFIG) &&
        (getIOStructp(9) != NULL)) 
    {
        pinput = (BYTE*)getIOInp(9);        
        poutput = (BYTE*)getIOOutp(9);
        FillTM480(poutput);
    }
}


/* 测试TM490 */
void TestTM490(void)
{
    BYTE *pinput, *poutput;
    
    if ((getIOStructp(14) != (RunDEVSTRUCT *)NO_DEVICE_CONFIG) &&
        (getIOStructp(14) != NULL)) 
    {
        pinput = (BYTE*)getIOInp(14);
        poutput = (BYTE*)getIOOutp(14);
        FillTM490(poutput);
    }
        
    if ((getIOStructp(15) != (RunDEVSTRUCT *)NO_DEVICE_CONFIG) &&
        (getIOStructp(15) != NULL)) 
    {
        pinput = (BYTE*)getIOInp(15);
        poutput = (BYTE*)getIOOutp(15);
        FillTM490(poutput);
    }
}

/* 测试TM490V2 */
void TestTM490V2(void)
{
    BYTE *pinput, *poutput;
    
    if ((getIOStructp(12) != (RunDEVSTRUCT *)NO_DEVICE_CONFIG) &&
        (getIOStructp(12) != NULL)) 
    {
        pinput = (BYTE*)getIOInp(12);
        poutput = (BYTE*)getIOOutp(12);
        FillTM490(poutput);
    }
        
    if ((getIOStructp(13) != (RunDEVSTRUCT *)NO_DEVICE_CONFIG) &&
        (getIOStructp(13) != NULL)) 
    {
        pinput = (BYTE*)getIOInp(13);
        poutput = (BYTE*)getIOOutp(13);
        FillTM490(poutput);
    }
}


void TestNet(void)
{
    WORD ncycrecfrm = 0; /* 每周期收到的数据包 */
    WORD ncycsndfrm = 0; /* 每周期发送的数据包 */
           
    {  /* 系间ICU通信 */
        WORD dfrmlen = 0;
        
        NetSend(CurNet.ICUOut, OutBuf, (long int)100);
        do {
            dfrmlen = ReceiveFrom(InBuf, CurNet.ICUOut);
            if (dfrmlen > 0) {
                flashLed(RNETB_LED);
            } else {
            }
        } while (IsEmpty(CurNet.ICUOut) != TRUE);
    }
        
    {  /* ICU与COMM通信 */
        static WORD ntestsnd = 0;
        static WORD ntestrcv = 0;
        WORD dfrmlen = 0;
        
        switch(getSysID()) {
        case TSYSA: {
            do {
                dfrmlen = ReceiveFrom(CommBuf, CurNet.COMM1);
                if (dfrmlen > 0) {
                    ncycrecfrm++;
                    ntestrcv++;
                    flashLed(SNETA_LED);

                    if (NET_OP_ORDER == CommBuf[0]) {
                        CommBuf[0] = NET_INPUT;
                        NetSend(CurNet.COMM1, CommBuf, (long int)dfrmlen);
                        ncycsndfrm++;
                        ntestsnd++;
                    }
                }
            } while (IsEmpty(CurNet.COMM1) != TRUE);
            }
            break;
        case TSYSB: {
            do {
                dfrmlen = ReceiveFrom(CommBuf, CurNet.COMM2);
                if (dfrmlen > 0) {
                    ncycrecfrm++;
                    ntestrcv++;
                    flashLed(SNETB_LED);
                    if (NET_OP_ORDER == CommBuf[0]) {
                        CommBuf[0] = NET_INPUT;
                        NetSend(CurNet.COMM2, CommBuf, (long int)dfrmlen);
                        ncycsndfrm++;
                        ntestsnd++;
                    }
                }
            } while (IsEmpty(CurNet.COMM2) != TRUE);
            }
            break;
        default: break;
        }
    }
}


void  WriteOCM(BYTE *pbegin, BYTE bval)
{
    BYTE i = 0;
    
    *pbegin = getSysID();
    for (i = 0; i < 32; i++)
    {
        *(BYTE*)(pbegin + 1 + i) = bval;
    }
}

void FillTM480(BYTE *ptmp)
{
    BYTE i = 0;
    UINT crcresult = 0;
    
    *(BYTE*)ptmp = (BYTE)(nloop/2);  /* time stamp */
    *(BYTE*)(ptmp + 1) = 0x00;
    *(BYTE*)(ptmp + 2) = 0x00;
    
    /* data1 25 bytes */
    *(BYTE*)(ptmp + 3) = 0xC0;
    for (i = 0; i < 24; i++)
    {
        *(BYTE*)(ptmp + 4 + i) = 0x11;
    }

    /* data2 25 bytes */
    *(BYTE*)(ptmp + 28) = 0xC0;
    for (i = 0; i < 24; i++)
    {
        *(BYTE*)(ptmp + 29 + i) = 0x22;
    }
    
    /* data3 25 bytes */
    *(BYTE*)(ptmp + 53) = 0xF0;
    for (i = 0; i < 24; i++)
    {
        *(BYTE*)(ptmp + 54 + i) = 0x33;
    }

    /* data4 25 bytes */
    *(BYTE*)(ptmp + 78) = 0xF0;
    for (i = 0; i < 24; i++)
    {
        *(BYTE*)(ptmp + 79 + i) = 0x44;
    }

    /* data5 25 bytes */
    *(BYTE*)(ptmp + 103) = 0x00;
    for (i = 0; i < 24; i++)
    {
        *(BYTE*)(ptmp + 104 + i) = 0x55;
    }
    
    crcresult = GetCrc16(ptmp, 128);
    *(BYTE*)(ptmp + 128) = LOBYTE(crcresult);
    *(BYTE*)(ptmp + 129) = HIBYTE(crcresult);
}

void FillTM490(BYTE *ptmp)
{
    BYTE i = 0;
    UINT crcresult = 0;
    
    for (i = 0; i < 140; i++)
    {
        *(BYTE*)(ptmp + i) = (BYTE)(nloop/2);
    }
    
    *(BYTE*)ptmp = (BYTE)(nloop/2);
    *(BYTE*)(ptmp + 1) = 0xF3;
    *(BYTE*)(ptmp + 2) = 0xAA;
    *(BYTE*)(ptmp + 3) = 0xF0;
    *(BYTE*)(ptmp + 4) = 0xF0;
    *(BYTE*)(ptmp + 5) = (BYTE)(((nloop/2) % 6) + 1);
    
    *(BYTE*)(ptmp + 136) = 0x0F;
    *(BYTE*)(ptmp + 137) = 0x0F;
    
    crcresult = GetCrc16(ptmp, 138);
    *(BYTE*)(ptmp + 138) = LOBYTE(crcresult);
    *(BYTE*)(ptmp + 139) = HIBYTE(crcresult);
}

⌨️ 快捷键说明

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