AP_DroneCAN: don't hold semaphore during CAN send

this mirrors the changes in the networking code, and ensures we don't
hold a semaphore that may be held by the main thread when we are doing
CAN sends
This commit is contained in:
Andrew Tridgell 2024-01-10 07:37:31 +11:00
parent 2ba3ac0a9e
commit 77fbe1dcfb

View File

@ -74,6 +74,9 @@ void AP_DroneCAN_Serial::update(void)
if (p.writebuffer == nullptr || p.node <= 0 || p.idx < 0) { if (p.writebuffer == nullptr || p.node <= 0 || p.idx < 0) {
continue; continue;
} }
uavcan_tunnel_Targetted pkt {};
uint32_t n = 0;
{
WITH_SEMAPHORE(p.sem); WITH_SEMAPHORE(p.sem);
uint32_t avail; uint32_t avail;
const bool send_keepalive = now_ms - p.last_send_ms > 500; const bool send_keepalive = now_ms - p.last_send_ms > 500;
@ -81,8 +84,7 @@ void AP_DroneCAN_Serial::update(void)
if (!send_keepalive && (ptr == nullptr || avail <= 0)) { if (!send_keepalive && (ptr == nullptr || avail <= 0)) {
continue; continue;
} }
uavcan_tunnel_Targetted pkt {}; n = MIN(avail, sizeof(pkt.buffer.data));
auto n = MIN(avail, sizeof(pkt.buffer.data));
pkt.target_node = p.node; pkt.target_node = p.node;
pkt.protocol.protocol = UAVCAN_TUNNEL_PROTOCOL_UNDEFINED; pkt.protocol.protocol = UAVCAN_TUNNEL_PROTOCOL_UNDEFINED;
pkt.buffer.len = n; pkt.buffer.len = n;
@ -92,8 +94,9 @@ void AP_DroneCAN_Serial::update(void)
if (ptr != nullptr) { if (ptr != nullptr) {
memcpy(pkt.buffer.data, ptr, n); memcpy(pkt.buffer.data, ptr, n);
} }
}
if (targetted->broadcast(pkt)) { if (targetted->broadcast(pkt)) {
WITH_SEMAPHORE(p.sem);
p.writebuffer->advance(n); p.writebuffer->advance(n);
p.last_send_ms = now_ms; p.last_send_ms = now_ms;
} }