瀏覽代碼

Update DMAChannel.h

Changed  DMABaseClass::source() and destination() to use p's address instead of its value in the if-clause. Taking the value could result in unwated read operations from I/O locations, resulting in data loss.
main
crteensy 10 年之前
父節點
當前提交
e0fdda1918
共有 1 個文件被更改,包括 6 次插入6 次删除
  1. +6
    -6
      teensy3/DMAChannel.h

+ 6
- 6
teensy3/DMAChannel.h 查看文件

TCD->SADDR = &p; TCD->SADDR = &p;
TCD->SOFF = 0; TCD->SOFF = 0;
TCD->ATTR_SRC = 0; TCD->ATTR_SRC = 0;
if ((uint32_t)p < 0x40000000 || TCD->NBYTES == 0) TCD->NBYTES = 1;
if ((uint32_t)&p < 0x40000000 || TCD->NBYTES == 0) TCD->NBYTES = 1;
TCD->SLAST = 0; TCD->SLAST = 0;
} }
void source(volatile const signed short &p) { source(*(volatile const uint16_t *)&p); } void source(volatile const signed short &p) { source(*(volatile const uint16_t *)&p); }
TCD->SADDR = &p; TCD->SADDR = &p;
TCD->SOFF = 0; TCD->SOFF = 0;
TCD->ATTR_SRC = 1; TCD->ATTR_SRC = 1;
if ((uint32_t)p < 0x40000000 || TCD->NBYTES == 0) TCD->NBYTES = 2;
if ((uint32_t)&p < 0x40000000 || TCD->NBYTES == 0) TCD->NBYTES = 2;
TCD->SLAST = 0; TCD->SLAST = 0;
} }
void source(volatile const signed int &p) { source(*(volatile const uint32_t *)&p); } void source(volatile const signed int &p) { source(*(volatile const uint32_t *)&p); }
TCD->SADDR = &p; TCD->SADDR = &p;
TCD->SOFF = 0; TCD->SOFF = 0;
TCD->ATTR_SRC = 2; TCD->ATTR_SRC = 2;
if ((uint32_t)p < 0x40000000 || TCD->NBYTES == 0) TCD->NBYTES = 4;
if ((uint32_t)&p < 0x40000000 || TCD->NBYTES == 0) TCD->NBYTES = 4;
TCD->SLAST = 0; TCD->SLAST = 0;
} }


TCD->DADDR = &p; TCD->DADDR = &p;
TCD->DOFF = 0; TCD->DOFF = 0;
TCD->ATTR_DST = 0; TCD->ATTR_DST = 0;
if ((uint32_t)p < 0x40000000 || TCD->NBYTES == 0) TCD->NBYTES = 1;
if ((uint32_t)&p < 0x40000000 || TCD->NBYTES == 0) TCD->NBYTES = 1;
TCD->DLASTSGA = 0; TCD->DLASTSGA = 0;
} }
void destination(volatile signed short &p) { destination(*(volatile uint16_t *)&p); } void destination(volatile signed short &p) { destination(*(volatile uint16_t *)&p); }
TCD->DADDR = &p; TCD->DADDR = &p;
TCD->DOFF = 0; TCD->DOFF = 0;
TCD->ATTR_DST = 1; TCD->ATTR_DST = 1;
if ((uint32_t)p < 0x40000000 || TCD->NBYTES == 0) TCD->NBYTES = 2;
if ((uint32_t)&p < 0x40000000 || TCD->NBYTES == 0) TCD->NBYTES = 2;
TCD->DLASTSGA = 0; TCD->DLASTSGA = 0;
} }
void destination(volatile signed int &p) { destination(*(volatile uint32_t *)&p); } void destination(volatile signed int &p) { destination(*(volatile uint32_t *)&p); }
TCD->DADDR = &p; TCD->DADDR = &p;
TCD->DOFF = 0; TCD->DOFF = 0;
TCD->ATTR_DST = 2; TCD->ATTR_DST = 2;
if ((uint32_t)p < 0x40000000 || TCD->NBYTES == 0) TCD->NBYTES = 4;
if ((uint32_t)&p < 0x40000000 || TCD->NBYTES == 0) TCD->NBYTES = 4;
TCD->DLASTSGA = 0; TCD->DLASTSGA = 0;
} }



Loading…
取消
儲存