Собсно, вот код, в инклудах особо интересного ничего нет - в основном заголовки функций. Си-шные тоже не при делах - они потом не менялись, а менялся именно этот - где прием-передача. Ну, ваш выход, коллега (иначе - брехло! (хотя это и так уже понятно):
#include "can.h"
#include "Attrdata.h"
#include "Ocbdata.h"
#include "can_srr.h"
#include "sja1000.h"
#include "rm_main.h"
#include <atomic.h>
...
...
void Received(struct Attrdata * attrdata) {
unsigned to, from, size;
uint64_t buf_to;
uint64_t ibuf_from;
int msgs_to_read;
int msgs_unread;
int msgs_from_buf;
int rcvid;
int channel;
iov_t iov [2];
entry* item;
entry* next;
Ibuf* ibuf;
Irq_buf* irq_buf;
irq_buf = attrdata->irq_buf;
ibuf = attrdata->ibuf;
to = irq_buf->to;
from = irq_buf->from;
size = irq_buf->size;
while (from != to) {
buf_to = ibuf->to % ibuf->size;
ibuf->buf [buf_to] = irq_buf->buf [from];
ibuf->to++;
if (from != size - 1)
atomic_add (&irq_buf->from, 1);
else
atomic_clr (&irq_buf->from, 0xFFFFFFFF);
from = irq_buf->from;
}
item = STAILQ_FIRST (&attrdata->iq);
while (item != NULL) {
rcvid = item->rcvid;
msgs_to_read = item->total;
ibuf_from = item->ocbdata->from;
msgs_unread = ibuf->to - ibuf_from;
msgs_from_buf = min (msgs_to_read, msgs_unread);
Ibuf_WhereToReadFrom (ibuf, iov, msgs_from_buf, ibuf_from);
MsgReplyv (rcvid, msgs_from_buf, iov, 2);
item->ocbdata->from += msgs_from_buf;
next = STAILQ_NEXT (item, entries);
STAILQ_REMOVE (&attrdata->iq, item, entry, entries);
free (item);
item = next;
}
channel = attrdata->channel;
if (IOFUNC_NOTIFY_INPUT_CHECK (all_the_attrs [channel]->notify, 1, 0)) {
iofunc_notify_trigger (all_the_attrs [channel]->notify, 1,
IOFUNC_NOTIFY_INPUT);
}
}
void Sent(struct Attrdata * attrdata) {
int rest, free_space;
int msgs_to_buf, shift;
int channel;
iov_t iov [2];
entry* item;
Obuf* obuf;
obuf = attrdata->obuf;
obuf->from++;
if (!STAILQ_EMPTY(&attrdata->oq)) {
item = STAILQ_FIRST(&attrdata->oq);
rest = item->total - item->already;
free_space = Obuf_FreeSpace (obuf);
if (rest == free_space || free_space == obuf->size) {
msgs_to_buf = free_space;
shift = sizeof (can_r_msg_t) + sizeof(can_msg_t) * item->already;
Obuf_WhereToWriteTo (obuf, iov, msgs_to_buf);
MsgReadv (item->rcvid, iov, 2, shift);
obuf->to += msgs_to_buf;
item->already += msgs_to_buf;
if (item->already == item->total) {
item->ocbdata->num_of_last = obuf->to;
MsgReply (item->rcvid, item->total, NULL, 0);
STAILQ_REMOVE_HEAD(&attrdata->oq, entries);
free (item);
}
}
}
item = STAILQ_FIRST (&attrdata->dq);
while (item != NULL) {
if (item->ocbdata->num_of_last <= obuf->from) {
MsgReply (item->rcvid, EOK, NULL, 0);
STAILQ_REMOVE (&attrdata->dq, item, entry, entries);
free (item);
break;
} else
item = STAILQ_NEXT (item, entries);
}
free_space = Obuf_FreeSpace (obuf);
if (free_space > 0) {
channel = attrdata->channel;
if (IOFUNC_NOTIFY_OUTPUT_CHECK (all_the_attrs [channel]->notify, 1))
iofunc_notify_trigger (all_the_attrs [channel]->notify, 1,
IOFUNC_NOTIFY_OUTPUT);
}
if (obuf->to > obuf->from)
SJA_WriteCanMsg (attrdata->base, Obuf_MsgToLine (obuf));
}