USB-DAC4のプログラムのうち、UART関連は自分でゼロから書き直しましたのでそこだけ公開
高速ですし、割り込みでも、メイン関数でも、どこから呼んでもバッファさえあれば
安定して動作すると思います。オーバーフローすると、前の文字を上書きしますが、
プログラムの動作のうち問題になるのは、前の文字が消え、一時的に文字の順番が変になるだけです。
それ以外の予期せぬ動作にはならないでしょう。
何が大事かというと__sync_add_and_fetchで、排他的な制御をしています。
CRLFを追加していますが、必要ないかもしれません。
ターゲットデバイス
PIC32MZ2048EFH064
// 2のN乗の数に設定する
#define UART_TXBUF_SIZE 2048
// 適当に
#define UART_MAX_LEN 128
uint8_t Ring[UART_TXBUF_SIZE] = { 0 };
#define UART_MASK (UART_TXBUF_SIZE - 1)
uint32_t UART_RingRead = 0;
uint32_t UART_RingWrite = 0;
void UART_Task()
{
uint8_t c = Ring[UART_RingRead];
if (c != 0)
{
if(!(U1STA & _U1STA_UTXBF_MASK))
{
// 1Byte送信
U1TXREG = c;
Ring[UART_RingRead] = 0;
UART_RingRead = (UART_RingRead + 1) & UART_MASK;
}
}
}
void UART_Print(const char *pFormat, ...)
{
char buf[UART_MAX_LEN];
va_list args = { 0 };
va_start(args, pFormat);
int nLen = vsnprintf(buf, UART_MAX_LEN, pFormat, args);
int nLen2 = nLen + 2;
int cur = (__sync_add_and_fetch(&UART_RingWrite, nLen2) - nLen2) & UART_MASK;
for(int i = 0; i < nLen; i++){
Ring[cur] = buf[i];
cur = (cur + 1) & UART_MASK;
}
Ring[cur] = 13;
cur = (cur + 1) & UART_MASK;
Ring[cur] = 10;
}