私は Arduino について何も知りませんが、これがほとんどのマイクロコントローラーで一般的に行われている方法は、周辺機器のレジスター領域 (この場合はシリアルポート) をまっすぐ指すことです。MCU がこれらのレジスタを次のようにマップするとします。
// serial port 1
0x1234 SERIAL_CONTROL_REG
0x1235 SERIAL_DATA_REG
0x1236 SERIAL_STATUS_REG
// serial port 2
0x2000 SERIAL_CONTROL_REG
0x2001 SERIAL_DATA_REG
0x2002 SERIAL_STATUS_REG
次に、次のように、ポインターを使用してポートを追跡できます。
#define SERIAL_PORT1 ((volatile uint8_t*)0x1234)
#define SERIAL_PORT2 ((volatile uint8_t*)0x2000)
typedef volatile uint8_t* serial_port_t;
...
serial_port_t port;
if (something == somethingElse)
port = SERIAL_PORT1;
else
port = SERIAL_PORT2;
これをさらに拡張して、たとえばマクロでレジスタを変数として使用できるようにすることができます。
#define SERIAL_CONTROL_REG(offset) (*(offset + 0))
#define SERIAL_DATA_REG(offset) (*(offset + 1))
#define SERIAL_STATUS_REG(offset) (*(offset + 2))
if(SERIAL_STATUS_REG(port) & some_mask)
{
SERIAL_DATA_REG(port) = 0xAA;
}
これは、複数の同一ポートを搭載した MCU ペリフェラル用の一般的なハードウェア ドライバーを作成する一般的な方法です。