目前我正在开发一个项目,在这个项目上,几个处理器之间通过can总线进行通信。主控制器(beagle bone)使用can总线控制另一个设备。使用套接字可以在linux框架中编写一个proccess,它读取从其他设备发送的can消息,现在我想将我收到的消息放入FIFO bufer,然后对消息进行obrabotam。 所以我需要在内部编写带有can_frame结构的FIFO缓冲区。
例如:
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等),但我不知道如何解决这个问题。
如何创建一个可以存储can_frame结构的FIFO缓冲区?
我需要在C lagnuage
中写这个 主打电话
can_buffer can_buff;
can_buff = new_can_buffer(100);
can_buffer_push(can_buff,frame);
frame = can_frame我收到了
can_buff = fifo buffer
答案 0 :(得分: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;
}
}
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()
中也有拼写错误。
编辑: 我强烈建议编写一个执行这些功能的简单测试程序。令人沮丧,但会抓住这些小问题。