假日嵌入式系統工程師:SEGGER RTT (3)
假日嵌入式系統工程師:SEGGER RTT (3) 專業的Trace系統 在前面的文章[1][2],我介紹怎麼用SEGGER RTT搭配printf()。這個方法有幾個明顯的缺點: printf()需要Data memory存format字串,在SRAM受限的場合會很傷腦筋 printf()需要花時間產生字串 舉例來說,產生十進位數值(%d)一定不是瑣碎的工作 回頭看SEGGER RTT,既然已經有路能送字串,為什麼不直接送binary values,由PC產生字串就好?以下面這段code為例: printf("idx1=%d, idx2=%d\n", idx1, idx2); 上面的code,format string起碼要 >16 bytes,而且MCU要花cycles來產生字串,最後字串也要 >16 bytes;還不包括code size的開銷。如果丟binary values就可以只傳必要的資訊 (12 bytes) ID碼,表示format string是哪一個 ID=1 -> “idx1=%d, idx2=%d\n” 參數 idx1 idx2 這篇文章介紹怎麼在MCU/PC實作這個idea。另外我認為 SEGGER SystemView 實作的方法也是同一招,底層都是RTT,只是PC端的程式換另外一套。 MCU-Side 程式 和所有通訊系統一樣,發送端比較簡單。我們定義一道macro來產生ID,裡面包括magic number來讓PC偵測trace起點,以及trace-ID本體。程式的主體是一個loop,透過SEGGER_RTT_Write不停送出 {ID, i, i<<16}。如果接收端能正確解出來,那我們就成功了。 #define MK_TRACE_HEADER(id) ((0xABCD<<16) | ((id)<<0)) int main(void) { unsigned int buf_idx = 0; while(1) { unsigned int i; for(i=0; i<256; i++) { unsigned in