atsame5x: reduce heap allocation
Этот коммит содержится в:
родитель
7aca814954
коммит
5293d3e5f0
3 изменённых файлов: 51 добавлений и 30 удалений
|
@ -37,7 +37,11 @@ func main() {
|
||||||
fmt.Printf("CAN0 %d\r\n", sz0)
|
fmt.Printf("CAN0 %d\r\n", sz0)
|
||||||
for i := 0; i < sz0; i++ {
|
for i := 0; i < sz0; i++ {
|
||||||
can0.RxRaw(&rxMsg)
|
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)
|
fmt.Printf("CAN1 %d\r\n", sz1)
|
||||||
for i := 0; i < sz1; i++ {
|
for i := 0; i < sz1; i++ {
|
||||||
can1.RxRaw(&rxMsg)
|
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"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
can0 = machine.CAN0
|
||||||
|
can1 = machine.CAN1
|
||||||
|
ch = make(chan canMsg, 10)
|
||||||
|
)
|
||||||
|
|
||||||
type canMsg struct {
|
type canMsg struct {
|
||||||
ch byte
|
bus byte
|
||||||
id uint32
|
can machine.CANRxBufferElement
|
||||||
dlc byte
|
|
||||||
data []byte
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
ch := make(chan canMsg, 10)
|
go print(ch)
|
||||||
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")
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
can1 := machine.CAN1
|
|
||||||
can1.Configure(machine.CANConfig{
|
can1.Configure(machine.CANConfig{
|
||||||
TransferRate: machine.CANTransferRate500kbps,
|
TransferRate: machine.CANTransferRate500kbps,
|
||||||
TransferRateFD: machine.CANTransferRate1000kbps,
|
TransferRateFD: machine.CANTransferRate1000kbps,
|
||||||
|
@ -39,16 +29,18 @@ func main() {
|
||||||
Standby: machine.CAN1_STANDBY,
|
Standby: machine.CAN1_STANDBY,
|
||||||
})
|
})
|
||||||
// RF0NE : Rx FIFO 0 New Message Interrupt Enable
|
// 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{}
|
rxMsg := machine.CANRxBufferElement{}
|
||||||
can1.RxRaw(&rxMsg)
|
can.RxRaw(&rxMsg)
|
||||||
m := canMsg{ch: 1, id: rxMsg.ID, dlc: rxMsg.DLC, data: rxMsg.Data()}
|
msg := canMsg{
|
||||||
|
bus: 1,
|
||||||
|
can: rxMsg,
|
||||||
|
}
|
||||||
select {
|
select {
|
||||||
case ch <- m:
|
case ch <- msg:
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
can0 := machine.CAN0
|
|
||||||
can0.Configure(machine.CANConfig{
|
can0.Configure(machine.CANConfig{
|
||||||
TransferRate: machine.CANTransferRate500kbps,
|
TransferRate: machine.CANTransferRate500kbps,
|
||||||
TransferRateFD: machine.CANTransferRate1000kbps,
|
TransferRateFD: machine.CANTransferRate1000kbps,
|
||||||
|
@ -57,12 +49,15 @@ func main() {
|
||||||
Standby: machine.NoPin,
|
Standby: machine.NoPin,
|
||||||
})
|
})
|
||||||
// RF0NE : Rx FIFO 0 New Message Interrupt Enable
|
// 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{}
|
rxMsg := machine.CANRxBufferElement{}
|
||||||
can0.RxRaw(&rxMsg)
|
can.RxRaw(&rxMsg)
|
||||||
m := canMsg{ch: 2, id: rxMsg.ID, dlc: rxMsg.DLC, data: rxMsg.Data()}
|
msg := canMsg{
|
||||||
|
bus: 1,
|
||||||
|
can: rxMsg,
|
||||||
|
}
|
||||||
select {
|
select {
|
||||||
case ch <- m:
|
case ch <- msg:
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -73,3 +68,16 @@ func main() {
|
||||||
time.Sleep(time.Millisecond * 1000)
|
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)]
|
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.
|
// CANDlcToLength() converts a DLC value to its actual length.
|
||||||
func CANDlcToLength(dlc byte, isFD bool) byte {
|
func CANDlcToLength(dlc byte, isFD bool) byte {
|
||||||
length := dlc
|
length := dlc
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче