임 베 디 드 DTU 가 실제 사용 하 는 배열 대기 열 형식 공유 메모리 구현 결과

#define __DTU_INNER_FUNC__
#ifdef __DTU_INNER_FUNC__
#define MAX_UART_SIZE       (32*1024) //        kal_mutexid dtu_mutex; #define MUTEX_BEGIN         kal_take_mutex(dtu_mutex) #define MUTEX_END           kal_give_mutex(dtu_mutex) #define MAX_SIZE            (1024*1024-1024*1024/56 -2*MAX_UART_SIZE) // 1MB-MAX_L_SIZE struct arrQueue                             //           ,       { unsigned char       data[MAX_SIZE+1]; //         ,   MAX_SIZE   unsigned int        front; //            unsigned int        rear; //              ,rear          }queue; void initQueue() {     memset(queue.data, '\0', sizeof(queue.data));     queue.front = 0;     queue.rear  = 0; } void enQueue(unsigned char *pElement, unsigned int *len)// queue      len    ,len            { //   rear front    ,         ,       //  rear     ,front     ,       if ((queue.rear+1)%(MAX_SIZE+1) == queue.front) { *len = 0; return; } //   rear front      , rear front        ,   front-rear-1 if (queue.rear+1<queue.front) { //      len         *len = *len <= (queue.front-queue.rear-1) ? *len : queue.front-queue.rear-1; memcpy(&queue.data[queue.rear], pElement, *len);         queue.rear += *len; } else //    rear front  ,     ,      { //         MAX_SIZE-(rear-front),                   *len = *len <= (MAX_SIZE-(queue.rear-queue.front)) ? *len : MAX_SIZE-(queue.rear-queue.front); //   front 0, rear      MAX_SIZE   ,            if (queue.front==0) {             memcpy(&queue.data[queue.rear], pElement, *len);             queue.rear += *len; } else //   front  0,          ,              { //           ,        if ((MAX_SIZE+1-queue.rear) >= *len) {                 memcpy(&queue.data[queue.rear], pElement, *len);                 queue.rear = (queue.rear + *len)%(MAX_SIZE+1); } else //           ,         ,          :MAX_SIZE+1-queue.rear {                 memcpy(&queue.data[queue.rear], pElement, MAX_SIZE+1-queue.rear);                 queue.rear = *len-(MAX_SIZE+1-queue.rear);                 memcpy(&queue.data[0], pElement+(*len-queue.rear), queue.rear); } } } } void deQueue(unsigned char *pElement, unsigned int *len)// queue      len    ,len            { //        if ((*len==0) || (queue.rear==queue.front)) { *len = 0; return; } //    rear front  ,        if (queue.rear > queue.front) { *len = *len <= (queue.rear-queue.front) ? *len : (queue.rear-queue.front);         memcpy(pElement, &queue.data[queue.front], *len);         queue.front += *len; } else //   rear front   { //          rear+(MAX_SIZE+1-front) *len = *len <= queue.rear+(MAX_SIZE+1-queue.front) ? *len : queue.rear+(MAX_SIZE+1-queue.front); //         *len       ,       MAX_SIZE+1-queue.front if (*len <= MAX_SIZE+1-queue.front) {             memcpy(pElement, &queue.data[queue.front], *len);             queue.front = (queue.front + *len) % (MAX_SIZE+1); } else //       ,      ,       {             memcpy(pElement, &queue.data[queue.front], (MAX_SIZE+1-queue.front));             queue.front = *len-(MAX_SIZE+1-queue.front);             memcpy(&pElement[*len-queue.front], &queue.data[0], queue.front); } } } unsigned int lenQueue() //          { return (queue.rear+MAX_SIZE+1-queue.front)%(MAX_SIZE+1); } /////////////////////////////////      /////////////////////////////////// #define MAX_L_SIZE      1024*1024/56 //1024*1024/56+1 struct LQueue
{ unsigned int data[MAX_L_SIZE]; unsigned int front; unsigned int rear; }lqueue; void initLQueue() {     memset(lqueue.data, '\0', sizeof(lqueue.data));     lqueue.front = 0;     lqueue.rear = 0; } void enLQueue(unsigned int *len) //     len, len   0,    len   ,    len 0 { if ((lqueue.rear+1)%MAX_L_SIZE == lqueue.front) //      { *len = 0; } else {         lqueue.data[lqueue.rear] = *len;         lqueue.rear = (lqueue.rear+1)%MAX_L_SIZE; } } void deLQueue(unsigned int *len) //       len  ,len 0      { if (lqueue.rear == lqueue.front) //      { *len = 0; } else { *len = lqueue.data[lqueue.front];         lqueue.data[lqueue.front] = 0; //      0         lqueue.front = (lqueue.front+1)%MAX_L_SIZE; } } unsigned int lenLQueue() //         len   { return (lqueue.rear+MAX_L_SIZE-lqueue.front)%MAX_L_SIZE; } /////////////////////////////////    /////////////////////////////////// #endif #undef __DTU_INNER_FUNC__


//             ////////////////////////////////////////////////////////////////////// //         ,              ,           unsigned char dtu_buffer_add_data(const unsigned char *pbuf, unsigned int len) { unsigned int len_t = 0; int i = 0; if ((pbuf==NULL) || (len==0)) { return 0; }     MUTEX_BEGIN; while (MAX_SIZE-lenQueue() < len) //        ,          {         deLQueue(&len_t);         deQueue((unsigned char*)g_dtu_buffer, &len_t);         trace_print("add_data deQueue【%d-%s】\r
"
, len_t, g_dtu_buffer); } if (MAX_L_SIZE==lenLQueue()+1) // , { deLQueue(&len_t); deQueue((unsigned char*)g_dtu_buffer, &len_t); trace_print("add_data deQueue【%d-%s】\r
"
, len_t, g_dtu_buffer); } for (i=len-DTU_DATA_LEN; i>=0; i-=DTU_DATA_LEN) // i , 0, , 0 { len_t = DTU_DATA_LEN; trace_print("lenQueue=%d,%d,%d\r
"
, lenQueue(), len_t, len-i-DTU_DATA_LEN); enLQueue(&len_t); enQueue((unsigned char*)&pbuf[len-i-DTU_DATA_LEN], &len_t); } // len_t = len%DTU_DATA_LEN; if (len_t) { enLQueue(&len_t); enQueue((unsigned char*)&pbuf[len-len_t], &len_t); trace_print("lenQueue=%d,%d\r
"
, lenQueue(), len_t); } MUTEX_END; return 1; } // unsigned char dtu_buffer_get_data(unsigned char* pbuf, unsigned int* len) { unsigned char result = 0; if (pbuf==NULL) return result; MUTEX_BEGIN; deLQueue((unsigned int*)len); deQueue((unsigned char*)pbuf, (unsigned int*)len); if (*len) // , 1 { result = 1; } MUTEX_END; return result; } /////////////////////////////////////////////////////////////////////////
 
 
//          
    /////////////////////////////           initQueue();     initLQueue(); /////////////////////////////        

 
/ / 그리고 두 함 수 를 호출 하여 데 이 터 를 액세스 합 니 다. 위의 배열 대기 열 은 대외 인터페이스 에 두 개의 함수 와 초기 화 함수 만 있 습 니 다.
//      dtu_buffer_add_data((unsigned char*)uart_buffer2, len); //           //      if (KAL_TRUE==dtu_buffer_get_data((unsigned char*)g_send_data_buffer, (unsigned int*)&len)) //     {     g_send_data_buffer[len] = '\0';     u8_heartbeat_times = 0; }

 
 데이터 큐 테스트 원형 참조http://blog.csdn.net/zeroboundary/article/details/9295979
 

좋은 웹페이지 즐겨찾기