序文
覚えておいて、機能を実装する最初の、あなたはそれが機能をデバッグする方法を決定し、デバッグツールを完了するためにその準備ができているはずです。
シリアル印刷ログ情報は、最も一般的なデバッグツールは、ここで私は、デバッグツールを達成したいです。
その中でも、知識は連続切片でシリアルを補完します。
機能設計
次のように機能要件は以下のとおりです。
- トレース、errror、デバッグなどの印刷カテゴリラベル、
- 印刷ファイル名+行番号
- キーメッセージとパラメータを印刷
達成するための機能
-
シリアルポートの初期化
static VOID UART1_GpioInit(VOID) { GPIO_InitPara GPIO_InitStructure; RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOA , ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_PIN_9 ; GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ; GPIO_Init( GPIOA , &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_PIN_10; GPIO_InitStructure.GPIO_Mode = GPIO_MODE_IN_FLOATING;; GPIO_Init( GPIOA , &GPIO_InitStructure); } static VOID UART1_Config(VOID) { USART_InitPara USART_InitStructure; RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_USART1 , ENABLE); USART_DeInit( USART1 ); USART_InitStructure.USART_BRR = 115200; /* 波特率 */ USART_InitStructure.USART_WL = USART_WL_8B; /* 数据位 */ USART_InitStructure.USART_STBits = USART_STBITS_1; /* 停止位 */ USART_InitStructure.USART_Parity = USART_PARITY_RESET; /* 校验位 */ USART_InitStructure.USART_HardwareFlowControl = USART_HARDWAREFLOWCONTROL_NONE; /* 流控 */ USART_InitStructure.USART_RxorTx = USART_RXORTX_RX | USART_RXORTX_TX; /* 收发使能 */ USART_Init(USART1, &USART_InitStructure); } VOID DRV_UART1_Init(VOID) { UART1_GpioInit(); UART1_Config(); USART_Enable(USART1, ENABLE); }
-
printfの実現
原理は最終的には関数呼び出しのputcharをprintfの、私たちは機能を実現することができるのputcharされます。
#ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ PUTCHAR_PROTOTYPE { /* 等待发送完成 */ while (USART_GetBitState(USART1 , USART_FLAG_TBE) == RESET) { } USART_DataSend(USART1 , (U8)ch); while (USART_GetBitState(USART1 , USART_FLAG_TC) == RESET) { } return ch; }
-
マクロ実装のデバッグ
#define APP_ERROR(fmt, ...) do {printf("[ERROR][%s,%d]: " fmt "\n", __FUNCTION__, __LINE__, ##__VA_ARGS__);} while(0)
#define APP_TRACE(fmt, ...) do {printf("[TRACE][%s,%d]: " fmt "\n", __FUNCTION__, __LINE__, ##__VA_ARGS__);} while(0)
#define APP_DEBUG(fmt, ...) do {printf("[DEBUG][%s,%d]: " fmt "\n", __FUNCTION__, __LINE__, ##__VA_ARGS__);} while(0)
使用例
図中のLEDの試験結果の例では、以下