防止 Microchip 的 MCC Melody 覆蓋您的程式碼

Microchip 的 MPLAB 程式碼配置器(MCC)是一款文檔齊全的圖形介面,目的在於簡化微控制器的配置。無需花費數小時查閱規格書並手動配置,即可輕鬆完成配置。

本文將會指出函數註冊( function registration)是連接 MCC 產生的程式碼和程式設計師所編寫的 main.c 程式的關鍵橋樑。這是一個巧妙的解決方案,但同時也是一個容易讓新手程式設計師犯錯的陷阱。正確登記函數後,你的程式碼將不再被 MCC 工具覆蓋。

我們將以 PIC16F13145 Curiosity 評估板為例(圖1)。種子程式可在此處下載。
Digital.X.zip (957.8 KB)


圖 1:試驗電路板上的 PIC16F13145 Curiosity 及其配套按鈕和 LED 的圖像。

使用 MCC

圖 2 顯示了一個典型的 MCC 項目。在本例中,專案中新增了配置邏輯區塊(CBL)和定時器零(TMR0)。此外,還包含一些系統級設置,例如中斷服務例程以及時脈和引腳配置等。

為了保持本文簡潔,我們將重點放在按下高亮顯示的「生成」按鈕後發生的情況。更多資訊請參閱此頁面

圖 2:使用 MPLAB 的 MCC 建構的 PIC16 專案配置,其中「生成」按鈕已高亮顯示。

MCC 代碼產生器將資料放在哪裡?

圖 3 顯示了專案文件結構。MCC 產生的程式碼位於已明確標記的 mcc_generated_files 分支中。

關於 MCC 的必須知事項

  • 每次按下「生成」按鈕(圖 2)時,MCC 都會覆蓋 mcc_generated_files 中的內容。

  • 您將丟失這些文件中已有的所有程式碼,這將非常令人沮喪。

  • 此結構之外的文件將不會被修改。例如,main.c 檔案不會被 MCC 修改。

Digital.X.zip (957.8 KB)

圖 3:MPLAB 專案的檔案結構,重點展示 mcc_generated_files 檔案。

如何將 MCC 產生的檔案與 main.c 連結?

這是本文的核心內容。我們不修改 MCC 文件,而是利用 C 語言內建的函數註冊機制。

函數註冊範例。

假設我們有一個函數 Bob(),它在 main() 函數中被呼叫。在機器層面,我們知道函數 Bob 被分配了一個記憶體位址,該位址由程式計數器控制。我們可以使用函數指標將 Bob 重定向到 Alice() 函數。現在,當我們呼叫 Bob 時,實際上是 Alice 函數在執行操作。

以下程式碼範例展示了建議的 MPLAB 程式碼範本:

  • 超級循環不執行任何操作。
  • TMR0 中斷服務例程封裝在函數 My_1ms_Callback 中。
    • TMR0 產生一個 1 ms 的中斷。
    • 連接到連接埠 B 的引腳 5 的 LED 每秒閃爍一次。
#include "mcc_generated_files/system/system.h"

volatile uint16_t msTicks = 0;

static void My_1ms_Callback(void){
    if (++msTicks >= 500) {
        msTicks = 0;
        LATBbits.LATB5 ^= 1;
    }
}

int main(void){
    
    SYSTEM_Initialize();
    
    /*
      * Register the custom 1ms callback with MCC’s timer module.
    */
    TMR0_OverflowCallbackRegister(My_1ms_Callback);

    INTERRUPT_GlobalInterruptEnable(); 
    INTERRUPT_PeripheralInterruptEnable(); 

    while(1){
        ;
    }    
}

範例 1:演示函數註冊過程的極簡程式碼。

函數註冊操作

我們的目標是在不修改 MCC 檔案(否則會覆蓋 MCC 檔案)的情況下,利用 mcc_generated_files 檔案(圖 3)中包含的程式碼。解決方案是將 My_1ms_Callback 註冊到 MCC 產生的程式碼中。這與我們先前的範例類似,我們呼叫 Bob() 函數,但實際執行操作的是 Alice() 函數。

函數註冊透過以下簡單的程式碼行完成:

    TMR0_OverflowCallbackRegister(My_1ms_Callback);

就是這樣,這就是讓 main() 函數與 MC 生成的程式碼無縫連結的關鍵。函數註冊過程是通往成功的橋樑。

技術提示:MCC 對於經驗豐富的程式設計師來說是一個不錯的工具。然而,對於新手來說,手動配置暫存器會更有幫助。花幾週時間研讀規格書可以提升他們的技能。在我看來,這就像學習騎自行車一樣。我們會逐漸形成對規格書的肌肉記憶,這在遇到問題時會非常有用。此外,研究一款微控制器,例如本文介紹的 PIC16,是學習其他設備(包括 32-bit 微控制器)的入門途徑。

可惜我們現在沒有紙本版的規格書了。以前那些手冊總是會把錯誤標記出來,並用雙下劃線標出。例如,我把資料寫入了 TRIS 暫存器而不是連接埠 —— 這個小錯誤就讓我花了幾個小時來故障排除。

完結前感想

我必須承認,和你們中的許多人一樣,我當初並沒有仔細閱讀 Microchip 的說明書。有一段時間,我對這些工具感到非常沮喪。希望這個小技巧能幫你們省下一些時間。

最後,讓我們向 Kernighan 和 Ritchie 致敬,感謝他們提供的函數指標。

相關文章

如果您喜歡這篇文章,您可能也會覺得以下相關文章很有幫助: