ソースを参照

Merge pull request #245 from tni/fix-analogwrite

analogWrite() can fail with LTO. Fix casts with undefined behavior.
main
Paul Stoffregen 8年前
コミット
0400e066fd
1個のファイルの変更7行の追加4行の削除
  1. +7
    -4
      teensy3/analog.c

+ 7
- 4
teensy3/analog.c ファイルの表示

#endif #endif
} }


typedef int16_t __attribute__((__may_alias__)) aliased_int16_t;


void analogWriteDAC0(int val) void analogWriteDAC0(int val)
{ {
} }
if (val < 0) val = 0; // TODO: saturate instruction? if (val < 0) val = 0; // TODO: saturate instruction?
else if (val > 4095) val = 4095; else if (val > 4095) val = 4095;
*(int16_t *)&(DAC0_DAT0L) = val;

*(volatile aliased_int16_t *)&(DAC0_DAT0L) = val;
#elif defined(__MKL26Z64__) #elif defined(__MKL26Z64__)
SIM_SCGC6 |= SIM_SCGC6_DAC0; SIM_SCGC6 |= SIM_SCGC6_DAC0;
if (analog_reference_internal == 0) { if (analog_reference_internal == 0) {
} }
if (val < 0) val = 0; if (val < 0) val = 0;
else if (val > 4095) val = 4095; else if (val > 4095) val = 4095;
*(int16_t *)&(DAC0_DAT0L) = val;

*(volatile aliased_int16_t *)&(DAC0_DAT0L) = val;
#endif #endif
} }


} }
if (val < 0) val = 0; // TODO: saturate instruction? if (val < 0) val = 0; // TODO: saturate instruction?
else if (val > 4095) val = 4095; else if (val > 4095) val = 4095;
*(int16_t *)&(DAC1_DAT0L) = val;

*(volatile aliased_int16_t *)&(DAC1_DAT0L) = val;
} }
#endif #endif



読み込み中…
キャンセル
保存