Second cyphal message not accepted

Hello,

I am running CAN communication between two nodes, A to B, using cyphal and libcanard C libraries, on STM32 u585. B is subscribed for serving 3 services on port IDs: 435, 121 and 220, in this order.

I am trying to send several messages #435 (only one frame, size 4 bytes) from A to B. The first one is received correctly and accepted by canardRxAccept(). When the second message comes, the canardRxAccept() fails in cavlSearch() - it fails in CAVL_ASSERT((NULL == *n) || ((*n)->up == up)) macro. The strange thing is that if I comment out this macro, any number of messages is accepted and handled.

I tried to dig into the problem and compared difference in the first and the second message, in evaluating the macro. If I name the conditions in the macro as c1 and c2 then the first message conditions are false true while the second false false.
Going deeper, c2 defined as L == R, for the first message L= last_subscription, R=last_subscription, while for the second message L= first subscription, R=last_subscription.

Another observation - if I remove either #121 or #220 subscription then everything works correctly as expected.

Do you have any idea:

  • why the first and the second message are processed differently
  • if I disable the macro all messages are processed correctly?

I guess it’s some memory problem? The cavlSearch() is for some reason “lost”.

Thanx.
Best regards,
peter

You have a memory corruption. It could be caused by dangling pointers, stack overflow, race conditions, etc.

Hi Pavel,

thanx for a prompt reply. That is what I also suspect. After all the subscriptions are made, should the base tree be constant through the all subscriptions?

Thanx.
Best regards,
peter

The topology of the tree will not be altered unless you add or remove subscriptions. The node states, however, will be altered as the library serves incoming traffic.