Ich habe versucht, Warteschlange von Array und Zeigern in C-Sprache zu implementieren. Die Warteschlange durch C Struktur modelliert wirdWarteschlange in C-Array mit Zeigern
// Circular Buffer
typedef struct{
main_controller_req_t buffer[BUFFER_SIZE]; // buffer
uint16_t size; // length of the queue
uint16_t count; // number of elements present in the queue
main_controller_req_t *p_head; // pointer to head of the queue (read end)
main_controller_req_t *p_tail; // pointer to tail of the queue (write end)
}circular_buffer_t;
I Funktion für Warteschlangen Initialisierung
void init_cb(circular_buffer_t *p_cb){
p_cb->p_head = p_cb->buffer;
p_cb->p_tail = p_cb->buffer;
p_cb->count = 0;
p_cb->size = BUFFER_SIZE;
}
und Funktion zum Einfügen in die Warteschlange
BOOL enqueue_cb(circular_buffer_t *p_cb, main_controller_req_t *p_enq_elem){
if(p_cb->count < p_cb->size){
// queue contains at least one free element
taskENTER_CRITICAL();
// insert the element at the tail of queue
*(p_cb->p_tail) = *p_enq_elem;
// incrementing modulo size
p_cb->p_tail = (((p_cb->p_tail++) == (p_cb->buffer + p_cb->size)) ? (p_cb->buffer) : (p_cb->p_tail));
// one element added
p_cb->count++;
taskEXIT_CRITICAL();
return TRUE;
}else{
// queue is full
return FALSE;
}
}
Die enqueue_cb Funktion, bis das funktioniert gut umgesetzt haben Schwanz erreicht BUFFER_SIZE. Dann stürzt das Programm ab und uC wird zurückgesetzt. Das Problem ist in p_tail Zeiger-Update, aber ich verstehe nicht warum . Kann mir bitte jemand helfen? Danke im Voraus.
Ich schlage vor, dass Sie alle Ihre Bibliotheken, die nicht für die CPU auf Ihrem PC (Visual Studio oder ähnlich) abhängig sind. Es erleichtert das Debuggen und erzeugt weniger Fragen. – tilz0R
Bitte geben Sie einen kleinen Teil Ihrer Hauptfunktion an, wo Ihre Nutzung zum Absturz führt. –
@Steve> Sie können p_cb-> p_tail ** und ** in derselben Anweisung nicht mit '++' belegen. (Nun, um fair zu sein, können Sie, machen Sie nur Ihren Code schwierig zu verstehen, auch von sich selbst) – spectras