atsame5x: reduce heap allocation

Этот коммит содержится в:
sago35 2022-11-25 20:16:45 +09:00 коммит произвёл Ron Evans
родитель 7aca814954
коммит 5293d3e5f0
3 изменённых файлов: 51 добавлений и 30 удалений

Просмотреть файл

@ -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")
}
}
}

Просмотреть файл

@ -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")
}
}
}

Просмотреть файл

@ -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