ESP32 官方提供了 Xmodem 的代碼,包含的 xmodem 的發(fā)送方和接收方源代碼(https://gitee.com/esp-components/esp-xmodem)。這部分代碼并不在正式的代碼庫(kù)中(https://github.com/espressif/esp-idf)。從代碼的提交情況看,該項(xiàng)目提交后就沒(méi)有維護(hù)了。
由于項(xiàng)目在 esp32 需要實(shí)現(xiàn) xmodem,我移植了該項(xiàng)目。調(diào)試過(guò)程中發(fā)現(xiàn),該代碼其實(shí)只是剛剛跑通,并沒(méi)有做詳細(xì)和異常性測(cè)試。比如我遇到的下面兩個(gè)致命問(wèn)題:
/* Read data from UART */
uint32_t esp_xmodem_read_data(esp_xmodem_t *handle, int timeout_ms)
{
......
for (;;) {
......
if(xQueueReceive(handle->transport->uart_queue, (void * )&event, handle->transport->recv_timeout/portTICK_PERIOD_MS)) {
.......
switch(event.type) {
//Event of UART receving data
case UART_DATA: {
......
if (timeout_ticks > expired_ticks) {
......
if (len > 0) {
memcpy(&packet[read_len], buffer, len); <----- 沒(méi)有判斷,直接拷貝,可能導(dǎo)致內(nèi)存泄漏
......
esp_err_t esp_xmodem_sender_send(esp_xmodem_handle_t sender, uint8_t *data, uint32_t len)
{
......
while (left_len > 0) {
......
packet = sender->data; <--- 發(fā)送報(bào)文和接收?qǐng)?bào)文共用了緩存 sender->data,接收端在出現(xiàn) hw fifo overflow 后,會(huì)向 sender 發(fā)送 NAK ,發(fā)送端嘗試重新發(fā)送報(bào)文時(shí),發(fā)送報(bào)文被改寫(xiě),始終發(fā)送 NAK
由于是商業(yè)項(xiàng)目,有版權(quán)的原因,我不能貼出相應(yīng)的修改后的代碼,這里將主要問(wèn)題列出,方便移植該項(xiàng)目的開(kāi)發(fā)同行定位和修改。