2016-11-10 3 views
0

В настоящий момент я работаю над проектом, на котором несколько процессоров взаимодействуют между ними, используя шину can. Главный контроллер (биглевая кость) управляет другим устройством, используя шину CAN. Используя сокет может linux framework, я написал proccess, который читает сообщения о сообщениях, отправляемые с других устройств, и теперь я хочу помещать сообщения, которые я получаю в FIFO-буфер, а затем обрабатывать сообщения. Так что мне нужно написать буфер FIFO с внутренней структурой can_frame.Как создать буфер FIFO с структурой can_frame внутри?

Например:

struct can_buffer { 
    struct can_frame *frames; 
    int head; 
    int tail; 
    int size; 
}; 

can_buffer new_can_buffer (size_t capacity) 
{ 
    can_buffer rb = malloc(sizeof(struct can_buffer)); 
    if (rb) { 

     /* One byte is used for detecting the full condition. */ 
     rb->size = capacity + 1; 
     rb->frames = malloc(rb->size * sizeof(struct can_frame)); 
     if (rb->frames) 
      can_buffer_reset(rb); 
     else { 
      free(rb); 
      return 0; 
     } 
    } 
    return rb; 
} 

size_t can_buffer_size(const struct can_buffer *rb) 
{ 
    return rb->size; 
} 

size_t can_buffer_capacity(const struct can_buffer *rb) 
{ 
    return can_buffer_buffer_size(rb) - 1; 
} 

size_t can_buffer_free(const struct can_buffer *rb) 
{ 
    if (rb->head >= rb->tail) 
     return can_buffer_capacity(rb) - (rb->head - rb->tail); 
    else 
     return rb->tail - rb->head - 1; 
} 

int can_buffer_is_full(const struct can_buffer *rb) 
{ 
    return can_buffer_free(rb) == 0; 
} 

int can_buffer_is_empty(const struct can_buffer *rb) 
{ 
    return can_buffer_free(rb) ==can_buffer_capacity(rb); 
} 

void can_buffer_reset(can_buffer rb) 
{ 
    rb->head = rb->tail = 0; 
} 

......... ........

/* Добавить сообщение в конец очереди. */

void can_buffer_push(struct can_buffer *cb, struct can_frame *frame) 
{ 
    memcpy(&cb->frames[cb->tail], frame, sizeof(struct can_frame)); 
    cb->tail = (cb->tail + 1) % cb->size; 
} 

/* Retrieve message from the start of the queue. */ 
can_frame *can_buffer_pop(struct can_buffer *cb) 
{ 
    struct can_frame *frame; 
    memcpy(frame, &cb->frames[cb->head], sizeof(struct can_frame)); 
    cb->head = (cb->head + 1) % cb->size; 
    return frame; 
} 

Но я могу сделать это успешно. Я думаю, проблема в том, что каждая структура can_frame внутри является структурой снова, то есть проблема (например, int, char и т. Д.), Но я не знаю, как решить эту проблему.

Как я могу создать буфер FIFO, который может хранить структуру can_frame внутри?

мне нужно написать это в C lagnuage

в основном я называю

can_buffer can_buff; 

can_buff = new_can_buffer(100); 

can_buffer_push(can_buff,frame); 

кадром = can_frame я получил

can_buff = ФИФО буфер

ответ

0

Ну, вы не полностью изменены ringbuf подпрограмм. В частности, вы не выделяют достаточно места для структур здесь:

if (rb) { 

    /* One byte is used for detecting the full condition. */ 
    rb->size = capacity + 1; 
    rb->frames = malloc(rb->size); 
    if (rb->frames) 
     ringbuf_reset(rb); 
    else { 
     free(rb); 
     return 0; 
    } 
} 

The malloc должно быть

rb->frames = malloc(rb->size * sizeof(struct can_frame)); 

И вы должны обновить ringbuf_reset() вызов на следующую строку в ваш переименованы can_buffer_reset()


Добавление:

Я просто заметил, что также необходимо обновить ringbuf_reset() функцию rb->head = rb->tail = 0


Добавление 2:

Реферирование вновь добавленный код, can_buffer_pop() не будет правильно работать, поскольку это не проверяет сообщения существующего и он не выделяет память для всплывающего сообщения.

Существует также опечатка в can_buffer_capacity().

Редакция: Я бы настоятельно рекомендовал написать простую тестовую программу, которая выполняет эти функции. Это расстраивает, но поймает ряд этих мелких ошибок.

+0

Я только что отредактировал функции! can_buffer_push в порядке? Вы можете помочь мне закончить это? –

+0

ok в момент написания тестовой программы. Спасибо за все ваше время. Можете ли вы исправить неправильный код? Пожалуйста, помогите мне за это! –