古老、經(jīng)過(guò)驗(yàn)證且真正的調(diào)試技術(shù)是在整個(gè)嵌入式軟件中散布printf語(yǔ)句,以期獲得對(duì)系統(tǒng)行為的洞察力。嵌入式開發(fā)人員使用printf并不總是可取的,并且可能會(huì)對(duì)系統(tǒng)產(chǎn)生不可預(yù)見的實(shí)時(shí)影響。讓我們檢查一下printf的基本問(wèn)題,然后是一些可用于從中獲得最大性能的技術(shù)。
了解printf的問(wèn)題
使用printf會(huì)帶來(lái)一些開發(fā)人員經(jīng)常忽略的問(wèn)題。首先,開發(fā)人員必須引入一個(gè)標(biāo)準(zhǔn)的C庫(kù),這無(wú)疑會(huì)增加ROM和RAM的使用。其次,每次使用printf stamen 時(shí),系統(tǒng)都會(huì)阻塞,直到所有字符都已傳輸完畢,這會(huì)導(dǎo)致實(shí)時(shí)性能顯著下降。舉個(gè)例子,輸出一個(gè)簡(jiǎn)單的字符串,例如“Hello World!”在9600處打印出UART(仍然很常見)。例如在STM32上執(zhí)行了一個(gè)簡(jiǎn)單的時(shí)序測(cè)量,如圖1所示,格式化字符串并打印到終端需要12.5毫秒。
圖 1 – 打印“Hello World!”
添加任何字符串格式會(huì)使情況變得更糟!使用 printf(“The system state is %d”, State) 將系統(tǒng)狀態(tài)打印到終端會(huì)導(dǎo)致21毫秒的應(yīng)用程序延遲,因?yàn)樽址桓袷交蛡鬏?。有人可能?huì)爭(zhēng)辯說(shuō),以9600波特運(yùn)行是荒謬的,但即使增加到 115200仍然會(huì)分別導(dǎo)致傳輸這兩條消息的時(shí)間分別為1.05和1.75毫秒。大量處理器帶寬和潛在的實(shí)時(shí)性能會(huì)影響最少的有用信息。
性能技巧 1 – 創(chuàng)建非阻塞printf
如果printf 版本是阻塞類型,嵌入式開發(fā)人員一旦調(diào)用 printf,應(yīng)用程序就會(huì)停止執(zhí)行,直到每個(gè)字符都被成功傳輸,效率低得驚人!另一種方法是創(chuàng)建一個(gè)非阻塞版本,非阻塞printf版本將
格式化字符串
將格式化的字符串填充到傳輸緩沖區(qū)中
啟動(dòng)第一個(gè)字符的傳輸
讓中斷服務(wù)程序處理發(fā)送緩沖區(qū)中的剩余字符
繼續(xù)執(zhí)行代碼
非阻塞printf的最大亮點(diǎn)是設(shè)置時(shí)間,在9600波特的STM32上它在0.8到1.8毫秒之間變化。在初始設(shè)置時(shí)間之后,發(fā)送中斷大約每毫秒發(fā)生一次,需要35微秒將下一個(gè)字符填充到UART發(fā)送寄存器中,然后再返回執(zhí)行有用的工作。圖 2 顯示了周期性中斷以及中斷執(zhí)行時(shí)間。請(qǐng)記住,執(zhí)行時(shí)間不包括在這種情況下少于25個(gè)時(shí)鐘周期的中斷開銷。
圖 2 – 非阻塞 printf 性能
性能技巧 2 – 提高波特率
許多嵌入式開發(fā)人員仍將他們的UART默認(rèn)設(shè)置為9600,今天的串行硬件可以處理1 Mbps 或更高的波特率!有些足夠大膽的人將波特率設(shè)置為115200。除非運(yùn)行時(shí)鐘存在潛在的電氣或硬件相關(guān)問(wèn)題,否則將波特率設(shè)置為1 Mbps并將調(diào)試消息輸出為盡可能快,以盡量減少實(shí)時(shí)性能問(wèn)題。 “Hello World!”的原始阻塞 printf只會(huì)阻塞120微秒,遠(yuǎn)比12.5毫秒更可接受。
性能技巧3 – 使用SWD
現(xiàn)代微控制器在開發(fā)芯片時(shí)考慮到了printf性能問(wèn)題。例如,利用ARM Cortex-M 部件的調(diào)試功能的開發(fā)人員可以跳過(guò)UART并使用內(nèi)部調(diào)試模塊將printf消息通過(guò)調(diào)試器傳輸回IDE。以這種方式跳過(guò)UART不僅可以節(jié)省設(shè)置,而且內(nèi)部硬件機(jī)制可以最大限度地減少軟件開銷!內(nèi)部緩沖區(qū)充滿消息,調(diào)試硬件自動(dòng)處理傳輸?shù)秸{(diào)試探針的傳輸,從而將對(duì)應(yīng)用程序?qū)崟r(shí)性能的影響降至最低。
結(jié)論
很少有嵌入式開發(fā)人員會(huì)放棄他們最喜歡的、嘗試過(guò)的、真正的printf調(diào)試技術(shù)。在當(dāng)今的現(xiàn)代微控制器硬件中,有多種選項(xiàng)可以提高printf的性能和效率,從而最大限度地減少對(duì)實(shí)時(shí)性能的影響。