《電子技術應用》
您所在的位置:首頁 > 通信與網絡 > 設計應用 > C8051 F12X中多bank的分區跳轉問題處理
C8051 F12X中多bank的分區跳轉問題處理
OFweek電子工程網
摘要: 本文介紹了KeilC51實現大于64KB程序的bank分組代碼切換機制的原理,提出了沒有操作系統情況下非正常轉移時bank的處理方法以及μc/os—II操作系統在多bank分區程序移植中應采取的措施,在開發實例中均得到了很好的應用。
Abstract:
Key words :

  在8051核單片機龐大的家族中,C8051F系列作為其中的后起之秀,是目前功能最全、速度最快的8051衍生單片機之一,正得到越來越廣泛的應用。它集成了嵌入式系統的許多先進技術,有豐富的模擬和數字資源.是一個完全意義上的SoC產品。

  C805IFl2X作為該系列中的高端部分,具有最快100MIPS的峰值速度,集成了最多的片上資源。其128 KB的片上Flash和8 KB的片上RAM足以滿足絕大多數應用的需求。使用C8051F12X,只需外加為數不多的驅動和接口,就可構成較大型的完整系統。只是其中128 KB的Flash存儲器不可避免地要處理bank分區問題。

  幸運的是Keil C51開發環境對C8051F系列有良好的支持,包括一般的跨bank分區的程序跳轉和調用。作為數據存儲器使用時,Flash的分區讀寫完全是編程者要考慮的事情,與開發環境無關。本文只針對特殊的強制轉移和μC/OS—II在多bank分區中的移植問題展開討論。

  1 C8051F12X在Keil C51中的多bank分區轉移機制

  Keil C51的連接定位器支持分組連接,允許生成代碼長度大于64 KB的8051目標程序_1_。一般的8051系統只提供16根地址線,需要附加地址線來實現代碼分組切換,而編譯器產生bank切換代碼時受到配置文件L51_BANK.A51的支持,所以用戶必須根據自己的硬件結構來修改這個配置文件。

  C8051F12X系列不用考慮硬件部分,也不存在地址線的擴展問題,因為128 KB的4個bank區全部都在CPU內部,所以作為常規跨bank的跳轉和調用,不需要處理1.5l_BANK.A51配置文件。但在特殊情況下就必須考慮該問題,否則程序將無法工作。下面以C8051F120為例先討論代碼的透明分組切換過程。

  C805IFl20在Keil C51的項目配置中被劃分為4個bank,每個32 KB。公共bank地址從0~0x7fff,其余bank從0x8000h~0xffff。在對應的配置文件L51_BANK.A51中,涉及到特殊功能寄存器PSBANK(SFR地址:0B1H)、SWITCHn宏、B_BANKn、?B_SWITCHn分組信息保存和切換代碼,以及?B_CURENTBANK變量。

  PSBANK為C8051F120內的特殊功能寄存器,128KB Flash的分bank訪問就是通過它來實現的。要想轉移到新的bank中去,必須賦予PSBANK正確的值,然后再轉向bank區內地址即可。

  SWITCHn宏共有4個,分別是SwITCH0、SWlTCH1、SWITCH2和SWITCH3,對應切換到4個bank中。其中SWITCH0對應的語句為:

  MOV PSBANK.#00h ;把00h用1Ih、22h和33h替換,

  ;就是其他三個宏

  它將插入到?B_SWITCHn代碼中,用來切換新的bank和恢復到原來的bank。

  所有4組?B_BANKn和?B_SWlTCHn代碼也都是用宏實現的,對應4個bank處理。它們匯集在?BANK?SWITCH代碼段中,整個bank切換及恢復機制非常巧妙,可以實現任意bank之間函數的相互調用及嵌套。下面以bank3區中的main函數調用bankl區的Delay_noOS()延時函數為例說明該機制。

  void main(void){

  MCUInit(); //初始化CPU

  Delay_n00s(10); //延時lO ms

  Lcmlnition();

  :

 ?。?/p>

  bank3中被調用的函數Delay_noOS(10)對應的匯編語句為:

  LCALL C:5049

  公共段(即Common段,對應bank0)中C:5049處的

  匯編語句如下:

  MOV dptr,#Delay_noOS

  AJMP B_BANKl

  這里的B_BANKl就是宏?B_BANK&N中N為1的例程。現在進入問題的核心:全部的跨bank區程序切換及恢復過程依靠公共段中?BANK?SWITCH代碼段里的以下匯編代碼實現,對應的N為0、1、2和3。?BANK?SWlTCH SEGMENT CODE PAGE

  ;

 ???B_BANK&N:

  PUSH ?B_CURRENTBANK (1)

  MOV A,#HIGH?BANK?SWITCH (2)

  PUSH ACC (3)

  PUSH DPL (4)

  PUSH DPH (5)

  ?B_SWITCH&N:

  MOV ?B_CURRENTBANK,#LOW? B_SWITCH&N

 ?。?)

  SWlTCH&N (7)

  RET (8)

 ?。?/p>

  Delay_noOS(10)函數的返回地址,即函數LcmIni-tion()的入口地址(也在bank3中),其高低位字節表示為ADDH和ADDL。程序進入main()后的?B_CURRENTBANK變量初值是?B_SWITCH3的低8位,其意義稍后敘述。AJMP B_BANKl后程序執行?B_BANKl和?B_SWITCHl的(1)~(8),執行到(5)時的堆棧結構如圖1所示。

  

  繼續執行?B_SWITCHl到(7)時,PSBANK變為指向bankl,?B_CURRENTBANK變為?B_SWITCHl的低8位。執行(8)后,從堆棧結構可以看出,堆棧彈出①作為新的PC值,程序進入Delay_noOS(10)函數,延時功能完成后,函數最后一條RET指令開始返回。這是Keil C51處理bank機制的關鍵,此時的返回地址為堆棧中的②,此地址即?B_SWITCH&H代碼的入口,這里對應main()函數所在的bank3分組,也就是?B_SWITCH3的人口。

  因為所有?B_SWITCH&N的高8位地址,即?BANK?SWITCH代碼段的高8位都一樣,由語句(2)中的操作符HIGH?BANK?SWITCH確定;低8位保存在已經壓棧的?B_CURRENTBANK變量中,此時堆棧中的?B_CURRENTBANK壓棧值是?B_SWITCH3的低8位,這樣②的地址就是?B_SWITCH3。

  程序繼續執行?B_SWITCH3,在執行?B_SWITCH3的(6)語句之前,?B_CURRENTBANK還是前面執行?B_SWITCHl時的值,即?B_SWITCHl的低8位。執行語句(6)后,?B_CURRENTBANK恢復為?B_SWITCH3的低8位,為返回main函數做準備。然后PSBANK置為33h,即指向bank3,接著執行RET語句,堆棧③成為RET的返回地址,程序回到了main()中Delay_noOS(10)的下一條語句繼續執行,?B_CURRENTBANK也已恢復。

  這個調用過程中,用了6個堆棧字節,3條RET指令,關鍵內容就是?B_CURRENTBANK變量,它保存了可以恢復調用前bank環境代碼的地址低位。從被調用函數返回 到這個地址后,就能恢復調用前的bank環境,即賦予PSBANK正確的值。

  不采用直接保存PSBANK值然后再恢復,而是用壓棧的方式保存了相關地址(語句(1)~(3)),是為了實現跨bank區的嵌套調用。例如,在Delay_noOS(10)函數中,如果再次跨bank去調用新函數,會再次重復上述過程,堆棧從②往上再長6個字節。Delay_noOS(10)函數之前執行?B_SWITCHI產生的?B_CURRENTBANK值(?B_SWITCHI的低8位)也會進棧,為調用完新函數后返回到bankl繼續執行Delay_noOS(10)提供保證。

  2 無操作系統bank分區間的強制跳轉

  通過上面的分析得知,如果要處理跨bank區的跳轉、調用和返回,關鍵是能正確處理好PSBANK中的內容。當程序沒有操作系統用于任務切換,而又需要強制退出某一函數進入到另一函數的某一地址時,比如說在中斷發生后,結束原來的工作轉入到另一工作去,就需要處理好PSBANK。

  如果不考慮bank,可以在轉入新地址之前執行一段代碼,保存該地址處的環境變量[2],包括堆棧指針sP和需要的入口地址。然后在中斷返回之前,恢復此環境變量,執行中斷返回指令進入該新地址。這個思路和C51庫函數setjump和longjump比較相近,但比它們靈活,因為環境變量可以自己處理。

  考慮bank后的情況稍微復雜些,環境變量中需增加bank的處理信息,那么只處理PSBANK行不行呢?

  如果僅保存和恢復PSBANK,則很簡單,在保存環境變量的程序中加入:

  JMPEnv[envl][3]=PSBANK;

  在恢復環境變量的程序中加入:

  PSBANK=JMPEnv[envl][3];

  這里環境變量是二維數組JMPEnv,envl代表一個環境變量,即一個返回點。第二維是變量中的參數個數。因此可以保存多個環境變量以供使用。

  初看起來這樣處理是沒有問題的,可實際上不行。因為進入返回點后,雖然PSBANK正確了,但是?B_CUR-RENTBANK可能已經被修改,不能和返回點程序的bank區匹配,如果再次出現跨bank調用的話將不能正確返回。

  處理方法是有點技巧的,因為C語言不支持匯編變量?B_CURRENTBANK的寫法,所以在L51_bank.A51中要加上聲明:

  PUBLIC BLCURRENTBANK

  和偽指令:

  B_CURRENTBANK EQU ?B_CURRENTBANK

  這樣就可以在C程序中使用B_CURRENTBANK

  了,先聲明B_CURRENTBANK:

  extern Uchar data B_CURRENTBANK;

  然后在保存環境變量程序中加入:

  JMPEnv[envl][3]=PSBANK;

  JMPEnv[envl][4]=B_CURRENTBANK;

  恢復環境變量程序中加入:

  PSBANK=JMPEnv[envl][3];

  B_CURRENTBANK=JMPEnv[envl][4];

  這樣恢復環境變量進入到新程序后,也將恢復該程序對應的正確?B_cuRRENTBANK值,問題得到解決。

 

  3 no/0S-ll移植中的bank分區處理

 

  μC/OS-II的51版本已經很成熟,但是所有移植版本均未處理bank問題,需要增加該內容,否則不能在包括C8051F12X系列及其他多bank程序中使用。

  如前所述,Keil C51提供對跨bank調用的透明切換支持,但在使用操作系統時,這種透明切換機制還需要提供對任務切換的支持。因為任務的切換,程序可能需要到別的代碼分組中去運行,而此時PSBANK和?B_CUR-RENTBANK還停留在原來代碼分組中的狀態,將導致程序崩潰。顯然,無論由于什么情況導致的任務切換完成之前,都需要保存和恢復PSBANK和?B_CURRENT-BANK的值。解決的辦法是在每次任務切換前將PS-BANK和?B_CURRENTBANK壓入用戶任務棧。

  按照μC/OS-II的要求,在任務創建時,任務棧必須初始化成像運行中的任務剛剛發生過中斷一樣嘲。?B_CURRENTBANK的初始值取決于該任務所在分組對應的切換代碼段的低8位地址。所以,任務堆棧的初始化函數OSTaskStkInit需要加入一個參數INT8U bank,指明該任務位于哪個代碼分組中。又由于任務堆棧的初始化函數是被任務創建函數OSTaskCreate調用的,所以該函數一樣需要加入參數INT8U bank。

  在壓棧,出棧宏中需要加入:

  PUSH PSBANK

  PUSH?B_CURRENTBANK

 ?。?/p>

  POP ?B_CURRENTBANK

  POP PSBANK

  在任務堆棧的初始化函數OSTaskStkInit中需要加入:

  *stk++=17; //堆棧長度增加2個到17

  ;

  if(bank==0x22:){ //bank2

  *stk++=bank;

  *stk++=CurrentBank2();

  else if(bank==0x33){ //bank3

  *stk++=bank;

  *stk++=CurrentBank3();

  }

  else{ //bankl和common

  *stk++=0xll; //PSBANK

  *stk++=CurrentBankl();

 ?。?/p>

  其中,bank0用任何的PSBANK值均沒有問題,所以簡化了PSBANK取值0x00的情況。

  函數INT8U CurrentBankl(void),INT8U Current-Bank2(void)和INT8U CurrentBank3(void)是用匯編語言實現的,返回值通過R7傳遞,目的是獲得該任務所在分組對應切換代碼段(?SWITCHn)的低8位地址。不用C語言編寫的原因同樣是?B_SWITCH&N不被C支持。

  CurrentBankl(void)代碼如下,其他兩個類同。

  RSEG?PR?CurrentBankl?Os_CPU_A

  CurrentBankl:

  MOV DPTR,#?B_SWITCHl

  MOV R7.DPL

  RET

  結 語

  本文介紹了Keil C51實現大于64 KB程序的bank分組代碼切換機制的原理,提出了沒有操作系統情況下非正常轉移時bank的處理方法以及μc/os—II操作系統在多bank分區程序移植中應采取的措施,在開發實例中均得到了很好的應用。

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          国产亚洲一区二区在线观看| 国产精品区一区二区三| 欧美中文字幕久久| 欧美夜福利tv在线| 亚洲午夜精品久久久久久浪潮| 玖玖玖免费嫩草在线影院一区| 欧美视频在线观看免费网址| 久久久www成人免费精品| 亚洲国产精彩中文乱码av在线播放| 亚洲小说区图片区| 国产亚洲女人久久久久毛片| 亚洲欧美另类在线观看| 国产精品久久久久久久免费软件| 久久久国产精彩视频美女艺术照福利| 欧美一区二区三区播放老司机| 国产精品九色蝌蚪自拍| 欧美国产第一页| 欧美视频中文字幕| 性刺激综合网| 伊人夜夜躁av伊人久久| 最新中文字幕亚洲| 日韩性生活视频| 黄色一区二区在线| 伊人一区二区三区久久精品| 在线日韩日本国产亚洲| 国产精品theporn| 欧美在线观看天堂一区二区三区| 麻豆精品精华液| 99精品国产99久久久久久福利| 欧美日韩综合视频| 免费美女久久99| 影音先锋一区| 一区二区三区日韩在线观看| 国产综合久久久久影院| 欧美chengren| 西西裸体人体做爰大胆久久久| 久久在线视频在线| 欧美精品亚洲一区二区在线播放| 国产精品亚洲欧美| 欧美电影在线观看完整版| 久久视频精品在线| 亚洲国产精品va在看黑人| 欧美亚男人的天堂| 999在线观看精品免费不卡网站| 欧美精品久久99久久在免费线| 亚洲国产精品悠悠久久琪琪| 国产精品黄页免费高清在线观看| 在线综合+亚洲+欧美中文字幕| 国产欧美日韩精品一区| 亚洲成在线观看| 国产一区二区三区日韩欧美| 国产午夜精品视频免费不卡69堂| 欧美绝品在线观看成人午夜影视| 国产精品欧美一区喷水| 亚洲国产婷婷综合在线精品| 久久久久久有精品国产| 午夜精品久久久久久久久久久| 国产午夜精品在线观看| 欧美mv日韩mv国产网站app| 欧美精品日韩一本| 猫咪成人在线观看| 国产精品亚发布| 欧美高清视频一二三区| 国产精品亚洲综合| 狠色狠色综合久久| 久久久久免费| 亚洲视频一区二区在线观看| 亚洲国产精品久久久久秋霞蜜臀| 亚洲高清网站| 国模精品娜娜一二三区| 一本不卡影院| 久久精品久久综合| 亚洲日韩欧美一区二区在线| 亚洲在线国产日韩欧美| 国产亚洲欧美激情| 国产精品多人| 性做久久久久久久久| 欧美在线视频一区二区三区| 国产精品自拍在线| 亚洲第一天堂av| 午夜精彩国产免费不卡不顿大片| 国产精品私拍pans大尺度在线| 亚洲在线一区二区| 国产精品露脸自拍| 99人久久精品视频最新地址| 国产在线拍揄自揄视频不卡99| 亚洲精品国偷自产在线99热| 国产日韩欧美亚洲| 亚洲人成人99网站| 国内精品久久久久久久97牛牛| 久久xxxx精品视频| 亚洲专区欧美专区| 亚洲欧洲日产国产网站| 欧美精品性视频| 日韩视频在线永久播放| 久久精品国亚洲| 国产女主播一区| 久久久久久网址| 欧美日韩一区二区三区免费| 欧美三级在线播放| 国产伦理精品不卡| 久久国产视频网| 亚洲激情视频| 亚洲第一精品久久忘忧草社区| 欧美日韩八区| 欧美成年人视频网站| 久久综合亚州| 亚洲视频免费| 国产精品网曝门| 国产日韩欧美精品综合| 欧美性事在线| 亚洲高清三级视频| 久久国内精品自在自线400部| 免费高清在线视频一区·| av成人免费在线| 蜜臀久久99精品久久久久久9| 久久黄色影院| 国产一区清纯| 亚洲影院在线| 久久精品一区蜜桃臀影院| 欧美成人精品激情在线观看| 国产欧美日韩在线播放| 亚洲私人影院| 欧美成人dvd在线视频| 国产欧美精品va在线观看| 国产精品igao视频网网址不卡日韩| 悠悠资源网亚洲青| 欧美日韩美女一区二区| 国产精品资源在线观看| 欧美激情一区二区久久久| 欧美第一黄网免费网站| 精品99视频| 麻豆精品在线观看| 国产婷婷成人久久av免费高清| 国产精品国产自产拍高清av| 亚洲精品欧洲精品| 香蕉久久a毛片| 国产精品自在线| 国产在线麻豆精品观看| 欧美日韩高清在线观看| 国产精品日日摸夜夜摸av| 夜夜嗨av一区二区三区网页| 夜夜嗨一区二区三区| 亚洲高清在线视频| 国产精品永久入口久久久| 在线午夜精品| 久久手机免费观看| 性伦欧美刺激片在线观看| 亚洲精品一区二区在线观看| 久久久久久久999精品视频| 99精品视频免费| 亚洲欧美激情视频在线观看一区二区三区| 久久伊人免费视频| 欧美不卡在线视频| 久久精品五月婷婷| 毛片精品免费在线观看| 欧美极品一区| 久久久91精品国产| 性8sex亚洲区入口| 老司机久久99久久精品播放免费| 欧美暴力喷水在线| 久久免费国产精品1| 亚洲成在人线av| 在线一区二区日韩| 国产精品色网| 免费欧美电影| 久久国产99| 欧美福利网址| 欧美午夜精品| 销魂美女一区二区三区视频在线| 国产精品一区二区三区免费观看| 久久精品九九| 亚洲亚洲精品三区日韩精品在线视频| 最新高清无码专区| 一区二区在线观看视频在线观看| 激情婷婷久久| 夜夜嗨av色一区二区不卡| 国产在线观看一区| 欧美午夜国产| 国产区在线观看成人精品| 国产精品自拍小视频| 欧美激情视频一区二区三区在线播放| 一区在线播放| 一区二区三区高清| 欧美一区深夜视频| 欧美激情按摩| 欧美视频在线不卡| 国内揄拍国内精品少妇国语| 欧美日韩国产高清视频| 蜜臀久久99精品久久久久久9| 国产午夜精品一区二区三区欧美| 欧美日韩高清不卡| 中文日韩欧美| 亚洲一区在线免费| 欧美一级淫片播放口| 亚洲尤物影院| 亚洲精品黄网在线观看| 亚洲国产精品va在看黑人| 日韩视频―中文字幕| 国产亚洲成精品久久| 欧美日韩在线电影| 久久久久久亚洲精品杨幂换脸| 欧美日韩精品一二三区| 国产日韩欧美亚洲一区| 国产亚洲精品高潮| 亚洲免费久久| 蜜臀久久99精品久久久久久9| 国语自产精品视频在线看| 亚洲精品国精品久久99热一| 亚洲精品欧美极品| 亚洲二区在线观看| 日韩视频免费大全中文字幕| 宅男噜噜噜66国产日韩在线观看| 亚洲欧美日韩在线综合| 伊人伊人伊人久久| 亚洲一区二区三区四区视频| 亚洲欧洲日本国产| 亚洲第一视频网站| 欧美乱人伦中文字幕在线| 国产精品久久久久久av福利软件| 国产亚洲欧美激情| 亚洲色图制服丝袜| 在线日韩欧美| 美女主播精品视频一二三四| 亚洲精品男同| 久久久999成人| 在线看欧美日韩| 韩日精品视频一区| 国产午夜精品全部视频在线播放| 欧美精品一区二区三| 在线综合亚洲| 在线观看国产日韩| 亚洲免费视频成人| 亚洲国产91精品在线观看| 午夜天堂精品久久久久| 在线亚洲免费| 亚洲天堂av图片| 国产精品综合色区在线观看| 久久免费国产精品1| 国产精品青草综合久久久久99| 欧美区一区二| 日韩视频免费观看高清在线视频| 欧美三区在线观看| 欧美在线免费视屏| 国产乱码精品一区二区三区忘忧草| 欧美日韩国产亚洲一区| 日韩天堂在线视频| 亚洲一区国产| 国产精品一区免费观看| 国产精品啊啊啊| 最新国产精品拍自在线播放| 免费在线观看日韩欧美| 亚洲国产精品一区二区www| 99re6热在线精品视频播放速度| 欧美日韩极品在线观看一区| 欧美日韩国产123区| 亚洲欧美变态国产另类| 欧美日韩中国免费专区在线看| 欧美色网在线| 欧美影视一区| 欧美日韩国产首页| 国产精品美女在线| 亚洲夜间福利| 国产亚洲一本大道中文在线| 久久成人久久爱| 午夜精品理论片| 久久国产视频网| 久久久久久久91| 国产精品无码专区在线观看| 蜜乳av另类精品一区二区| 久久婷婷成人综合色| 国产精品试看| 在线观看日韩精品| 欧美日韩一二三四五区| 一区二区三区精品| 久久天堂成人| 国产日韩成人精品| 国产精品久久久久久久7电影| 国产日韩精品一区二区浪潮av| 国内精品久久国产| 久久伊人免费视频| 激情欧美日韩一区| 最新中文字幕一区二区三区| 欧美日韩一级片在线观看| 悠悠资源网久久精品| 久久综合一区二区三区| 欧美在线视频不卡| 亚洲国产成人在线| 久久精品视频va| 欧美日韩三级一区二区| 一区二区三区www| 亚洲精品午夜精品| 国产精品美女诱惑| 欧美三级黄美女| 亚洲精选视频免费看| 影音先锋久久资源网| 国产一区二区三区精品欧美日韩一区二区三区| 一本大道久久a久久精品综合| 午夜国产精品视频免费体验区| 久久亚洲私人国产精品va媚药| 激情久久一区| 国产一区高清视频| 久久午夜国产精品| 国产精品一区二区在线观看不卡| 国产精品美女| 欧美国产免费| 黑丝一区二区| 欧美怡红院视频一区二区三区| 欧美亚洲综合另类| 欧美伊人精品成人久久综合97| 一色屋精品视频在线观看网站| 欧美日韩亚洲系列| 亚洲视频二区| 亚洲午夜精品久久久久久浪潮| 亚洲欧洲在线观看| 美女成人午夜| 欧美大成色www永久网站婷| 欧美在线免费播放| 欧美精品成人在线| 国产精品久久久一区二区三区| 久久精精品视频| 久久九九免费| 久久午夜精品| 亚洲一区视频| 国产人成一区二区三区影院| 麻豆久久婷婷| 久久狠狠一本精品综合网| 午夜精品偷拍|