前面我們的boot已經基本完工了,boot中需要頻繁進行下載鏡像操作,所以文件傳輸的效率影響調試的效率。我們”玩轉”的精神就是要精益求精,我們繼續來優化下文件傳輸速度。
代碼見:https://github.com/qinyunti/stm32f429-boot.git
首先第一步,想到的自然是提高串口波特率,為了方便我們增加一個命令行用于修改波特率。
shell_func.c中
static void setbaudfunc(uint8_t* param);g_shell_cmd_list_ast中添加命令行
{ (uint8_t*)"setbaud", setbaudfunc, (uint8_t*)"setbaud baud"},實現如下
static void setbaudfunc(uint8_t* param){uint32_t baud;if(1 == sscanf((const char*)param, "%*s %d", &baud))char* p =(char*)param;while(1){ /* 跳過%*s部分 */if((*p > 'z') || (*p < 'a')){break;}else{p++;}}long tmp;xatoi(&p, &tmp);baud = tmp;{uart_init(1, baud);}}
默認波特率為1000000,我們可以使用命令setbaud 3000000修改為3M。
板載的調試器的USB轉串口最大只能到2M,這里使用的是FTDI的串口線,線盡可能短。

設備管理器里面
右鍵點擊串口設備->屬性->端口設置->高級
USB傳輸大小修改為合適值,這里我們xmodem最大一包1029字節,所以2k足夠。
最重要的是延遲計時器改為1mS,這樣計算超時顆粒度更小,最小讀寫超時改為0。

這里是修改驅動的參數,實際還需要上位機配合超時和一次讀取大小。
一次讀取設置為剛好一包大小即可,否則會超時等待,或者需要不斷查詢直到收全。超時設計為合適值,不要太長導致超時浪費時間多。
使用SecurCRT時傳輸速率卡在33KB/S左右上不去,使用邏輯分析儀測量,下位機返回ACK后,上位機總是需要大概20ms才會發下一包。
而1M的波特率發送1kB數據大概也就是10ms左右。
所以加起來一包就需要30ms,正好是33kB/s左右的速率。

所以這里選擇WindTerm這個工具,實測該工具收到ACK只需要
1ms左右就可以發下一包。

3M波特率時可以達到200KB/s左右。

分析此時的時間組成發一包的時間為4.7ms,大概就是1000/4.7=213包/S
一包就是1KB,所以大概就是213KB/S,這里顯示206KB/S差不多。

然后再來看3M波特率下發送1包需要1029字節,一個字節最小10bit,
所以需要10290bit,所以需要時間為10290/3 us即3.43ms
實測如下是3.4067ms

再來看到上位機發送一包數據到下位機回應ACK的時間為109.25uS,這部分主要是下位機校驗數據,將數據寫入到目的地(這里是寫入SDRAM)的時間。

再來看下位機恢復ACK到上位機進行下一次發送,這里是1.1mS

從上面時間分析可以看出,數據在總線上傳輸時間受限于波特率,基本上串口3M波特率就比較高了,再提高有困難。
然后再看下位機的響應時間是109us,而上位機的響應時間是1.1ms。所以上位機的時間占比大,理論上優先優化上位機,但是上位機是PC端操作系統,本來就不是實時系統所以波動會有,且不一定能更小。
上位機的響應時間由于不是實時系統可能很難再優化,我們嘗試修改下進程的優先級
打開任務管理器
詳細信息里找到上位機

右鍵,將優先級設置為實時

可以看到速度更穩定基本都是9S完成,之前有9S有10S的波動大點。
所以修改優先級還是沒法解決這個響應延遲,受限于操作系統,提高優先級只能保證速度更穩定,平均下來的話速度也會高點。

1)選擇校驗和替代crc提高響應速度
下位機的主要響應時間是接收到數據包進行校驗,并寫入目的地的過程,所以可以將crc校驗改為校驗和,計算快點。我們的xmodem實現支持該配置。
crccheck配置為0使用校驗和方式。

2)修改一次查詢數量足夠再處理,如下如果提供了獲取當前串口已經接收數據長度的函數則可以調用它先判斷是否有一包再處理,否則不斷查詢讀FIFO時會臨界段處理會關中斷,關中斷時間過長。查詢長度無需臨界段處理,且一次讀出FIFO效率更高。

3)先寫入SDRAM再一次性寫入FLASH
即先rxmem傳輸到sdram,然后再restore寫入SPIFLASH,屬于策略優化。
下位機總的響應時間才100us級別,再優化也只能優化100us,大頭還是上位機的響應時間,所以這里上述方式可以優化下,都屬于策略方法算法級別的,但是無需再做極致的技術細節的優化了,產出比不高。
我們優化了xmodem傳輸速率,目前3M波特率可以傳輸速率為200kB/S左右,對于2MB的鏡像大概10S就可以傳輸完成,效率還是可以的。先傳輸到SDRAM中然后再寫入SPIFLASH中,比直接寫入SPIFLASH效率更高,SPIFLASH寫入速率后續也可以優化,一個優化手段就是即先全部擦除目標范圍,再按照4K的大小編程,還可以考慮優化SPI速度。總之優化是一個綜合的事情,優先分析出時序,比如上述邏輯分析儀抓包,然后先優化占用時間比例大的,優先從策略,方法,算法層面優化,然后再從技術細節方面優化。