_c R3,R2
[0181]有上述代碼可知,只能在執(zhí)行STR R1,R2將寄存器Rl中的數(shù)據(jù)寫(xiě)入寄存器R2中之后,才能執(zhí)行LDR_c R3, R2從寄存器R2中的數(shù)據(jù)讀如寄存器R3,因此該STR與該LDR_c存在序的關(guān)系。
[0182]示例地,該優(yōu)先策略為:若該內(nèi)存控制器的指令隊(duì)列中的待調(diào)用指令為關(guān)鍵性指令,則優(yōu)先執(zhí)行該待調(diào)用指令;若該內(nèi)存控制器的指令隊(duì)列中的待調(diào)用指令不是關(guān)鍵性指令且待調(diào)用指令與該第二操作指令存在序的關(guān)系,則優(yōu)先執(zhí)行該待調(diào)用指令;若該內(nèi)存控制器的指令隊(duì)列中的待調(diào)用指令不是關(guān)鍵性指令且待調(diào)用指令與該第二操作指令不存在序的關(guān)系,則優(yōu)先執(zhí)行該第二操作指令。
[0183]所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,為描述的方便和簡(jiǎn)潔,僅以上述各功能模塊的劃分進(jìn)行舉例說(shuō)明,實(shí)際應(yīng)用中,可以根據(jù)需要而將上述功能分配由不同的功能模塊完成,即將裝置的內(nèi)部結(jié)構(gòu)劃分成不同的功能模塊,以完成以上描述的全部或者部分功能。上述描述的單元的具體工作過(guò)程,可以參考前述方法實(shí)施例中的對(duì)應(yīng)過(guò)程,在此不再贅述。
[0184]采用上述內(nèi)存控制器,在編譯器確定第一操作指令具有關(guān)鍵性,并將該第一操作指令更改為第二操作指令后,該內(nèi)存控制器接收該第二操作指令,該內(nèi)存控制器根據(jù)該第二操作指令攜帶的關(guān)鍵指令標(biāo)識(shí)確定該第二操作指令為關(guān)鍵性指令,并根據(jù)優(yōu)先策略對(duì)內(nèi)存中對(duì)應(yīng)該第二操作指令的數(shù)據(jù)進(jìn)行操作。這樣,若該內(nèi)存控制器接收到數(shù)據(jù)讀取指令,能夠根據(jù)該數(shù)據(jù)讀取指令是否攜帶關(guān)鍵指令標(biāo)識(shí)確定該數(shù)據(jù)讀取指令是否為關(guān)鍵性指令,并優(yōu)先調(diào)用該數(shù)據(jù)讀取指令在內(nèi)存中讀取對(duì)應(yīng)的數(shù)據(jù),能夠準(zhǔn)確的判斷數(shù)據(jù)讀取指令是否為關(guān)鍵性指令,提高處理器在內(nèi)存中讀取數(shù)據(jù)的速率,并且避免了查詢(xún)和預(yù)測(cè)帶來(lái)的硬件成本過(guò)高的問(wèn)題。
[0185]本發(fā)明實(shí)施例提供一種編譯器60,如圖6所示,包括:
[0186]處理單元61,用于對(duì)源代碼進(jìn)行編譯得到目標(biāo)代碼。
[0187]確定單元62,用于確定該目標(biāo)代碼中的第一操作指令是否具有關(guān)鍵性。
[0188]該處理單元61還用于,在確定該第一操作指令具有關(guān)鍵性時(shí),將該第一操作指令更改為第二操作指令。
[0189]其中,該第二操作指令攜帶關(guān)鍵指令標(biāo)識(shí),以便內(nèi)存控制器在接收到該第二操作指令時(shí),根據(jù)該關(guān)鍵指令標(biāo)識(shí)確定該第二操作指令為關(guān)鍵性指令,并根據(jù)優(yōu)先策略對(duì)內(nèi)存中對(duì)應(yīng)該第二操作指令的數(shù)據(jù)進(jìn)行操作。
[0190]可選地,該確定單元62具體用于,在該第一操作指令的操作數(shù)和該第一操作指令后續(xù)的操作指令的操作數(shù)滿(mǎn)足預(yù)設(shè)條件時(shí),確定該第一操作指令具有關(guān)鍵性。
[0191]示例地,源代碼為:
[0192]......
[0193]for (i=l ;i〈100; i++)
[0194]a[i]=a[0]+i;
[0195]......
[0196]該編譯器編譯得到目標(biāo)代碼:
[0197]......
[0198]LDR R2, [R1];
[0199]ADD R3, R2, #1
[0200]STR R3, [R1, #1]
[0201]ADD R3, R2, #2
[0202]STR R3, [R1, #2]
[0203]......
[0204]ADD R3, R2, #99
[0205]STR R3, [R1, #99]
[0206]......
[0207]進(jìn)一步地,該編譯器在得到上述目標(biāo)代碼后,對(duì)該目標(biāo)代碼進(jìn)行掃描,檢測(cè)每條操作指令的操作數(shù)與該操作指令后續(xù)的操作指令的操作數(shù)的關(guān)系,在第一操作指令的操作數(shù)和該第一操作指令后續(xù)的操作指令的操作數(shù)滿(mǎn)足預(yù)設(shè)條件時(shí),確定該第一操作指令具有關(guān)鍵性。例如,該預(yù)設(shè)條件為該第一操作指令中的操作數(shù)在后續(xù)操作指令的操作數(shù)中出現(xiàn)次數(shù)大于5,則在上述目標(biāo)代碼中,對(duì)于第一操作指令LDR R2,[R1],該第一操作指令表示將Rl地址處的數(shù)據(jù)讀出保存到寄存器R2中,該編譯器通過(guò)對(duì)該第一操作指令后續(xù)的操作指令進(jìn)行掃描可確定該第一操作指令中的操作數(shù)R2在后續(xù)指令中出現(xiàn)的次數(shù)大于5,則該編譯器確定該第一操作指令具有關(guān)鍵性。
[0208]由源代碼可知,執(zhí)行循環(huán)得到數(shù)組a[l]到數(shù)組a[99]的值都使用到數(shù)組a[0]的值,也就是對(duì)應(yīng)的目標(biāo)代碼中的寄存器R2中的值,因此,若該第一操作指令未成功執(zhí)行,后續(xù)的操作指令都無(wú)法執(zhí)行。
[0209]進(jìn)一步地,該編譯器在確定該第一操作指令具有關(guān)鍵性時(shí),將該第一操作指令更改為第二操作指令,如LDR_c R2, [Rl],則更改后的目標(biāo)代碼為:
[0210]......
[0211]LDR_c R2, [Rl]
[0212]ADD R3, R2, #1
[0213]STR R3, [Rl, #1]
[0214]ADD R3, R2, #2
[0215]STR R3, [Rl, #2]
[0216]......
[0217]ADD R3, R2, #99
[0218]STR R3, [Rl, #99]
[0219]......
[0220]需要說(shuō)明的是,上述預(yù)設(shè)條件還可以為該第一操作指令中的操作數(shù)在后續(xù)操作指令的操作數(shù)中出現(xiàn)的頻率大于N,N為大于零的正整數(shù),即該編譯器在掃描目標(biāo)代碼后,若確定該第一操作指令的操作數(shù)R2在后續(xù)操作指令中出現(xiàn)的頻率大于N,則該編譯器確定該第一操作指令具有關(guān)鍵性。
[0221]進(jìn)一步地,該編譯器在確定該第一操作指令具有關(guān)鍵性時(shí),將該第一操作指令更改為第二操作指令,如將該第一操作指令LDR R2,[R1]更改為第二操作指令LDR_c R2,[R1],則更改后的目標(biāo)代碼為:
[0222]......
[0223]LDR_c R2, [Rl]
[0224]ADD R3, R2, #1
[0225]STR R3, [Rl, #1]
[0226]ADD R3, R2, #2
[0227]STR R3, [Rl, #2]
[0228]......
[0229]ADD R3, R2, #99
[0230]STR R3, [Rl, #99]
[0231]......
[0232]可選地,若該第一操作指令為數(shù)據(jù)讀取指令,則在處理器未在緩存中找到對(duì)應(yīng)該第一操作指令的數(shù)據(jù)時(shí),該內(nèi)存控制器接收該處理器發(fā)送的該第一操作指令。
[0233]需要說(shuō)明的是,該處理器支持該第二操作指令的存在,并且,該處理器在處理該第二操作指令時(shí),和該第一操作指令的處理方式一樣。即若該第一操作指令為數(shù)據(jù)讀取指令,則該處理器在執(zhí)行第二操作指令時(shí),首先在緩存中查詢(xún)對(duì)應(yīng)該第二操作指令的數(shù)據(jù),若緩存中存在對(duì)應(yīng)該第二操作指令的數(shù)據(jù),則該處理器讀取該數(shù)據(jù);若在每一級(jí)緩存中都找不到該第二操作指令對(duì)應(yīng)的數(shù)據(jù)時(shí),則將該第二操作指令指發(fā)送至內(nèi)存控制器中。
[0234]該內(nèi)存控制器在接收到該第二操作指令時(shí),根據(jù)該第二操作指令攜帶的關(guān)鍵指令標(biāo)識(shí)確定該第二操作指令為關(guān)鍵性指令,其中,該關(guān)鍵指令標(biāo)識(shí)可以為該第二操作指令的操作碼的名稱(chēng),如上述LDR_c,也可以是該指令攜帶的其他標(biāo)識(shí)信息,用于指示該第二操作指令的關(guān)鍵性。
[0235]所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,為描述的方便和簡(jiǎn)潔,僅以上述各功能模塊的劃分進(jìn)行舉例說(shuō)明,實(shí)際應(yīng)用中,可以根據(jù)需要而將上述功能分配由不同的功能模塊完成,即將裝置的內(nèi)部結(jié)構(gòu)劃分成不同的功能模塊,以完成以上描述的全部或者部分功能。上述描述的單元的具體工作過(guò)程,可以參考前述方法實(shí)施例中的對(duì)應(yīng)過(guò)程,在此不再贅述。
[0236]采用上述編譯器,該編譯器在得到目標(biāo)代碼后,確定第一操作指令具有關(guān)鍵性,并將該第一操作指令更改為第二操作指令,以便內(nèi)存控制器在接收到該第二操作指令時(shí),確定該第二操作指令為關(guān)鍵性指令,并根據(jù)優(yōu)先策略對(duì)內(nèi)存中對(duì)應(yīng)該第二操作指令的數(shù)據(jù)進(jìn)行操作。這樣,若該內(nèi)存控制器接收到數(shù)據(jù)讀取指令,能夠根據(jù)該數(shù)據(jù)讀取指令是否攜帶關(guān)鍵指令標(biāo)識(shí)確定該數(shù)據(jù)讀取指令是否為關(guān)鍵性指令,并優(yōu)先調(diào)用該數(shù)據(jù)讀取指令在內(nèi)存中讀取對(duì)應(yīng)的數(shù)據(jù),能夠準(zhǔn)確的判斷數(shù)據(jù)讀取指令是否為關(guān)鍵性指令,提高處理器在內(nèi)存中讀取數(shù)據(jù)的速率,并且避免了查詢(xún)和預(yù)測(cè)帶來(lái)的硬件成本過(guò)高的問(wèn)題。
[0237]本發(fā)明實(shí)施例提供一種內(nèi)存控制器70,如圖7所示,該內(nèi)存控制器70包括:
[0238]處理器(processor)71、通信接口(Communicat1ns Interface) 72、存儲(chǔ)器(memory) 73和通信總線74 ;其中,所述處理器71、所述通信接口 72和所述存儲(chǔ)器73通過(guò)所述通信總線74完成相互間的通信。
[0239]處理器71可能是一個(gè)多核中央處理器CPU,或者是特定集成電路ASIC(Applicat1n Specific Integrated Circuit),或者是被配置成實(shí)施本發(fā)明實(shí)施例的一個(gè)或多個(gè)集成電路。
[0240]存儲(chǔ)器73用于存放程序