В настоящий момент я работаю над проектом, на котором несколько процессоров взаимодействуют между ними, используя шину 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 = ФИФО буфер
Я только что отредактировал функции! can_buffer_push в порядке? Вы можете помочь мне закончить это? –
ok в момент написания тестовой программы. Спасибо за все ваше время. Можете ли вы исправить неправильный код? Пожалуйста, помогите мне за это! –