大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是
在串口波特率識別實例里逐步展示i.MXRT上提升代碼執(zhí)行性能的十八般武藝。恩智浦
MCU SE 團隊近期一直在加班加點趕 SBL 項目(解決客戶產(chǎn)品 OTA 需求),這個項目里集成了 ISP 本地升級(UART/USB)功能,其中 UART 口下載升級實現(xiàn)里加入了自動波特率識別支持,具體識別方法見 《串口(UART)自動波特率識別程序設(shè)計與實現(xiàn)(中斷)》 一文,這一套 ISP 代碼其實是移植于 i.MXRT Flashloader(更早期的時候叫 KBOOT)。ISP 代碼放在 SBL 工程里會出現(xiàn)高波特率(比如115200)無法識別的問題,但在低波特率的情況下(比如9600,19200),ISP 代碼是功能正常的,說明代碼本身并不存在邏輯缺陷,但高波特率下就異常了,大概率是遇到了代碼執(zhí)行性能瓶頸。今天痞子衡就嘗試在 i.MXRT 上使用各種方法去提升性能來解決這個高波特率無法識別問題:
一、SBL項目里ISP串口高波特率識別問題
SBL 項目是支持全系列 i.MXRT 平臺的,為了具體化問題,我們就選取 i.MXRT1062 型號為例,官方配套 MIMXRT1060-EVK 板子上搭配了一顆四線串行 NOR Flash(芯成IS25WP064A)用于存放代碼。SBL 程序主體是 XIP 執(zhí)行的,僅部分涉及 IAP 操作的代碼被分散加載到了 RAM 里。SBL 中 ISP 功能代碼主體當然也是 XIP 為主,且在 SBL 程序里是最先執(zhí)行的(本地升級超時后才進入 SBL 主體),SBL 工程里跟串口波特率識別相關(guān)的源文件一共如下三個:
microseconds_pit.c -- 存放 PIT 計時函數(shù)
autobaud_irq.c -- 存放 GPIO 中斷回調(diào)、波特率識別計算函數(shù)
pinmux_utility_imxrt_series.c -- 存放 GPIO 配置與中斷處理函數(shù)
MIMXRT1060-EVK 板子上串口是 GPIO1[13:12],其中 RXD - GPIO1[13] 是核心的用于波特率識別的引腳,為了便于直觀地感受代碼執(zhí)行性能,我們用另一個 GPIO1[12] 來輔助,將其配置為 GPIO 輸出模式,初值為高電平,在 GPIO 中斷處理函數(shù)里保持低電平來標示執(zhí)行總時間:
- Note :下述代碼里中斷處理函數(shù)實際上有點小缺陷,《中斷處理函數(shù)(IRQHandler)的標準流程》 一文里給出了改進方法,但這里為了觀察中斷處理代碼是否能在下一次中斷來臨前執(zhí)行完畢特意舍棄了文中 2.2.2 小節(jié)里的改進)
void?GPIO1_Combined_0_15_IRQHandler(void)
{
????//?****輔助調(diào)試:進入中斷時拉低 GPIO1[12],標志執(zhí)行時間起點
????GPIO1->DR?