HeapCrash / Challenges / CAN receive filter and handler

CAN receive filter and handler

A body-control node on a bxCAN-based STM32 accepts standard 11-bit frames 0x100–0x10F: one per remote node's status, and 0x100 as the command frame. It reacts to frames meant for other nodes, never sees status from nodes 0x101–0x10F, an extended frame once triggered a command, and a malformed frame corrupted its state.

The code

Embedded C for Cortex-M. It compiles. There are 3 real bugs in it: the kind that pass a bench test and fail in the field.

typedef struct { uint32_t id; uint8_t ide; uint8_t dlc; uint8_t data[8]; } can_frame_t;
static uint8_t node_state[16][8];

void can_filter_init(void)
{
    CAN1->FMR |= 1u;                 /* filter init mode */
    CAN1->FS1R |= 1u;                /* bank 0: 32-bit */
    CAN1->FM1R &= ~1u;               /* mask mode */
    CAN1->sFilterRegister[0].FR1 = 0x100u << 21;
    CAN1->sFilterRegister[0].FR2 = 0x00Fu << 21;   /* low 4 bits: any node */
    CAN1->FA1R |= 1u;
    CAN1->FMR &= ~1u;
}

void CAN1_RX0_IRQHandler(void)
{
    can_frame_t f;
    can_read_fifo0(&f);
    can_release_fifo0();
    uint8_t node = f.id & 0x0F;
    memcpy(node_state[node], f.data, f.dlc);
    if (f.id == 0x100) {
        apply_command(f.data);
    }
}

What an interviewer expects

The bugs, reference fixes and the follow-up question are in the practice app, after you've tried it.

Companies that test this

Matched on the skills each company's embedded roles emphasise.

Related challenges

Flag the lines, say what breaks, then fix it and build it with clang in your browser.

Find the bugs