임 베 디 드 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.