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