存儲(chǔ)在程序存儲(chǔ)器中的數(shù)據(jù)不能直接在MAXQ?微控制器上訪問。相反,IAR 嵌入式工作臺(tái)?用于調(diào)用 C 代碼中的特殊函數(shù),這些功能在微控制器的 ROM 中為此任務(wù)提供。本應(yīng)用筆記解釋了從應(yīng)用代碼調(diào)用ROM所需的步驟。
概述
程序員在使用微控制器時(shí),通常在應(yīng)用程序代碼中使用查找表。然而,由于MAXQ內(nèi)核的性質(zhì),應(yīng)用軟件不能直接從代碼空間讀取,因此不能直接訪問應(yīng)用代碼中定義的任何表。為了緩解這個(gè)問題,所有MAXQ微控制器都實(shí)現(xiàn)了所謂的“偽馮諾依曼”架構(gòu):開發(fā)人員可以在程序空間中存儲(chǔ)數(shù)據(jù)和表,但只能使用特殊的實(shí)用程序ROM例程。除了這些核心功能外,每個(gè)MAXQ微控制器的ROM都可以具有特定于該器件的例程。本應(yīng)用筆記描述了使用IAR嵌入式工作臺(tái)從代碼訪問這些實(shí)用程序ROM功能時(shí)必須采取的步驟。
指定函數(shù)地址和原型
使用 ROM 功能的第一步是確定這些功能的位置。MAXQ器件用戶指南補(bǔ)充列出了實(shí)用程序ROM用戶功能、地址、輸入和輸出。使用此信息查找要調(diào)用的函數(shù)的入口點(diǎn)。例如,下面的表1(MAXQ48補(bǔ)充的表2000)顯示flashWrite功能位于字地址08461h。
表 1.實(shí)用程序 ROM 用戶功能(適用于實(shí)用程序 ROM 版本 1.01)
功能編號(hào) | 函數(shù)名稱 | 入口點(diǎn) | 總結(jié) |
0 | 閃寫 | 08461h | 對(duì)單個(gè)字的閃存進(jìn)行編程。 |
1 | 閃光擦除頁面 | 08467h | 擦除(FFFFh 的程序)一個(gè) 256 字的閃存扇區(qū)。 |
2 | frashEraseAll | 08478h | 擦除(程序到 FFFFh)所有閃存。 |
3 | 移動(dòng)DP0 | 08487h | 在 DP[0] 處讀取一個(gè)字節(jié)/字 |
4 | 移動(dòng)DP0inc | 0848安 | 在 DP[0] 處讀取一個(gè)字節(jié)/字,然后遞增 DP[0]。 |
5 | 移動(dòng)DP0dec | 0848分 | 讀取 DP[0] 處的字節(jié)/字,然后遞減 DP[0]。 |
6 | 移動(dòng)DP1 | 08490h | 在 DP[1] 處讀取一個(gè)字節(jié)/字。 |
7 | 移動(dòng)DP1inc | 08493h | 在 DP[1] 處讀取一個(gè)字節(jié)/字,然后遞增 DP[0]。 |
8 | 移動(dòng)DP1dec | 08496h | 讀取 DP[1] 處的字節(jié)/字,然后遞減 DP[0]。 |
9 | 移動(dòng)FB | 08499h | 讀取 BP[關(guān)閉] 處的字節(jié)/字。 |
10 | 移動(dòng)FPinc | 0849通道 | 讀取 BP[Offs] 處的字節(jié)/字,然后遞增 Offs。 |
11 | 移動(dòng)FPdec | 0849Fh | 讀取 BP[Offs] 處的字節(jié)/字,然后遞減 Offs。 |
12 | 復(fù)制緩沖區(qū) | 084A2h | 將 LC[0] 值從 DP[0] 復(fù)制到 BP[關(guān)閉]。 |
現(xiàn)在,各種功能的入口點(diǎn)已經(jīng)知道,IAR嵌入式工作臺(tái)可以配置為使用這些地址。從“項(xiàng)目”菜單中選擇“選項(xiàng)”。在出現(xiàn)的對(duì)話框中,從“類別”列表中選擇“鏈接器”。單擊“額外選項(xiàng)”選項(xiàng)卡,并確保選中標(biāo)有“使用命令行選項(xiàng)”的框。在選項(xiàng)列表中,您必須為要使用的每個(gè)實(shí)用程序ROM功能添加一個(gè)項(xiàng)目;指定該函數(shù)的地址。這些選項(xiàng)應(yīng)具有以下格式: 《function_name》是將從應(yīng)用程序代碼調(diào)用的函數(shù)名稱。它不必與上表中給出的名稱匹配,但它必須是有效的 C 代碼函數(shù)名稱。《hexadecimal_byte_address》是 ROM 函數(shù)入口點(diǎn)的字節(jié)地址。由于該表列出了單詞地址,因此您需要將它們乘以 1 才能將它們轉(zhuǎn)換為字節(jié)地址。下面是一個(gè)MAXQ2000項(xiàng)目選項(xiàng)示例(圖《》),該項(xiàng)目使用三個(gè)ROM功能。
-D=
圖1.MAXQ2000項(xiàng)目示例使用三個(gè)ROM功能。
若要使這些函數(shù)可通過應(yīng)用程序代碼訪問,請(qǐng)使用在“選項(xiàng)”屏幕中指定的相同名稱為每個(gè)函數(shù)聲明原型。參數(shù)傳遞將在下一節(jié)中討論,因此現(xiàn)在聲明每個(gè)原型不接受任何參數(shù)且沒有返回值。
extern void utilFlashWrite(void); extern void utilFlashErasePage(void); extern void utilMoveDP0(void);
創(chuàng)建包裝函數(shù)
現(xiàn)在可以直接從應(yīng)用程序代碼調(diào)用 ROM 函數(shù)。但是,有一個(gè)警告。由于函數(shù)通常在與IAR編譯器使用的寄存器不同的寄存器中接受其輸入?yún)?shù),因此這些函數(shù)可能會(huì)破壞編譯器所依賴的寄存器。這些函數(shù)可能還需要在禁用中斷的情況下執(zhí)行。因此,您應(yīng)該創(chuàng)建一些幫助程序函數(shù)來處理這些問題。對(duì)于要調(diào)用的每個(gè) ROM 函數(shù),確定:它接受哪些輸入;它提供的輸出;以及它銷毀的寄存器。所有這些信息都可以在MAXQ器件的用戶指南補(bǔ)充中找到。
繼續(xù)上面的例子,可以看到MAXQ2000的flashErasePage函數(shù)有如下說明:
功能:閃存擦除頁面
摘要:擦除(程序到0FFFFh)265字的閃存頁。
輸入:A[0]:位于要擦除的頁面中的單詞地址。(頁碼是 A[0] 的高字節(jié)。
輸出:進(jìn)位:錯(cuò)誤時(shí)設(shè)置,成功時(shí)清除。
摧毀:PSF,LC[1],GR,AP,AP,APC
筆記:
如果看門狗復(fù)位功能處于活動(dòng)狀態(tài),則應(yīng)在調(diào)用此函數(shù)之前將其禁用。
從 flash 調(diào)用此函數(shù)時(shí),應(yīng)注意返回地址不在要擦除的頁面中。
使用此信息,您可以創(chuàng)建一個(gè)調(diào)用 flashErasePage 的幫助程序函數(shù)。除了實(shí)際調(diào)用實(shí)用程序 ROM 函數(shù)外,此幫助程序函數(shù)還需要執(zhí)行四個(gè)附加步驟:
配置 ROM 功能的輸入。
保存并恢復(fù) ROM 功能銷毀的任何保留寄存器。
處理 ROM 函數(shù)的輸出。
保存、禁用和恢復(fù)調(diào)用 ROM 函數(shù)周圍的中斷。
準(zhǔn)備輸入
此示例 ROM 函數(shù)接受 A[0] 作為其輸入,設(shè)置 A[0] 非常簡(jiǎn)單。我們可以通過使用一些IAR關(guān)鍵字和宏為MAXQ中的任何寄存器聲明一個(gè)變量。要為 A[0] 聲明變量,請(qǐng)?zhí)砑右韵抡Z句:
__no_init volatile __io unsigned int A0 @ _M(0x09,0x00);
特別注意_M宏的數(shù)據(jù)類型和輸入。此變量 A0 被聲明為“無符號(hào) int”,因?yàn)樗且粋€(gè) 16 位寄存器。如果它是一個(gè) 8 位寄存器,我們可以將其聲明為“無符號(hào)字符”。_M宏的輸入是模塊編號(hào),后跟A[0]寄存器的偏移。現(xiàn)在,您只需將此變量設(shè)置為 A[0] 中所需的值即可。
A0 = pageAddr;
保存特殊登記冊(cè)
以上述方式使用寄存器時(shí)必須小心,因?yàn)榫幾g器希望某些寄存器不會(huì)從一個(gè)函數(shù)調(diào)用更改為下一個(gè)函數(shù)調(diào)用。MAXQ IAR C編譯器參考指南列出了以下寄存器(表2)作為暫存器。您可以在不干擾程序流的情況下銷毀這些寄存器。此外,APC 和 DP[1] 寄存器以及 DPC 寄存器的位 0、1 和 3 在任何時(shí)候都不應(yīng)修改。如果函數(shù)更改了任何其他寄存器,則應(yīng)在退出該函數(shù)之前恢復(fù)它們。
表 2.暫存寄存器1
MAXQ10器件 | MAXQ20器件 |
A[0], A[1], A[2], A[3], GR, LC[0], LC[1], DP[0], BP, OFFS, AP |
A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], GR,LC[0], LC[1], DP[0]。英國(guó)石油公司,關(guān)閉,美聯(lián)社 |
flashErasePage 描述將 APC 列為已銷毀的寄存器之一,因此您必須確保在調(diào)用 utilFlashErasePage 之前保存并恢復(fù)該寄存器。如果您使用 IAR 的 asm() 函數(shù),此任務(wù)也很簡(jiǎn)單。MAXQ匯編語句可以使用這個(gè)函數(shù)直接插入到C代碼中。由于需要保存 APC,因此只需在調(diào)用 utilFlashErasePage 時(shí)添加 asm(“push APC”) 和 asm(“pop APC”) 語句即可。
處理 ROM 函數(shù)的輸出
處理 ROM 函數(shù)的返回類似于處理輸入。您可以直接讀取相應(yīng)的寄存器。例如,flashErasePage函數(shù)設(shè)置錯(cuò)誤的進(jìn)位。您可以使用 IAR 提供的 iomaxq.h 頭文件中聲明的PSF_bit結(jié)構(gòu)直接訪問此位。
return (PSF_bit.C == 0);
保存、禁用和恢復(fù)中斷
要考慮的最后一個(gè)任務(wù)是是否需要禁用中斷。大多數(shù)實(shí)用程序ROM例程都假定它們不會(huì)被中斷。因此,如果您的應(yīng)用程序使用中斷,明智的做法是在調(diào)用實(shí)用程序 ROM 函數(shù)之前禁用它們。禁用它們的最簡(jiǎn)單方法是使用 iomaxq.h 頭文件中定義的IC_bit結(jié)構(gòu)和 intrinsics.h 文件中定義的 __disable_interrupt() 函數(shù)。
unsigned char origIGE = IC_bit.IGE; // Save current state. __disable_interrupt(); /* Add UROM call code here. */ IC_bit.IGE = origIGE; // Restore interrupt state.如果執(zhí)行所有這些步驟,您將獲得類似于以下內(nèi)容的代碼:
#include#include // Prototype for the real Utility ROM function. extern void utilFlashErasePage(void); // Define the register we need direct access to. __no_init volatile __io unsigned int A0 @ _M(0x09,0x00); unsigned char flashErasePage(unsigned int page) { unsigned int pageAddr; unsigned char origIGE; pageAddr = page << 8; // Change page # to an address. origIGE = IC_bit.IGE; // Save current state. __disable_interrupt(); A0 = pageAddr; // Set up input to UROM function. asm("push APC"); // UROM function destroys APC. utilFlashErasePage(); // Call actual UROM function. asm("pop APC"); // Restore APC. IC_bit.IGE = origIGE; // Restore interrupt state. return (PSF_bit.C == 0); // Check return code from UROM. }
結(jié)論
使用上述步驟,您可以輕松調(diào)用每個(gè)MAXQ微控制器的實(shí)用程序ROM中提供的功能。您可以創(chuàng)建函數(shù)包裝器,利用MAXQ實(shí)用程序ROM中的代碼訪問查找表,在程序空間中存儲(chǔ)數(shù)據(jù),以及MAXQ系列器件獨(dú)有的其他功能。
審核編輯:郭婷
-
微控制器
+關(guān)注
關(guān)注
48文章
7542瀏覽量
151317 -
嵌入式
+關(guān)注
關(guān)注
5082文章
19105瀏覽量
304829 -
ROM
+關(guān)注
關(guān)注
4文章
563瀏覽量
85733
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論