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;
    
}