From 5293d3e5f0fca3afb73295e114fe9f151766b17f Mon Sep 17 00:00:00 2001 From: sago35 Date: Fri, 25 Nov 2022 20:16:45 +0900 Subject: [PATCH] atsame5x: reduce heap allocation --- src/examples/can/main.go | 12 +++++- src/examples/caninterrupt/main.go | 64 ++++++++++++++++------------- src/machine/machine_atsame5x_can.go | 5 +++ 3 files changed, 51 insertions(+), 30 deletions(-) diff --git a/src/examples/can/main.go b/src/examples/can/main.go index 7d5de82b..c86a27b9 100644 --- a/src/examples/can/main.go +++ b/src/examples/can/main.go @@ -37,7 +37,11 @@ func main() { fmt.Printf("CAN0 %d\r\n", sz0) for i := 0; i < sz0; i++ { can0.RxRaw(&rxMsg) - fmt.Printf("-> %08X %X %#v\r\n", rxMsg.ID, rxMsg.DLC, rxMsg.Data()) + fmt.Printf("-> %08X %X", rxMsg.ID, rxMsg.DLC) + for j := byte(0); j < rxMsg.Length(); j++ { + fmt.Printf(" %02X", rxMsg.DB[j]) + } + fmt.Printf("\r\n") } } @@ -46,7 +50,11 @@ func main() { fmt.Printf("CAN1 %d\r\n", sz1) for i := 0; i < sz1; i++ { can1.RxRaw(&rxMsg) - fmt.Printf("-> %08X %X %#v\r\n", rxMsg.ID, rxMsg.DLC, rxMsg.Data()) + fmt.Printf("-> %08X %X", rxMsg.ID, rxMsg.DLC) + for j := byte(0); j < rxMsg.Length(); j++ { + fmt.Printf(" %02X", rxMsg.DB[j]) + } + fmt.Printf("\r\n") } } } diff --git a/src/examples/caninterrupt/main.go b/src/examples/caninterrupt/main.go index 69b0b4d3..45aeff02 100644 --- a/src/examples/caninterrupt/main.go +++ b/src/examples/caninterrupt/main.go @@ -7,30 +7,20 @@ import ( "time" ) +var ( + can0 = machine.CAN0 + can1 = machine.CAN1 + ch = make(chan canMsg, 10) +) + type canMsg struct { - ch byte - id uint32 - dlc byte - data []byte + bus byte + can machine.CANRxBufferElement } func main() { - ch := make(chan canMsg, 10) - go func() { - for { - select { - case m := <-ch: - fmt.Printf("%d %03X %X ", m.ch, m.id, m.dlc) - for _, d := range m.data { - fmt.Printf("%02X ", d) - } - fmt.Printf("\r\n") - } + go print(ch) - } - }() - - can1 := machine.CAN1 can1.Configure(machine.CANConfig{ TransferRate: machine.CANTransferRate500kbps, TransferRateFD: machine.CANTransferRate1000kbps, @@ -39,16 +29,18 @@ func main() { Standby: machine.CAN1_STANDBY, }) // RF0NE : Rx FIFO 0 New Message Interrupt Enable - can1.SetInterrupt(sam.CAN_IE_RF0NE, func(*machine.CAN) { + can1.SetInterrupt(sam.CAN_IE_RF0NE, func(can *machine.CAN) { rxMsg := machine.CANRxBufferElement{} - can1.RxRaw(&rxMsg) - m := canMsg{ch: 1, id: rxMsg.ID, dlc: rxMsg.DLC, data: rxMsg.Data()} + can.RxRaw(&rxMsg) + msg := canMsg{ + bus: 1, + can: rxMsg, + } select { - case ch <- m: + case ch <- msg: } }) - can0 := machine.CAN0 can0.Configure(machine.CANConfig{ TransferRate: machine.CANTransferRate500kbps, TransferRateFD: machine.CANTransferRate1000kbps, @@ -57,12 +49,15 @@ func main() { Standby: machine.NoPin, }) // RF0NE : Rx FIFO 0 New Message Interrupt Enable - can0.SetInterrupt(sam.CAN_IE_RF0NE, func(*machine.CAN) { + can0.SetInterrupt(sam.CAN_IE_RF0NE, func(can *machine.CAN) { rxMsg := machine.CANRxBufferElement{} - can0.RxRaw(&rxMsg) - m := canMsg{ch: 2, id: rxMsg.ID, dlc: rxMsg.DLC, data: rxMsg.Data()} + can.RxRaw(&rxMsg) + msg := canMsg{ + bus: 1, + can: rxMsg, + } select { - case ch <- m: + case ch <- msg: } }) @@ -73,3 +68,16 @@ func main() { time.Sleep(time.Millisecond * 1000) } } + +func print(ch <-chan canMsg) { + for { + select { + case m := <-ch: + fmt.Printf("%d %03X %X ", m.bus, m.can.ID, m.can.DLC) + for _, d := range m.can.DB[:m.can.Length()] { + fmt.Printf("%02X ", d) + } + fmt.Printf("\r\n") + } + } +} diff --git a/src/machine/machine_atsame5x_can.go b/src/machine/machine_atsame5x_can.go index 6215750b..46b2c9e7 100644 --- a/src/machine/machine_atsame5x_can.go +++ b/src/machine/machine_atsame5x_can.go @@ -424,6 +424,11 @@ func (e CANRxBufferElement) Data() []byte { return e.DB[:CANDlcToLength(e.DLC, e.FDF)] } +// Length returns its actual length. +func (e CANRxBufferElement) Length() byte { + return CANDlcToLength(e.DLC, e.FDF) +} + // CANDlcToLength() converts a DLC value to its actual length. func CANDlcToLength(dlc byte, isFD bool) byte { length := dlc