C 代码优化--数组内任意长度字节的数据赋值
											 程序代码:
程序代码:具体如下:
1. 调用该函数用于把需要发送的信号放到缓冲区中,信号长度位数不定,在0-32位之间,使用如下函数把信号写入到指定的起始位,长度,定时发送,具体 参数如下,请帮忙看下该代码是否还可以优化,由于该函数调用太多,cpu使用率还是有点高,或者各位大侠有更好的方法吗,谢谢!
uint32 DATA:                   要发送的数据
uint32 CanBuffIdx:           缓冲区编号
uint8 CanBuffStartBit:  每个缓冲区8个字节,64位,发送的信号的起始位
uint16 CanBuffLength: 发送的信号的长度(位,不是字节)
uint8 *Tx_Buffer: 缓冲区地址
uint8 CanBuffOrder: 字节序
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <time.h>
#include <windows.h>
#include <WinBase.h>
#include <ctime>
typedef unsigned char    uint8;
typedef signed char        int8;
typedef unsigned short    uint16;
typedef signed short    int16;
typedef unsigned int    uint32;
typedef signed int        int32;
typedef unsigned long    uint64;
typedef signed long        int64;
void PutMessageData(uint32 DATA, uint32 CanBuffIdx, uint8 CanBuffStartBit, uint16 CanBuffLength, uint8 *Tx_Buffer, uint8 CanBuffOrder);
void PutMessageDataNew(uint32 DATA, uint32 CanBuffIdx, uint8 CanBuffStartBit, uint16 CanBuffLength, uint8 *Tx_Buffer, uint8 CanBuffOrder);
void PutMessageDataOld(uint32 DATA,uint32 CAN_BUFF_IDX,uint8 CAN_BUFF_STARTBIT,uint16 CAN_BUFF_LENGTH,uint8 *Tx_Buffer, uint8 CAN_BUFF_ORDER);
#define INTEL 0
#define MOTO 1
#define MIXMODE 2
#define CAN_ORDER INTEL
#define MAX        32
#define MIN        1
static union /* CAN data buffer definition */
{
    uint8 data_au8[8]; /* 8-bytes data frame */
    uint64 data_u64; /* for efficient clearing of 8-bytes buffer */
} msgData[16];
#define MAX_TIME 30*100000
uint8 length_data[MAX_TIME];
using namespace std;
uint8 buff[128];
int main()
{
    uint64 i,j;
    uint32 data = 0x12345678;
    uint64 start_msec,end_msec;
    uint8 signal_length, signal_start_bit;
   
    srand(time(0));
    for (i=0; i<MAX_TIME; i++)
    {
        length_data[i] = rand() % (MAX + 1 - MIN) + MIN;
    }
    start_msec = GetTickCount();
    for (i=0; i<MAX_TIME; i++)
    {
        signal_length = //length_data[i];//
        signal_start_bit =9;//= rand() % (64 - signal_length  + 1 - 1) + 1;
        PutMessageDataOld(data,0,signal_start_bit,signal_length,buff,INTEL);
    }
    end_msec = GetTickCount();
    printf("%ld\r\n",end_msec - start_msec);
    start_msec = GetTickCount();
    for (i=0; i<MAX_TIME; i++)
    {
        signal_length = length_data[i];//
        signal_start_bit =9;//= rand() % (64 - signal_length  + 1 - 1) + 1;
        PutMessageData(data,0,signal_start_bit,signal_length,buff,INTEL);
    }
    end_msec = GetTickCount();
    printf("%ld\r\n",end_msec - start_msec);
    start_msec = GetTickCount();
    for (i=0; i<MAX_TIME; i++)
    {
        signal_length = //length_data[i];//rand() % (MAX + 1 - MIN) + MIN;
        signal_start_bit =9;//= rand() % (64 - signal_length  + 1 - 1) + 1;
        PutMessageDataNew(data,0,signal_start_bit,signal_length,buff,INTEL);
    }
    end_msec = GetTickCount();
    printf("%ld\r\n",end_msec - start_msec);
    system("pause");
}
void PutMessageData(uint32 DATA, uint32 CanBuffIdx, uint8 CanBuffStartBit, uint16
                    CanBuffLength, uint8 *Tx_Buffer, uint8 CanBuffOrder)
{
    uint8 i, j;
    uint32 send_data_32, temp_data_32 = 0xFFFFFFFF;
    uint8 stbitp1, stbitp2, send_data_8, temp_data_8;
    if((CanBuffLength > 0) && (CanBuffLength <= 32) && (CanBuffStartBit < 64))
    {
        /*For Bit*/
        if(CanBuffLength == 1)
        {
            send_data_8 = 0x01 << (CanBuffStartBit % 8);
            temp_data_8 = ~send_data_8;
            if(DATA != 0)
            {
                //send_data_8 =((uint8) (DATA<<7))>>(7-CanBuffStartBit%8);
                send_data_8 = 1 << (CanBuffStartBit % 8);
                *( Tx_Buffer + (CanBuffStartBit >> 3) + (CanBuffIdx << 3)) |= send_data_8;
            }
            else
            {
                *( Tx_Buffer + (CanBuffStartBit >> 3) + (CanBuffIdx << 3)) &= temp_data_8;
            }
        }
        /*For Intel */
        else if ((CAN_ORDER == INTEL) || ((CanBuffOrder == INTEL) && (CAN_ORDER ==
            MIXMODE)))
        {
            stbitp1 = CanBuffLength + CanBuffStartBit % 8;
            i = (stbitp1 - 1) >> 3;
            if((CanBuffLength + CanBuffStartBit <= 64) && (i < 4))
            {
                /*clear buffer*/
                temp_data_32 = (temp_data_32 >> (32 - CanBuffLength)) << (
                    CanBuffStartBit % 8);
                temp_data_32 = ~temp_data_32;
                for(j = 0; j <= i; j++)
                {
                    *( Tx_Buffer + (CanBuffStartBit >> 3) + j + (CanBuffIdx << 3)) &= (
                        uint8)temp_data_32;
                    temp_data_32 = temp_data_32 >> 8;
                }
                /*write buffer*/
                stbitp2 = 32 - CanBuffLength;
                send_data_32 = (((uint32)(DATA << stbitp2)) >> stbitp2) << (CanBuffStartBit % 8);
                for(j = 0; j <= i; j++)
                {
                    *( Tx_Buffer + (CanBuffStartBit >> 3) + j + (CanBuffIdx << 3)) |= (
                        uint8)send_data_32;
                    send_data_32 = send_data_32 >> 8;
                }
            }
        }
        /*For Moto */
        else if((CAN_ORDER == MOTO) || ((CanBuffOrder == MOTO) && (CAN_ORDER ==
            MIXMODE)))
        {
            stbitp1 = 7 - CanBuffStartBit % 8 + CanBuffLength;
            i = (stbitp1 - 1) >> 3;
            if(((stbitp1 + (CanBuffStartBit & 0xF8)) <= 64) && (i < 4))
            {
                /*clear buffer*/
                temp_data_32 = (temp_data_32 >> (32 - CanBuffLength)) << (7 - (stbitp1 - 1) % 8);
                temp_data_32 = ~temp_data_32;
                for(j = 0; j <= i; j++)
                {
                    *( Tx_Buffer + (CanBuffStartBit >> 3) + (i - j) + (CanBuffIdx << 3))
                        &= (uint8)temp_data_32;
                    temp_data_32 = temp_data_32 >> 8;
                }
                /*write buffer*/
                stbitp2 = 32 - CanBuffLength;
                send_data_32 = (((uint32)(DATA << stbitp2)) >> stbitp2) << (7 - ((stbitp1 - 1) % 8
                    ));
                for(j = 0; j <= i; j++)
                {
                    *( Tx_Buffer + (CanBuffStartBit >> 3) + (i - j) + (CanBuffIdx << 3))
                        |= (uint8)send_data_32;
                    send_data_32 = send_data_32 >> 8;
                }
            }
        }
    }
}
/*{processes...}*/
//-6-
void PutMessageDataOld(uint32 DATA,uint32 CAN_BUFF_IDX,uint8 CAN_BUFF_STARTBIT,uint16 CAN_BUFF_LENGTH,uint8 *Tx_Buffer, uint8 CAN_BUFF_ORDER)
{
    uint8 i;
    uint64 temp_data_64 ;
    uint64 send_data_64 = 0xFFFFFFFFFFFFFFFF;
    uint8 stbitp1,stbitp2;
    if(CAN_BUFF_LENGTH == 0)
    {
        return;
    }
    temp_data_64 = (uint64)DATA;
    if ((CAN_ORDER == INTEL) || ((CAN_BUFF_ORDER ==INTEL) && (CAN_ORDER == MIXMODE)))
    {
        if(CAN_BUFF_LENGTH+CAN_BUFF_STARTBIT >64)
        {
            return;
        }
        else
        {
            send_data_64 = send_data_64 >> CAN_BUFF_STARTBIT ;
            send_data_64 = send_data_64 << (64-CAN_BUFF_LENGTH ) ;
            send_data_64 = send_data_64 >> (64-CAN_BUFF_LENGTH-CAN_BUFF_STARTBIT ) ;
            send_data_64 = ~send_data_64;
            msgData[CAN_BUFF_IDX].data_u64 = send_data_64;
            for(i=0;i<8;i++)
            {
                *( Tx_Buffer+i+(CAN_BUFF_IDX << 3)) &= msgData[CAN_BUFF_IDX].data_au8[i];
            }
            temp_data_64 =  temp_data_64 << CAN_BUFF_STARTBIT ;
            msgData[CAN_BUFF_IDX].data_u64 = temp_data_64;
            for(i=0;i<8;i++)
            {
                *( Tx_Buffer+i+(CAN_BUFF_IDX << 3)) |= msgData[CAN_BUFF_IDX].data_au8[i];
            }
        }
    }
    else if((CAN_ORDER == MOTO) || ((CAN_BUFF_ORDER ==MOTO) && (CAN_ORDER == MIXMODE)))
    {
        stbitp1 = CAN_BUFF_STARTBIT % 8;
        stbitp2 = CAN_BUFF_STARTBIT >> 3;
        CAN_BUFF_STARTBIT = (7-stbitp2)*8+stbitp1;
        CAN_BUFF_STARTBIT = (CAN_BUFF_STARTBIT+1)-CAN_BUFF_LENGTH ;
        send_data_64 = send_data_64 >> CAN_BUFF_STARTBIT ;
        send_data_64 = send_data_64 << (64-CAN_BUFF_LENGTH ) ;
        send_data_64 = send_data_64 >> (64-CAN_BUFF_LENGTH-CAN_BUFF_STARTBIT) ;
        send_data_64 = ~send_data_64;
        msgData[CAN_BUFF_IDX].data_u64 = send_data_64;
        for(i=0;i<8;i++)
        {
            *( Tx_Buffer+i+(CAN_BUFF_IDX << 3)) &= msgData[CAN_BUFF_IDX].data_au8[7-i];
        }
        temp_data_64 =  temp_data_64 << CAN_BUFF_STARTBIT ;
        msgData[CAN_BUFF_IDX].data_u64 = temp_data_64;
        for(i=0;i<8;i++)
        {
            *( Tx_Buffer+i+(CAN_BUFF_IDX << 3)) |= msgData[CAN_BUFF_IDX].data_au8[7-i];
        }
    }
}
void PutMessageDataNew(uint32 DATA, uint32 CanBuffIdx, uint8 CanBuffStartBit, uint16
                       CanBuffLength, uint8 *Tx_Buffer, uint8 CanBuffOrder)
{
    uint8 i, j;
    uint32 send_data_32, temp_data_32 = 0xFFFFFFFF;
    uint8 stbitp1, stbitp2, send_data_8;
    uint8 CanbuffStartByte, CanBuffLastBits, CanBuffIdxPos, *pTxBuff = NULL;
    CanBuffLastBits = CanBuffStartBit % 8;
    CanbuffStartByte = CanBuffStartBit >> 3;
    CanBuffIdxPos = CanBuffIdx << 3;
    pTxBuff = Tx_Buffer + CanbuffStartByte + CanBuffIdxPos;
    if((CanBuffLength > 0) && (CanBuffLength <= 32) && (CanBuffStartBit < 64))
    {
        /*For Bit*/
        if(CanBuffLength == 1)
        {
            send_data_8 = 0x01 << (CanBuffLastBits);
            if(DATA != 0)
            {
                *(pTxBuff) |= send_data_8;
            }
            else
            {
                *(pTxBuff) &= (~send_data_8);
            }
        }
        /*For Intel */
        else if ((CAN_ORDER == INTEL) || ((CanBuffOrder == INTEL) && (CAN_ORDER == MIXMODE)))
        {
            stbitp1 = CanBuffLength + CanBuffLastBits;
            i = (stbitp1 - 1) >> 3;
            if((CanBuffLength + CanBuffStartBit <= 64) && (i < 4))
            {
                /*clear buffer*/
                temp_data_32 = (temp_data_32 >> (32 - CanBuffLength)) << CanBuffLastBits;
                temp_data_32 = ~temp_data_32;
                stbitp2 = 32 - CanBuffLength;
                send_data_32 = (((uint32)(DATA << stbitp2)) >> stbitp2) << (CanBuffLastBits);
                for(j = 0; j <= i; j++)
                {
                    *( pTxBuff + j) &= (uint8)temp_data_32;
                    temp_data_32 = temp_data_32 >> 8;
                    *( pTxBuff + j) |= (uint8)send_data_32;
                    send_data_32 = send_data_32 >> 8;
                }
            }
        }
        /*For Moto */
        else if((CAN_ORDER == MOTO) || ((CanBuffOrder == MOTO) && (CAN_ORDER ==
            MIXMODE)))
        {
            stbitp1 = 7 - CanBuffLastBits + CanBuffLength;
            i = (stbitp1 - 1) >> 3;
            if(((stbitp1 + (CanBuffStartBit & 0xF8)) <= 64) && (i < 4))
            {
                /*clear buffer*/
                temp_data_32 = (temp_data_32 >> (32 - CanBuffLength)) << (7 - (stbitp1 - 1) % 8);
                temp_data_32 = ~temp_data_32;
                stbitp2 = 32 - CanBuffLength;
                send_data_32 = (((uint32)(DATA << stbitp2)) >> stbitp2) << (7 - ((stbitp1 - 1) % 8));
                for(j = 0; j <= i; j++)
                {
                    *(pTxBuff + (i - j)) &= (uint8)temp_data_32;
                    temp_data_32 = temp_data_32 >> 8;
                    *(pTxBuff + (i - j)) |= (uint8)send_data_32;
                    send_data_32 = send_data_32 >> 8;
                }
            }
        }
    }
}										
					
	
 
											





 
	    