前面介紹了如何利用MCC生成Bootloader和Application的過程,此種方法簡單方便,如果需要更復雜的功能,可以在此框架下進行完善。下面將介紹采用修改鏈接文件.gld實現基本的Bootloader和Application功能。
鏈接文件描述
MPLAB XC16目標鏈接器可基于重定位目標代碼和任意歸檔/庫文件生成用于dsPIC DSC和PIC24 MCU系列器件的二進制代碼。大多數情況下都不需要直接調用鏈接器,因為編譯器驅動程序xc16-gcc會自動使用所有必須的參數執(zhí)行鏈接器。直接使用鏈接器并不簡單,通常只有那些具有扎實的編譯器和鏈接知識的用戶才應嘗試這么做(Bootloader相對不好做呀)。鏈接描述文件控制鏈接過程的各個方面,包括:
(1)分配數據存儲器和程序存儲器;
(2)將段從輸入文件映射到輸出文件;
(3)構造特殊數據結構(如中斷向量表);
(4)分配目標器件的絕對SFR地址。
鏈接文件在整個編譯過程所處的位置如下:
比如對默認鏈接文件的程序進行編譯后觀察Program Memroy,入口地址默認跳轉至0x200進行程序的執(zhí)行,前面6個是不可屏蔽陷阱向量(0x000E地址保留),后面是中斷向量詳細,均按照默認地址進行分配。
創(chuàng)建Boot項目
1.在MPLAB X IDE里面新建一個Boot Project(與新建普通項目過程一致),使能Timer1和AN0中斷;重新再編譯,觀察Program Memory,可以發(fā)現對應IVT地址發(fā)生了變化。
2.修改.gld文件
鏈接描述文件在X:\Program Files\Microchip\xc16\v1.50\support\dsPIC33C\gld跟目錄下,現在對默認gld的“.ivt __IVT_BASE :”部分進行修改。0x2000是從Page5開始,為什么每次加4?是因為每個GOTO語句占用兩條指令,前面篇章有介紹。
添加修改好的gld鏈接文件。
對項目進行重新編譯,觀察Program Memory,可以看到IVT地址均發(fā)生了變化,產生了0x2000的偏移。
至此,Boot項目建立完畢。
創(chuàng)建Application項目
1.同樣在MPLAB X IDE新建一個App Project,使能AN0和Timer1中斷,這時需要將Bootloader的中斷關閉,如果在bootloader和application里面都有同樣的中斷,會產生編譯錯誤。
2.修改gld文件IVT偏移地址,Reset地址為0x2000,IVT地址被重映射為0x2004開始,Application入口地址為0x2400,長度0x29B00.
此處Application的Flash起始地址是0x2000,如果沒有通知編譯器在該位置放置一個reset跳轉指令,而是由程序默認把初始化代碼放在該處,這樣做會有一定風險,編譯器有一定的概率將其他代碼放在了Flash起始位置,所以需要在gld文件中指定reset=0x2000,并不要屏蔽Reset Instruction.
修改Configuration Words部分。
修改默認gld里面“.ivt __IVT_BASE :”部分如下,在修改的時候一定要對照datasheet里面的中斷IVT地址一一對應,否則會出錯。
添加gld文件到項目文件。
編譯成功后觀察Program Memory,入口地址0x2000跳轉到0x2402執(zhí)行Application程序,同時T1中斷和AN0中斷也分別跳轉到不同的地址去執(zhí)行中斷函數。
Bootloader和application分別添加修改后的GLD,可以看到Timer1 IVT地址0x0016產生偏移地址后為0x002028,在Application執(zhí)行Timer1中斷后,發(fā)生中斷后通過GOTO指令跳轉至0x2B74地址去執(zhí)行中斷函數。
在Application項目中添加Boot Project。
編譯會發(fā)現出錯,如下:
主要是因為鏈接器將為啟用的中斷生成一個默認向量,這就是為什么盡管Bootloader通過修改GLD文件設置了固定值,但仍由應用程序設置了值的原因。 應用程序設置了“ 002B74”,而Bootloader設置了“ 002028”。
同時在屬性設置里面需要將創(chuàng)建默認中斷ISR Unlock,如下:
另外在Application GLD中需要對使能中斷名進行重新命名,同時中斷函數也要改成一致。
重新進行編譯,觀察Application Flash Program Memory,IVT地址被重映射,偏移地址是0x2000,Application入口地址是0x2402.
至此,通過GLD修改完成了Bootloader IVT重映射和存儲空間的再分配。