VR虛擬現(xiàn)實ARM經典問_第1頁
VR虛擬現(xiàn)實ARM經典問_第2頁
VR虛擬現(xiàn)實ARM經典問_第3頁
VR虛擬現(xiàn)實ARM經典問_第4頁
VR虛擬現(xiàn)實ARM經典問_第5頁
已閱讀5頁,還剩70頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

VR虛擬現(xiàn)實ARM經典問ARM經典300問第1章體系結構第1問:Q:請問在初始化CPU堆棧的時候一開始在執(zhí)行movr0,LR這句指令時處理器是什么模式A:復位后的模式,即管理模式.第2問:Q:請教:MOV中的8位圖立即數,是怎么一回事0xF0000001是怎么來的A:是循環(huán)右移,就是一個0—255之間的數左移或右移偶數位的來的,也就是這個數除以4一直除,直到在0-255的范圍內它是整數就說明是可以的!A:8位數(0-255)循環(huán)左移或循環(huán)右移偶數位得到的,F0000001既是0x1F循環(huán)右移4位,符合規(guī)范,所以是正確的.這樣做是因為指令長度的限制,不可能把32位立即數放在32位的指令中.移位偶數也是這個原因.可以看一看ARM體系結構(ADS自帶的英文文檔)的相關部分.第3問:Q:請教:《ARM微控制器基礎與實戰(zhàn)》2.2.1節(jié)關于第2個操作數的描述中有這么一段:#inmed_8r常數表達式.該常數必須對應8位位圖,即常熟是由一個8位的常數循環(huán)移位偶數位得到.合法常量:0x3FC,0,0xF0000000,200,0xF0000001.非法常量:0x1FE,511,0xFFFF,0x1010,0xF0000010.常數表達式應用舉例:......LDRR0,[R1],#-4;讀取R1地址上的存儲器單元內容,且R1=R1-4針對這一段,我的疑問:1.即常數是由一個8位的常數循環(huán)移位偶數位得到,這句話如何理解2.該常數必須對應8位位圖,既然是8位位圖,那么取值為0-255,怎么0x3FC這種超出255的數是合法常量呢3.所舉例子中,合法常量和非法常量是怎么區(qū)分的如0x3FC合法,而0x1FE卻非法

0xF0000000,0xF0000001都合法,而0xF0000010又變成了非法4.對于匯編語句LDRR0,[R1],#-4,是先將R1的值減4結果存入R1,然后讀取R1所指單元的值到R0,還是先讀取R1到R0,然后再將R1減4結果存入R1A:提示,任何常數都可用底數*2的n次冪來表示.1.ARM結構中,只有8bits用來表示底數,因此底數必須是8位位圖.2.8位位圖循環(huán)之后得到常數,并非只能是8位.3.0xF0000010底數是9位,不能表示.4.LDRR0,[R1],#-4是后索引,即先讀,再減.可以看一看ARM體系結構對相關尋址方式的說明.3第4問:Q:在程序移植的過程中,什么代碼段處于什么樣的模式,這可真是一個困擾人的大難題,有沒有一種標志或辦法能夠識別"代碼段處于什么樣的模式"A:讀取CPSR,任何時候都是可以讀.第5問:Q:為什么保護現(xiàn)場時,總是保護R0-R3,R12,為什么不保護R4-R11A:請看一看"ARM-thumb過程調用標準"這個文檔.第6問:Q:請問movR1,#0x00003DD0錯誤:outoftherangeofoperation是怎么回事情我就是想IODIR=0x00003dd0,匯編就是LDRR0,=IODIRMOVR1,#0x00003dd0STRR1,[R0]編譯時候說是超出操作范圍A:使用ldr,mov的操作數為8位位圖數.第7問:Q:"在ARM7TDMI(-S)處理器內部有37個用戶可見的寄存器:"問題:"用戶可見"應該怎樣理解這37個寄存器是否是37個不同的物理寄存器,例如R8與R8_fiq應該是兩個不同的物理寄存器吧A:用戶可見是指用戶可以通過程序操作的.R8與R8_fiq是兩個不同的寄存器.

第8問:Q:USR模式,SVC模式,IRQ模式分別有哪些限制A:對于外設操作限制與芯片設計有關.USR模式不能設置CPSR寄存器.用戶模式下無SPSR寄存器,代碼可以為ARM,Thumb.第9問:Q:請問"在初始化堆棧時就決定了工作模式"是什么意思如何決定工作模式的A:設置CPSR寄存器.第10問:Q:請問:ARM匯編程序設計中所謂的"文字池"作何理解A:可以理解為常量數組,文字池中保存的是常量,這些常量可以是正常的常量,也可以是地址.4第11問:Q:為什么在中斷向量表中不直接LDRPC,"異常地址".而是使用一個標號,然有再在后面使用DCD定義這個標號A:因為LDR指令只能跳到當前PC4kB范圍內,而B指令能跳轉到32MB范圍,而現(xiàn)在這樣在LDRPC,"xxxx"這條指令不遠處用"xxxx"DCD定義一個字,而這個字里面存放最終異常服務程序的地址,這樣可以實現(xiàn)4GB全范圍跳轉.Q:LDR不是可以全空間跳轉的嗎《ARM微控制器基礎與實戰(zhàn)》程序清單5.3.A:LDR偽指令通過設置指令緩沖池才能實現(xiàn)全范圍跳轉,而LDR指令則只能實現(xiàn)4KB范圍跳轉.第12問:Q:ARM7TDMI-S和ARM7TDMI有何區(qū)別A:ARM7TDMI-S是ARM7TDMI的可綜合(synthesizable)版本(軟核).對應用工程師來說,除非芯片生產廠商對ARM7TDMI-S進行了裁減,否則ARM7TDMI-S與ARM7TDMI沒有太大的區(qū)別,其編程模型與ARM7TDMI一致.第13問:Q:DCD偽指令的疑惑."StackUsrDCDUsrStackSpace+(USR_STACK_LEGTH-1)*4"這句話是什么意思DCD后面的程序標號或數字表達式是何意A:它的內容是初始化遞減堆棧的最高地址,看《ARM微控制器基礎與實戰(zhàn)》2.3.2節(jié).5第2章編譯器與語言第14問:Q:00254:UnimplementedRDImessage是什么錯誤提示我的設置連接都正常,是不是芯片燒了A:是JTAG的問題.可以先使用ISP操作試試就知道了,如果能ISP,說明LPC2104沒有損壞,還能正常運行程序.第15問:Q:請教:我在調試程序的時候在AXD中出現(xiàn)這樣的提示信息:RDIWarning00159:couldnotopenspecifieddeviceport.我是根據配套教程的步驟設置的.A:請按照光盤\easyarm_drive\readme.txt安裝驅動程序.第16問:Q:我用實驗程序運行經常出現(xiàn)下列信息!程序不能下載到目標板.Warnning!interruptvectorsdataisnotcorrect!Programyoudownloadedcannotrunfreely!A:1.仿真器配置一定要正確,即"EasyARMConfiguration"設置窗口中的"FLASH"項中選擇"EraseFlashwhenneed";2.向量表累加和要為0;3.可以先在RAM調試一個程序(運行),然后STOP,再使用File->LoadImage...加載要下載到FLASH的調試文件.第17問:Q:在ADS中是否可以進行軟件調試基于UCOS-II的程序A:ADS軟件調試只能調試ARM的內核,不能調試外設.但是取消PLL鎖定檢測后,可以調試任務切換,最終到空閑任務上.開始移植時軟件仿真是最好的工具.第18問:Q:ARMulate軟件是干什么的2104不是用EasyJTAG.dll來仿真嗎A:軟件仿真只能仿真ARM核.第19問:Q:有關LPC2106.INC的問題.我無法在project引用lpc2106.inc文件,只能引用文件,這是什么原因且當我的主程序用匯編編寫時,不能引用lpc2106.h,用lpc2106.inc則無法加入project,請問匯編器應如何設置A:不用加2106.inc只要該文件在你的工程文件夾中,就可以直接在匯編程序的開始處加6"include2106.inc".注意:該文件是匯編文件定義的頭文件,定義內部寄存器.第20問:Q:入口點是什么意思我在使用LPC2106上移植UCOS-II,每次MAKE時總是提示我Imagedoesnothaveanentrypoint,可是我是把光盤的vetctors.s復制過來的,而且仔細看了看,已經聲明了ENTERY,這是怎么回事A:需要在ADS中設置入口.第21問:Q:請教:如何定義不被初始化變量A:讓編譯器不知道有這個內存地址即可.A:如用分散加載文件分配RAM故意預留一部分RAM不分配,用它來存您不需要初始化的東西.或者不調用編譯器提供的啟動代碼,不過這樣可能編程會麻煩一些.第22問:Q:我直接通過JTAG口下載EasyArm板帶的Ext1_test程序到ARM中,出現(xiàn)中斷向量的告警:interruptvectorisnotcorrectarmisnotrunningfreely.果然復位后芯片不能運行.但是我用串口下載后芯片能正常工作,中斷也行的.并且我用JTAG仿真的話,芯片能正常工作,中斷也行的,唯獨JTAG口下載不行.不知道是什么原因A:仿真器配置中要設置EraseFlashwhenneed.也可以這樣試試:1.可以先打開一個工程在RAM中調試運行;2.stop程序;3.使用File->LoadImage…重新加載Ext1_test生成的*.axf文件.Q:仿真器配置中我是設置了EraseFlashwhenneed,但照你說的話,那不是在RAM下調試嗎在RAM下調試我是可以的,但是下載后出現(xiàn)interruptvectordataisnotcorrect.

我又看了幾篇文章,是不是跟中斷向量表的累加和不為零有關系啊A:是的,是向量表的累加和不為零.因為如果用ISP下載能運行,說明向量表的累加和已為零,而用JTAG下載不能運行的情況可能是沒有正常下載代碼.先在RAM中調試,目的是為了后面正確下載程序到FLASH.第23問:Q:用Scatter怎樣將某個函數或文件定位在Flash的某個位置A:參考http:///download/downs.aspID=10097第24問:Q:我在仿真時遇到這樣的提示:Error,Flashisprotectedbyuserconfigation!怎么寫到flash里面呢A:看配套《ARM微控制器基礎與實戰(zhàn)》附錄一.第25問:Q:我在移植實驗中想到了兩個問題,如下:1.Debug和Release以及DebugRel有什么不同,為什么在作2104移植實驗時,要用Release2.在Release中為什么要將RWBase設置為0x40000040我將其設置為0x40003000,為什么不能工作A:都只是一個問題,內存空間的使用,因為跑OS要比較大的內存空間,所以要騰出點地方.第26問:Q:請問沒有MMU的ARM芯片是否支持使用malloc()函數動態(tài)分配內存A:是否支持malloc()函數與芯片沒有多大關系,主要與編譯器有關.Q:再問:如果沒有操作系統(tǒng)支持呢A:也支持.第27問:Q:在I2C實驗程序中,我想查看數據緩沖區(qū)DataBuf的值,怎么查看A:watch窗口或鼠標停留在要查看的變量名上.Q:我查詢的是寫入DataBuf緩沖區(qū)的值,鼠標在上面根本就不會出現(xiàn)他的值,即使在watch

中加入,結果也是"namenotfound".A:變量被優(yōu)化,調試時可以把該變量定義為全局變量查看.第28問:Q:仿真軟件和2104開發(fā)板連接不上DBEWarning00041:!AnunspecifiedDebugToolboxcallfailed電源和開發(fā)板都連好,錯誤和沒接開發(fā)板一樣,驅動也安裝了,安裝時按確定鍵時,軟件很長時間才有如上反應,請幫忙A:1.并口是否正常2.在其它操作系統(tǒng)(如98)下或其它臺式PC下試試.第29問:Q:如何生成32位hex文件8我在ReleaseSetting->ARMfromELF->OutputFormat中設置為Intel32bitHEX,可是好像沒有生成hex文件A:試試這種方法:Target-->TargetSetting-->PostLink中選擇"ARMfromELF"加上你上面設的應該不成問題.第30問:Q:請問關于settings中r0baserwbase的意思A:ro:readonly,rw:readandwrite.第31問:Q:編譯成功后的信息第一行,code,R0data,RWdata,ZIdata,debug分別代表什么A:R0只讀段,即程序代碼空間;RW可讀/寫段,即數據變量空間;ZI清零變量段,即需要清零初始化的數據變量空間.第32問:Q:如何在ADS里面看任務執(zhí)行的一些情況比如堆棧.A:多任務環(huán)境下的堆棧,內存等信息需要調試軟件的支持才可以實現(xiàn).

ucos下有一個統(tǒng)計功能的模塊可以間接實現(xiàn)部分功能.第33問:Q:請問向flash燒數據時出現(xiàn):exceedsflashlimitation請予賜教!A:要寫入的flash地址超過了范圍.如果不是代碼太大的問題,可以檢查scf文件是否正確.第34問:Q:在LPC2214之類的芯片中如何實現(xiàn)數組的絕對地址定位,比如51的_at_的用法.A:*((char*)0x40000300)類似訪問Q:謝謝,但這樣做就無須定義數組變量,訪問也不便,還有高招嗎A:可以使用分散加載.第35問:Q:請問ADS編譯錯誤"L6221E:ExecutionregionER_ROoverlayswithExecutionregionER_ZI"該如何解決A:請用我們網站上的工程模板試一試,最大的可能是因為你的RELEASE或者DEBUG選項里面沒有正確設置,按照參考《ARM微控制器基礎與實戰(zhàn)》上面的設置,是不會有這個問題的.9第36問:Q:請教一下:將程序寫入flash,再用從JTAG方式調試寫入之后再復位程序沒什么反映.看了很多以前的帖子,說memmap寄存器要為1,我用的是一個很簡單的控制led的例子,改動了參數之后寫入flash的.在這個程序的vectors中找不到關于memmap寄存器操作的部分啊,這是怎么回事,該怎么辦呢A:《ARM微控制器基礎與實戰(zhàn)》上附錄有"常見問題",列舉了幾點程序寫到FLASH不能運行的原因.memmap操作可以在target.c中的TargetResetInit()函數內添加.第37問:Q:HEX文件.EASY2100配套《ARM微控制器基礎與實戰(zhàn)》上講:把項目編譯成HEX文件,我不會呀,咋辦A:Target-〉targetsettings設置Post-linker并且設置Linker-〉fromELF.Q:再問:我用的是光盤里的例子,打開工程項目里是DebugInARM.DebugInFlash.RelInFlash.不是《ARM微控制器基礎與實戰(zhàn)》上的DebugRel呀,我都照《ARM微控制

器基礎與實戰(zhàn)》上設置的,可用ISP下載,提示無法找到HEX文件.A:光盤上的例子是用專用工程模板建立,已經設置好參數,與默認模板不同.第38問:Q:EasyARM2100開發(fā)板如何通過JTAG接口下載到Flash我在用EasyARM2100開發(fā)板時JTAG接口不能進行Flash中的調試(DebugInFlash),但是可以在RAM中調試(DebugInRAM),且通過ISP編程可以寫入Flash.通過JTAG接口進行DebugInFlash調試時,總是出現(xiàn)如下提示:FlashSector0writefailed!Warnninginterruptvectorsdataisnotcorrect!Programyoudownloadedcannotrunfreely!請問是什么原因我該如何辦A:仿真器設置選項有一個允許擦除FLASH的選項,選擇它.第39問:Q:我發(fā)現(xiàn)程序在RAM調試時(RO=0X40000000)OK,但是JTAG下載到FLASH(RO=0X00000000),顯示如下:Thesessionfile'c:\DocumentsandSettings\jan\default-1-2-0-0.ses'couldnotbeloaded.A:這是ADS自身的問題,請不要通過IDE運行AXD,而是通過開始菜單運行,然后Load調試文件調試.第40問:Q:我有幾個問題想問問大家.10調試主機負責對ARM源程序進行編譯鏈接,最好用什么樣的高級語言對ARM源程序進行編譯鏈接使用調試程序(如AXD)進行JTAG調試,AXD是什么調試程序,是否是類似什么軟件之類的到哪能下載AXD的調試程序呢怎么樣進行AXD程序進行JTAG調試如何通過JTAG仿真器發(fā)送到目標機上呢對于單片機的調試,都用到了什么軟件都個有什么作用呢A:可以使用ADS1.2,KeilC也支持.AXD是ADS的一個組件.您可以在本公司網站下載EasyARM2100開發(fā)套件快速入門看一看.第41問:Q:EasyARM2100AXD調試時出錯,故障現(xiàn)象:按照光盤上的方法設置好ADS1.2后打開光盤上的expamples\gpio\c\LedDisp的工程文件(從光盤上拷貝到硬盤,已去處只讀屬性).編譯通過后,按Debug按鍵運行調試,進入AXD.按Go按鍵,EasyARM沒有反應.再按Stop按鍵.AXD彈出兩個確認框窗口:"Nodisassemblycouldbereadattherequestedaddress".如果進入AXD直接按Step按鍵,也是會彈出同樣的兩個確認框.軟件是光盤上的,沒有經過任何改動.光盤上的程序試過4,5個都是這種情況.AXD的設置是按照光盤上的說明設置的.EasyARM上的JP8是斷開的.ADS在出現(xiàn)這種問題后重新安裝過,故障依舊.出現(xiàn)這個問題前,可以調試.只是單步的時候感覺比較慢.差不多1-2秒鐘才能單步一次.A:原因找到了,是芯片被加密了,無法寫入新的程序,用FLASHISP清除后解決.加密后JTAG完全不能控制芯片,否則可能被解密.第42問:Q:我板上的lpc2214開始可以在線編程,只搞了兩三次可以把文件寫進去.但我發(fā)現(xiàn)P0.14未置低電平時也進入ISP模式,燒入的文件原來可以ISP下載到2014開發(fā)板中運行的.最后只能讀芯片的一些ID,載文件都不能進行.以下是對整片ERASE時,對串口的捕獲,命令返回是19.SynchronizedSynchronizedOK11059OKU231300P014

0E0141119configuretar...->ARMUL,只能仿真ARM核外設不能仿真.第48問:Q:為什么盤中的工程會出錯啊A:文件的只讀屬性去掉了嗎第49問:Q:您在2104的《ARM微控制器基礎與實戰(zhàn)》中提到ucos與應用代碼分開編譯,在分開編譯調試成功之后,最后要將代碼統(tǒng)一固化到芯片中.在最后一步需要注意什么統(tǒng)一編譯時感覺要改動很多東西,有沒有什么最簡單的辦法能否詳細介紹一下方法多謝!A:使用我們的工程模板,可在本公司網站下載.其實不分開編譯也可調試.http:///tools/kaifaban/EasyARM2104.asp的EasyARM2104開發(fā)套件快速入門和LPC210...第50問:Q:請問,我的2104板子,通過EasyJTAG仿真時,在AXD上沒有文件,而且出現(xiàn)這樣"Error,Flashisprotectedbyuserconfigation!"的提示,這是怎么回事啊在AXD應該打開什么類型的文件啊謝謝啦!!!!A:在仿真器的配置窗口設置仿真器允許擦除FALSH.AXD->Options->configuretarget->configure->erase……13第51問:Q:關于arm匯編語言跳轉指令的特殊用法.有如下兩條跳轉指令:beqlablefbeqlableb其中l(wèi)able為某段程序的標號,beqlablef表示向前跳轉到與當前指令最接近的標號lable處執(zhí)行,而beqlableb表示向后跳轉到與當前指令最接近的標號lable處執(zhí)行.在arm匯編中有定義這樣的用法嗎A:沒有.第52問:Q:我將一段程序從flash從復制到了RAM中,但是因為混合編程中不能直接向PC寄存器中賦值來實行跳轉,這樣我該如何跳轉到這個RAM中的地址呢A:用函數指針.可參考IAP例子.第53問:Q:我想詳細的了解一下ADS開發(fā)工具中的stack.s,heap.s和startup.s中代碼的含義,各位高手推薦本書或給解釋一下A:開發(fā)套件用戶指南的第3.1.3節(jié)有說明.stack.s定義了系統(tǒng)模式堆棧的起始地址.heap.s為初始化庫函數的堆,是按ADS的編譯器要求編寫的.startup.s向量表及初始化代碼,是根據CPU來編寫的.第54問:Q:我不知道所選擇的C文件到底是用ARM還是THUMB編譯的,請大俠指點!A:看配套《ARM微控制器基礎與實戰(zhàn)》7.1,7.2,7.3節(jié).第55問:Q:我重新建立了一個工程,沒有用模板,TEST.C程序在編譯的時候提示OS_EVENT沒有申明,但是我看了代碼,TEST.C中包含了CONFIG_EX.H,而congif_ex.h中又包含了include_ex.h,include_ex.h,這兩個頭文件又包含了ucos_ii.h,而OS_EVENT是在ucos_ii.h中申明的,不知道為什么會出現(xiàn)這種錯誤,能不能給我一個比較合理的目錄結構A:請參考我們光盤的目錄結構.最好使用我們的工程模板.第56問:Q:請問,我現(xiàn)在做2114的產品開發(fā).出現(xiàn)以下問題,特向您請教!問題:我們開發(fā)的產品要采樣,采用周期固定.于是我們采用timer0進行時鐘觸發(fā),利用觸發(fā)中斷程序每隔10毫秒采樣一次并顯示波形.這都能很好的進行.但是在中斷程序里面對幾個全局變量賦值,跳出中斷后卻不能使用該全局變量.很是頭疼!請賜教!!14框架如下:uint8a;//全局變量void__irqfuntimer0(){...a=0;//在中斷函數里面對全局變量賦值...}voidfun1(){uint8i;i=0;.......i=a;//出錯位置,在調試過程中運行到當前位置,鼠標移動到變量a上//顯示數值是0,但是不能傳給i,i的值不會隨該命令改變.......}因此,我在中斷函數中采集到的數據放到全局數組中.采集完成關中斷后在用戶模式下的程序中來處理該數組,但是該數組中的數據也不能使用!全局數組變量占1000個字節(jié),IRQ堆棧長度是256.A:全局變量用volatile聲明.第57問:Q:在AXD里打開DebugerInternals,在VariableName里為什么沒有PINSEL2,ADDR,ADCR等寄存器要在哪里設置A:有些片內外設寄存器是不能讀出,《ARM微控制器基礎與實戰(zhàn)》上的P33頁有說明及處理方法(在Memory窗口寫入相應寄存器地址).第58問:Q:請問不連easyArm板可不可以直接軟件調試程序我是指如果想直接調軟件部分,能不能在ads或axd里直接調試A:這和板子沒關系啊,你直接選ARMulate不就行了,注意把等待PLL配置完那條語句屏蔽就可以啦!第59問:Q:AXD里面出現(xiàn)"RDIWarning00159:Couldnotopenspecifieddeviceport"誰能告訴我這個是問題啊我一直搞不懂啊,全部是按照《ARM微控制器基礎與實戰(zhàn)》第4

章上配的圖做的啊,但是就是不能仿真啊.A:請先按照光盤的easyarm_drive\readme.txt安裝驅動程序.15第60問:Q:1.在《ARM微控制器基礎與實戰(zhàn)》的2.6.3節(jié)有說到"浮點數寄存器(F0-F7...)",2104是否具有這些寄存器2.如果EasyArm不支持浮點運算,而我的程序需要用到浮點運算,請問可以實現(xiàn)嗎A:1.沒有.2.用C就可以用浮點運算.第61問:Q:EASYARM2104的例子程序怎么都是調用C寫的程序,匯編那個怎么沒用的啊A:按如下步驟進行處理:1.在項目管理窗口中刪除原來的所有文件;2.在項目管理窗口中增加匯編文件*.S;3.編譯鏈接,調試.第62問:Q:請問版主:在AXD調試軟件中,我單步運行到一定時候,我想讓自己編的軟件從復位處重新運行,在AXD軟件中,EXECUTE欄目中有單步,連續(xù),運行到光標處等功能,但無復位功能,如果要實現(xiàn)此功能,如何操作A:我也沒有發(fā)現(xiàn),目前只能用重新裝載的操作實現(xiàn).第63問:Q:在AXD調試中,通過從jtag接口,連接上lpc2106,出現(xiàn)如下信息:TKSimulatorforADS,V1.2,2003/08SoftwareSuppliedby:ZLGMCUARM7TDMI-S,LittleEndian在從file|loadimgage...文件,出現(xiàn)兩種情況:1.正常,完全能調試;2.出現(xiàn)問題,如下:RDIWarning00254:UnimplementedRDImessage請問,這是錯在哪里如何解決謝謝!A:可能是電源或其他接插件接觸不良引起.第64問:Q:請教幾個問題:1.移植中底層接口里的__swi關鍵字在SDT中能用嗎2.為什么在勘誤文檔中時鐘節(jié)拍服務子程序里去掉了開中斷及關中斷的宏3.時鐘節(jié)拍中斷的優(yōu)先級應該設為最高嗎16A:1.不知,請自己看一看軟件自帶文檔.2.因為中斷服務程序中肯定是關中斷的.3.不必.第65問:Q:arm匯編中的中括號是什么意思比如下面的例子中括號是什么作用呀[PLLONSTARTldrr0,=PLLCONldrr1,=((0xe8<<12)+(0x4<<4)+0x2)strr1,[r0]]A:等效于:IFPLLONSTARTldrr0,=PLLCONldrr1,=((0xe8<<12)+(0x4<上電->啟動AXD.現(xiàn)象:數碼管能顯示不斷變化的數字0--F,但是AXD的連接失敗,提示"DBEWarning00041:....".重復試了幾遍,現(xiàn)象相同.請教原因以及對策.A:剛才把我機器的Win2K系統(tǒng)的用戶屬性從"PowerUser"修改為"Administrator"就沒問題了.可能是ADS/AXD安裝的時候用了Administrator權限,在"PowerUser"下工作有問題吧.如果哪位老兄有類似問題,不妨試一下這個方法.第67問:Q:在Init.s中有這樣一段:ResetBLInitStack;初始化堆棧BLTargetResetInit;目標板基本初始化B__main;跳轉到c語言入口誰知道__main()函數的具體內容假如我不需要調用庫函數的話,是否可以改為BmainA:看調試是匯編代碼里有__main(),組成成分與一些鏈接選項有關.可以.但是全局變量初始化不了.17第68問:Q:我在C中嵌入這樣一條語句__asm{MRSR4,CPSR;STMFDSP!,{R4};ORRR4,R4,0x80;MSRCPSR_cxsf,R4}會出新報錯"illegalwritetosp"版主和各位大俠有什么辦法解決阿A:嵌入匯編不能使用SP.第69問:Q:請問ADS如下的編譯錯誤是什么意思L6221E:ExecutionregionER_ROoverlayswithExecutionregionER_ZIA:程序段內存分配可能有問題,RO(只讀),ZI(0初始化)第70問:Q:在axd中有沒有運行程序的時間計算器keil中就有那樣的東西.A:有的,不過不是時間而是執(zhí)行周期,可以換算成時間.在debuggerinternals中,具體可以參考幫助文檔.第71問:Q:我最初的init.s中沒有加入heap的分配和__user_initial_stackheap函數,結果程序

跳到SWI中死循環(huán).我把他們加入后就好了.或者不加入他們,把B__main改為Bmain也可以.請問何解另外,就算目標板會陷入死循環(huán),但是用軟件仿真卻可以正常運行.何解A:堆的位置沒有分配到有效的RAM中.第72問:Q:在ARM匯編語言中,對立即數的有要求,我記得原來沒有這樣一說了.現(xiàn)在反而糊涂了,用立即數時候,很小心很忌諱,不回象51下隨心所欲的使用了,有對立即數熟悉的朋友站出來給大家釋疑.A:如使用"非法數據可以使用lrd送到寄存器"的方法.首先在存儲器中定義一個常量,再ldr進去,編譯器是這樣弄的.可以看下面語句反匯編的區(qū)別;intz=0x101;intz=0Xff;18第73問:Q:請教各位:我在AXD中單步運行一段程序后,想回到程序的開始重新運行,除了重新加載,還有其他方法或按鍵A:你的程序有多大程序在Flash運行點擊ReloadCurrentImage也不需要1秒吧~或在代碼窗口SetPC=0第74問:Q:在《ARM微控制器基礎與實戰(zhàn)》程序清單6.22的376頁的OSIntCtxSW_1中:LDRR4,[R6]ADDSP,R4,#68LDRLR,[SP,#-8]MSRCPSR_c,#(NoInt|SVC32Mode)MOVSP,R4LDMFDSP!,{R4,R5}LDRR3,=OsEnterSumSTRR4,[R3]MSRSPSR_cxsf,R5LDMFDSP!,{R0-R12,LR,PC}^請問高手:LDMFDSP!,{R0-R12,LR,PC}^是不是恢復新任務工作寄存器和工作模式,LR寄存器一并得到恢復,那么ADD指令后面的LDRLR,[SP,#-8]指令是不是可以去掉A:兩者恢復的是兩個不同處理器模式的LR.第75問:Q:既然option頁中的ImageentryPoint填入的是調試入口地址,那么在實際的程序運行當中它是不會覆蓋代碼中的ENTRY入口聲明的,對嗎僅僅是為了調試的方便.A:ImageentryPoint優(yōu)先.其實代碼中的ENTRY是為了確保代碼不被優(yōu)化掉.第76問:Q:我想使用標準C語言的庫函數,比如memset在string.h中有定義,可是我直接包含#include,但是編譯沒錯誤,運行確有錯誤,應當怎么設置A:請使用最新的工程模板第77問:Q:軟件中斷是不是必須由SWI指令觸發(fā)A:可以直接用你定義成軟中斷的函數名啊.比如:19__SWI(0x12)voidmyswi(void);//聲明函數__asm//調用方式1{swi0x12}myswi();//調用方式2第78問:Q:《ARM微控制器基礎與實戰(zhàn)》程序清單6.9的程序是在哪里被調用的_user_initial_stackheapLDRr0,=bottom_of_heapMOVpc,lrA:__main.千萬別刪喲,否則出大事的.

第79問:Q:"LDRR0,=PINSEL0"中"="是什么意思這語句是取地址還是取地址中的內容呢A:這是LDR偽指令,可用來加載32位立即數或地址,LDRR0,=PINSEL0是將PINSEL0的地址加載到R0中.第80問:Q:我不明白"SWI0"和"SWI0X123456"這兩條指令中的0和0X123456中有何用.有沒有應用SWI的具體例子讓我看看A:那是特定的中斷入口地址,見ADS_DeveloperGuide_D.pdf下的swi.第81問:Q:SWI的功能表嗎A:SWI的功能表由swi異常服務程序決定.很多時候由編程者自己決定.第82問:Q:請問:我在實驗您的原代碼進行ucos移植時用的是例1,但是在按照圖7.17設置處理器的仿真器模式時enablemschannelview和semihostin項為不可激活狀態(tài).為什么,能否給一點提示A:在一些仿真器上使能了它們會影響swi異常處理程序.第83問:Q:請問"UnimplementedRDImessage"這個出錯提示是什么意思啊20還有,有的時候當我用axdload一個.axf文件時,常常loading的沒完沒了,這是怎么回事啊A:UnimplementedRDImessage:為命令操作失敗,需要重新連接.下載不結束為出現(xiàn)不正?,F(xiàn)象,請重新連接并下載.如果每次都出現(xiàn)該現(xiàn)象請聯(lián)系我們的技術支持.第84問:Q:各位高手好,我是ARM初學者我在程序調試中"LDRPC,[PC,R2]"命令執(zhí)行后PC為什么=0x0000000c,在這條命令執(zhí)行前PC+R2地址上的值是0x0000000c嗎A:要使用軟件仿真.0x0000000C是預取中止了.Q:請問:ARM7在初始化CPU堆棧時,寄存器CPSR和CPSR_c有什么關系CPSR_c是在那里定義的A:這是MSR指令的語法,"_"后部分指定CPSR的域,請參考《ARM微控制器基礎與實戰(zhàn)》上關于這條指令的說明.第85問:Q:軟中斷SWI作底層接口的問題.以下函數為啥要通過軟中斷調用,可以直接調用嗎OS_TASK_SW(),_OSStartHighTdy(),OS_ENTER_CRITICAL),OS_EXIT_CRITICAL(),A:在用戶模式或Thumb狀態(tài)不能直接調用.第86問:Q:ARM的一條指令是32bit長,但有時一個立即數也是32bit,這是如何解釋的A:指令中使用的立即數需要時8位數移位獲得,并非所有數都可以.第87問:Q:請教:全局變量的值在復位(不斷電)后會不會自動清零(用光盤自帶的啟動代碼)A:在C語言中一般會會初始化0或用戶指定的值,但這不是硬件自動的.第88問:Q:thesettingfilesfor*.mcpislocked!是什么問題A:文件屬性只讀.第89問:21Q:請問,關于printf()在ads中怎么用不了謝謝!A:請用我們我們網站上下載2104的工程模板,它解決了這個問題.即使這樣,也不能真正使用prinf.您還需要自己編寫一些底層函數才能使用,詳細參考ads自帶的ADS_pilerGuide_D.pdf.第90問:Q:swi的功能號是如何來的它和LR寄存器的值是何關系如《ARM微控制器基礎與實戰(zhàn)》程序清單6.13LDREQR0,[LR,#-4];BICEQR0,R0,0xff000000A:LDREQR0,[LR,#-4];用來讀SWI的代碼BICEQR0,R0,0xff000000;是ARM方式進入,取低24bit

第91問:Q:請問在TargetInit()中函數開始會執(zhí)行srand((INT32U)TargetInit),它是做什么用的A:ex1用它來產生隨機數種子的.Q:請問:我建立的工程中,所有源文件與2104附帶的光盤例子源文件相同,編譯鏈接也一切正常,可就是不能到板子上跑!提示錯誤是:向量中斷有錯誤,無法自由運行!!這是怎么回事相同的源文件,加在你的工程里,正常;加到我的工程中就出錯!我創(chuàng)建的是ARM可執(zhí)行映象.A:vector.s你自己的嗎如果是要計算向量去的累加和了.第92問:Q:請問:vectors.s中"DCD0xb9205f80"的0xb9205f80在實際運用中需要改動嗎A:不需要更改,除非改動了向量表中的指令代碼.第93問:Q:請問,為什么queue數據隊列,《ARM微控制器基礎與實戰(zhàn)》上給畫成了環(huán)形A:因為頭跟尾的指針指向一個地址,隊列邏輯上是環(huán)狀的.第94問:Q:有沒有人成功的把一個數據定義到程序空間里各種方法我都試了,是不是有什么編譯開關A:使用const修飾,定義變量時帶初始化值,要定義為全局的變量.第95問:Q:ads里沒有CODE關鍵詞,怎樣使定義的字符串數組不占用RAM空間22A:constunsignedcharstring[]第96問:Q:在例程中TIME_test中的TIMEOUT當寫入時提示:Warnning!interruptvectorsdataisnotcorrect!Programyoudownloadedcannotrunfreely!我不知怎樣改設置,哪位提醒一下A:中斷向量表的校驗和不為0,用AXD看0地址的數據(32位方式),自己加一下.注意把高于32位的部分去掉.

第97問:Q:請教各位:我做TIMEOUT實驗(2104板),Make通過,Debug時出現(xiàn)了如下錯誤提示:Warnning!interruptvectorsdataisnotcorrect!Programyoudownloadedcannotrunfreely!設置Link:ARMLinkr0base:0x00000000rwbase:0x40003000imageentrypoint:0x00000000其它的沒變!!而我使用ISP完全可以下載而且可以運行!這可以說是設置問題,但是我實在找不到!怎么辦A:請看一看配套《ARM微控制器基礎與實戰(zhàn)》附錄1,ISP軟件可能對它進行了處理,而JTAG沒有特殊處理第98問:Q:*(volatileunsignedint*)是什么意思例如*(volatileunsignedint*)addr具體是什么意思A:分開來看,(volatileunsignedint*)就是定義一個可變的無符號整形指針,前面的那個*就是取起內容.第99問:Q:如何理解#defineVICIRQStatus(*((volatileunsignedlong*)0xFFFFF000))A:宏定義,參考C語言的書籍.(volatileunsignedlong*)0xFFFFF000將0xFFFFF000強行轉換為指針,然后*(指針)即可對此地址進行訪問.第100問:Q:在異常處理向量表的設置中,為什么不直接將異常向量的入口地址寫入PC中呢,為什么非要用什么DCD這些偽指令,到底有什么用啊A:為了保證任何時候其累加和為零,不然改一次程序就要計算一次.23第101問:Q:單步調試i2cINT.C在ISendStr中啟動總線后,程序怎么又跑到vectors.o中,進行初始化了呢A:由于VIC的限制,程序不能在0x18停下來,否則執(zhí)行非向量中斷.如果沒有設置,則非向量中斷為0,將從0地址執(zhí)行.建議:有中斷時不要單步執(zhí)行程序,可以手動暫時關中斷或設置斷點代替單步.(編者注:下載最新的驅動可以解決這個問題)第102問:Q:請教:如何修改ADS的啟動代碼,從__main到main,按道理應該有一個文件,修改這個小文件,就可以修改啟動代碼.A:__main是ADS運行庫,最好不要修改,要是不使用庫就不要用main()函數,起個別的名字.直接跳轉過去就行了.詳見:《ARM體系結構與編程》P328.第103問:Q:我在JTAG仿真時出現(xiàn)的對話框,提示:Warnning!interruptvectorsdataisnotcorrect!Programyoudownloadedcannotrunfreely!A:參見《ARM微控制器基礎與實戰(zhàn)》附錄一第一個問題的第二部分,選擇源代碼的啟動代碼文件夾下的vectors.s,并參照《ARM微控制器基礎與實戰(zhàn)》圖7.11設置.第104問:Q:初始化代碼中分配堆棧的問題MSRCPSR_c,#0xd3;進入特定的處理器模式LDRSP,StackSvc;給當前處理器模式的堆棧指針賦值,這只是一個值而已,;他在接下去的DCD語句賦值SvcStackSpaceSPACESVC_STACK_LEGTH*4這個語句開辟一個SVC_STACK_LEGTH*4大小的內存,SvcStackSpace是這塊內存的標號,我想應該就是內存的首地址,這樣應該好理解了.StackSvcDCDSvcStackSpace+(SVC_STACK_LEGTH-1)*4這個語句就是把這個首地址加上堆棧大小值.A:計算出堆棧指針來,我想這個堆棧是向下生長的,所以SP賦值的是堆棧地址最高的那個.第105問:Q:請問啟動代碼中這句是什么意思24__user_initial_stackheapLDRr0,=bottom_of_heapMOVpc,lr;/*分配堆空間*/AREAMyheap,DATA,NOINIT,ALIGN=2bottom_of_heapSPACE256;庫函數的堆空間我的問題是:1.這個函數在哪里被調用2.賦值給r0以后就完事了r0起什么作用A:堆和棧的分配函數,由ADS提供的初始化代碼調用,具體參考配套《ARM微控制器基礎與實戰(zhàn)》的相關部分.第106問:Q:2104的啟動代碼是否適用2124呢網站上下載的那個easyarm2104工程模版里面寫著armexecutableimagforlpc21**,是否說也適用2124呢如果不行,哪些地方需要修改希望能夠指點一下!A:您可以下載2100的工程模板.第107問:Q:我在用ARM的IAP功能,要把已經燒到flash中的數據寫到RAM中,我是這么寫的:uint32*q,data;q=0x00006000;data=*q;這是要讀的flash的起始地址,但是第二句編譯出錯,我想應該是C編譯器不許給指針直接賦值,我用匯編解決了這個簡單的問題,但是怎么用C來解決呢A:q=(uint32*)0x00006000;第108問:Q:問一個有關匯編的基礎問題.例程:ANDSR1,R1,#0x0400BEQWAITOK請問ANDS是如何影響標志位的,而BEQ判斷的是那兩個操作數相等時執(zhí)行A:R1&0x0400=>R1,若結果為0(即R1為0),則標志位Z=1.

當Z=1時,BEQWAITOK有效執(zhí)行.第109問:Q:請教:在ADS中怎么給某個變量確定固定物理地址就是類似KEIL中的XDATAxxx_AT_0x4456的功能.A:使用分散加載機制,mem_c.scf等就是例子.25第110問:Q:哪里有介紹ARM的C語言編程的A:其實大多數嵌入式系統(tǒng)的C語言都差不多,可找一本寫嵌入式C語言的書即可.第111問:Q:請問在系統(tǒng)復位后首先執(zhí)行的是否為BootBlock的中斷向量然后由bootblock里面的程序決定是執(zhí)行用戶程序還是ISP程序.那么這時啟動的bootblock里的中斷向量表和用戶程序里的中斷向量表是如何在flash里安排的在《ARM微控制器基礎與實戰(zhàn)》上看到的是復位后boot扇區(qū)的最低64字節(jié)出現(xiàn)在0x00000000區(qū)域,那用戶的中斷向量表應該在哪個區(qū)域產品中一般為0x00000000,在開發(fā)板中重啟后實際為bootblock的中斷向量地址,對嗎A:看一看3.3.6節(jié).產品中一般為物理0地址處.第112問:Q:《ARM微控制器基礎與實戰(zhàn)》上有一段程序:uint32i;i=VICIRQStatus;i=IOSET;請問:為何先要讀取VICIRQStatus的值,才能讀IOSET的值A:讀出VICIRQStatus只是為了方便觀察當前VICIRQStatus的值,沒其它用途.第113問:Q:請問處理器在什么情況下處于用戶模式多謝!A:需要你去設置CPSR寄存器.用戶程序前臺程序一般在用戶模式/系統(tǒng)模式下運行.

第114問:Q:在EINT1_LED.S中的倒數第二行有一個單獨的B指令,它是什么含義多謝!A:是"B.",跳轉到當前地址,即死循環(huán),與以下代碼等效:HALTBHALT第115問:Q:模板里到底有些什么A:起動代碼,相關編譯鏈接設置.起動代碼是用來初始化系統(tǒng)的程序,如Startup.s,target.c,stack.s等等.26第116問:Q:今天試用了工程模板.使用了ARMExecutableImageforlpc21xx建了個項目,看了下啟動文件與原來的不同了,用了個《ARM微控制器基礎與實戰(zhàn)》上的例程來作試驗,用的是time0定時中斷來亮燈的程序,用的例程的TargetInit()和intmain(void);修改了用戶堆棧和bottom_of_heap的長度,程序能運行,但不能產生中斷,time0和VIC初始化的是正確的,是什么原因用工程模板建立的項目文件夾的src中多了幾個文件,其中的mem_a.scf,mem_b.scf,mem_c.scf,怎樣才能導入到項目中來謝謝!A:原來startup.s默認是關了中斷的!第117問:Q:在easyarm2104的配套光盤中的IAP例子中,定義了一個函數指針void(*IAP_Entry)(uint32param_tab[],uint32result_tab[]);我看不懂,這個函數和普通的函數定義方法不一樣,尤其是(*IAP_Entry),大家教教我.A:這是一個指向函數的指針!!第118問:Q:變量定義中volatile是什么意思請大俠告訴我一下《ARM微控制器基礎與實戰(zhàn)》上c語言定義變量時出現(xiàn)了volatile,不知道是做什么用的.C語言里好像沒有這個語法阿!A:告訴編譯器不要優(yōu)化掉,volatile是易變的意思.第119問:Q:請問ARM中的一個編譯方面碰到的問題.在ARM地匯編語言中,有條件編譯偽指令IF..ELSE...ENDIF;而在C語言中,有相應的條件編譯偽指令#IF...#ELSE...#ENDIF,在較大的程序設計中,往往需要對整個程序進行條件編譯.我要問的問題是:我在CONFIG.H中設置一個編譯開關,對所有的C文件進行條件編譯是有效的,因為每個C文件中都有一個語句:#include"config.h",我如何將該編譯開關的信息傳遞給匯編語言文件,如VECYORS.SA:好像沒有直接的方法,可以編寫一個CONFIG.INC來管理匯編程序的配置.27第3章操作系統(tǒng)第120問:Q:在SWI_Exception的0x40中的_OSFunctionAddr[regs[0]]中的Regs[0]指的是堆棧中的R0還是其它A:是堆棧中的R0.第121問:Q:《ARM微控制器基礎與實戰(zhàn)》中在ucos移植中說C語言無法保證堆棧的結構,請問這是什么含義A:就是不能保證有哪些寄存器入棧及寄存器入棧的順序.第122問:Q:請問斑竹OSNeedToSwapContext在哪個文件里聲明的,我找不到A:這是要刪除的,我的OS_CPU_C.C中函數OSIntCtxSw:/*****************************************************************************函數:OSIntCtxSw.*描述:中斷級任務切換,此處并不真正進行任務切換,具體切換在IRQ服務程序中.****************************************************************************/voidOSIntCtxSw(void){}第123問:Q:我的情況如下:我自己制作了一個硬件模塊,用的是lpc2214,現(xiàn)在需要將ucos-ii移

植到上面去.我用板子做ZLG公司提供的實驗,是可以做的,如led燈等,按道理說串口等硬件應該沒有問題,然后我就做公司提供的那三個移植實例:ex2_arm.編譯等是通過的,生成了hex文件,下載到flash中,運行easyarm,但是沒有任何顯示,不知道是什么問題,應該是硬件上呢,還是其他的A:這主要是RAM的問題,請用我們的工程模板,并選擇在FALSH中調試,如果編譯通過,則一般行,否則請減少任務堆棧的大小.第124問:Q:下載了工程模板以后,將工程模板目錄下的文件都拷貝到了stationary目錄下,然后建立了一個ARMExecutableImageforUCOSII(forlpc21xx)的工程,在PROJECT目錄下的文件結構如下:28test.cinlcudes.hsrc->config.h,heap.s,includes.h,irq.s,lpc2294.h,lpc2106.h,mem_a.scf,os_cfg.s,stack.s,startup.starget.c,target.h,ucos_ii.c,ucos_ii.h,arm->os_cpu.h,os_cup_a.s,os_cup_c.cuCOS->ucos源文件arm_pc->pc.h,pc.c編譯可以通過,但是MAKE時提示:ERROR:ExecutionregionIRAMoverlapswithExecutionregionSTACKS.如果我表述得不是很清楚的話,那么可否告訴我工程模板到底怎么操作,怎樣才能把例子在ARM2104上跑起來.A:RAM占用太大,請在flash中調試,并減少任務堆棧的大小.第125問:Q:我改了以下SCF文件,把堆棧的值設置大了一些,但是還是出現(xiàn)以前的老問題,那就是程序跑到TargetResetInit()函數處后就跳到取數據終止的異常中斷去了.A:不能把堆棧設置到內部RAM之外.第126問:Q:新舊任務級的切換是不是必須在管理模式下切換切換后新任務的運行是不是必須在管理模式下A:在配套《ARM微控制器基礎與實戰(zhàn)》里的任務切換是通過SWI實現(xiàn)的.SWI會使CPU進入管理模式.同時CPU自動將任務的CPSR保存到管理模式的SPSR中.SWI程序還保存了一些寄存器到管理模式的堆棧中.然后任務切換程序會在管理模式和系統(tǒng)模式間來回切換,目的是把保存在管理模式堆棧的寄存器內容拷貝到任務的堆棧中(注意:任務是運行在用戶模式或系統(tǒng)模式的,這兩個模式使用同一個SP,這時的系統(tǒng)模式的SP指向的就是任務的堆棧),也會將管理模式的SPSR拷貝到任務堆棧(注意管理模式的SPSR就是在執(zhí)行SWI時CPU自動保存的任務運行時的CPSR,它記錄了任務運行的CPU模式和其他的運行狀態(tài)信息).最后把任務模式SP保存到任務的任務控制塊中(注意此時CPU已經是運行在系統(tǒng)模式下的了).以上大致就是uC/OS-II中所說的保存任務運行環(huán)境的工作.任務的恢復運行就比較好理解了.接著前面的說,CPU還在系統(tǒng)模式下.程序從任務控制塊中得到任務的堆棧指針.(OSIntCtxSw_1的第一句)將這個指針的值加上一定的偏移量保存到SP中.為什么要加上一定的偏移量呢因為這時任務的堆棧中除了保存任務運行時的數據外還保存了任務的上下文,即任務切換時保存的CPU寄存器等內容.而我們恢復任務等一下是在管理模式下進行的,用的是管理模式的堆棧指針.等恢復任務后CPU就開始執(zhí)行任務29代碼了.我們已經沒有機會再修改系統(tǒng)模式下的SP值了.所以在這個時候就應該對SP進行調整.調整的大小就應該是所保存的上下文占用的大小.從堆棧中恢復LR的值.同樣的道理,管理模式和系統(tǒng)模式使用不同的LR,在切換到管理模式之前,必須先在系統(tǒng)模式下恢復任務運行時的LR.(OSIntCtxSw_1的第三句)接下來就切換到管理模式了.(OSIntCtxSw_1的第四句)使管理模式SP指向任務堆棧(第五句)注意這是沒調整過的任務SP,也就是保存了上下文環(huán)境的SP.接下來的事情就真的很簡單了.從堆棧中恢復出保存的東西.先是OSEnterSum,然后是任務的CPSR(注意任務的CPSR就是進入SWI時由CPU自動保存到管理模式的SPSR中的,所以此時也是恢復到管理模式的SPSR中)最后一句就是典型的中斷返回語句了.恢復寄存器,恢復PC,加了一個^號意味著同時將SPSR拷貝到CPSR中.現(xiàn)在是回答你的問題的時候了.切換前任務是運行在什么環(huán)境下的(包括CPU模式,所有的寄存器),任務切換后任務就是運行在什么環(huán)境下的.對任務來說,什么也沒改變.只有PC值指向了下一條指令,哈哈.第127問:Q:請教:在rtos51解釋的概念里的"信號量"比較難懂,"消息隊列"可以理解為任務之間互相傳遞的參數,但"信號量"怎樣理解呢具體一點,謝謝!A:信號量是60年代中期Edgserdijkstra發(fā)明的,它實際上是一種程序間的約定機制,這種約定決定那個程序(任務)可以執(zhí)行.在多任務內核中普遍使用信號量用于:1.控制共享資源的使用權(滿足互斥條件);2.標志某事件的發(fā)生;3.使兩個任務的行為同步.信號量像是通行證,且通行證的數目是有限的.任務要運行下去,要先拿到通行證.如果信號量已被別的任務占用,該任務只得被掛起,直到信號量被當前使用者釋放掉.信號量的值可以是0到255或0到65535,或0到4294967295,取決于信號量規(guī)約機制使用的是8位,16位還是32位.到底是幾位,實際上是取決于用的那種內核.根據信號量的值,內核跟蹤那些等待信號量的任務.一般地說,對信號量只能實施三種操作:初始化,也可稱作建立;等信號也可稱作掛起;給信號或發(fā)信號.信號量初始化時要給信號量賦初值,等待信號量的任務表應清為空.想要得到信號量的任務執(zhí)行等待操作.如果該信號量有效(即信號量值大于0),則信號量值減1,任務得以繼續(xù)運行.如果信號量的值為0,等待信號量的任務就被列入等待信號量任務表.多數內核允許用戶定義等待超時,如果等待時間超過了某一設定值時,該信號量還是無效,則等待信號量的任務進入就緒態(tài)準備運行,并返回出錯代碼(指出發(fā)生了等待超時錯誤).任務以發(fā)信號操作釋放信號量.如果沒有任務在等待信號量,信號量的值僅僅是簡單地加1.如果有任務在等待該信號量,那么就會有一個任務進入就緒態(tài),信號量的值也就不加1.于是通行證給了等待信號量的諸任務中的一個任務.至于給了那個任務,要看內核是如何調度的.收到信號量的任務可能是以下兩者之一:1.等待信號量任務中優(yōu)先級最高的任務;2.最早開始等待信號量的那個任務,即按先進先出的原則(FIFO).30有的內核有選擇項,允許用戶在信號量初始化時選定上述兩種方法中的一種.但Small

RTOS51只支持優(yōu)先級法.如果進入就緒態(tài)的任務比當前運行的任務優(yōu)先級高(假設,是當前任務釋放的信號量激活了比自己優(yōu)先級高的任務).則內核做任務切換(假設,使用的是占先式內核),高優(yōu)先級的任務開始運行.當前任務被掛起.直到又變成就緒態(tài)中優(yōu)先級最高任務.第128問:Q:我用了兩個串口,但當我把程序做大的時候,發(fā)現(xiàn)在這個任務里所建立的郵箱失敗,我只用一個串口時是沒有這種事情的.Uart0ReviceMbox=OSMboxCreate((void*)0);/*建立郵箱*/if(Uart0ReviceMbox==NULL){while(1);}我想問一下有幾種可能會造成這種分配失敗我的程序存儲器用量如下:TotalR0size22168TotalRWsize7956TotalROMsize22168A:在OS_CFG.H中定義最大事件數,太小的話,分配會失敗的.第129問:Q:在周立功的原例子中,系統(tǒng)代碼事先燒到ROM中,應用代碼在RAM中運行.我想知道,(RAM)應用代碼調用系統(tǒng)函數,那么2104是如何把ROM中的系統(tǒng)函數的地址傳遞給RAM,也就是應用代碼和系統(tǒng)代碼是如何關聯(lián)在一起的我猜是通過swi(軟中斷),應用代碼通過swi調用系統(tǒng)代碼,但是swi中斷程序中,是如何獲得燒到RAM中的系統(tǒng)函數的地址哪百思不得其解.A:您看一看romcode工程中swi的0x40和0x41功能,及Os_call.c,Os_call_arm.s,Usr_call_arm.s.第130問:Q:16k的RAM,128的FLASHROM跑uc/os-II夠嗎再跑點應用程序夠嗎A:取決于您的應用程序對RAM的需求,及代碼量.一般程序可以.第131問:Q:利用lpc2104開發(fā)應用程序時,在Os_call_arm.s,Os_call.c兩個文件中,那幾個函數

需要在匯編中實現(xiàn),哪幾個需要在.c文件中實現(xiàn),為什么謝謝各位大蝦!A:4個以上參數用c實現(xiàn).因為通過寄存器只能傳遞4個參數.31第132問:Q:如果禁止SmallRTOS51進行中斷嵌套管理(#defineEN_OS_INT_ENTER0),是否還需要設置中斷優(yōu)先級寄存器IP,使得所有中斷的優(yōu)先級都相同(全高或全低)A:受SmallRTOS51管理的設置為最低優(yōu)先級,不受SmallRTOS51管理的設置其它優(yōu)先級較好.第133問:Q:在OS_CPU_S.s文件中有如下一段代碼,其中有兩句代碼的作用不是很明白,請解說一下.OSIntCtxSw_1LDRR4,[R6];獲取新任務堆棧指針;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;這兩行代碼有何作用呢ADDSP,R4,#68;17寄存器CPSR,OsEnterSum,R0-R12,LR,SPLDRLR,[SP,#-8];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MSRCPSR_c,#(NoInt|SVC32Mode);進入管理模式MOVSP,R4;設置堆棧指針LDMFDSP!,{R4,R5};CPSR,OsEnterSum;恢復新任務的OsEnterSumLDRR3,=OsEnterSumSTRR4,[R3]MSRSPSR_cxsf,R5;恢復CPSRLDMFDSP!,{R0-R12,LR,PC}^;運行新任務A:這兩條指令是在系統(tǒng)模式下恢復用戶模式下的LR;可以參考配套《ARM微控制器基礎與實戰(zhàn)》6.4.9節(jié).第134問:Q:我將《ARM微控制器基礎與實戰(zhàn)》上uC/OS-II的第一章例2移植例在ARM2104開發(fā)版上實現(xiàn)例2中的TEST.C中的"#defineTASK_STK_SIZE512"改為"...256",程序編譯

后,數據量低于16K,能正常運行,但運行時"TotalStack"不是256全是1024.另UC/OS-II書上,第一章例2每一個任務的堆棧都是512,為什么書上11頁"TotalStack"是"624,1024,1024,1024,1024,1024,1024",請老師指點,萬分感謝!A:顯示的是字節(jié)而定義的是字.第135問:Q:可不可以把所有的任務和相關信號量(二值)在一個任務里面一起創(chuàng)建呢我現(xiàn)在是這樣做的,不知是不是這方面的原因而且全部信號量是這樣創(chuàng)建的:XX1=OSSemCreate(0);32XX2=OSSemCreate(0);XX3=OSSemCreate(0);一共創(chuàng)建了十個信號量,以前程序代碼版本是分開寫的執(zhí)行起來沒有問題,不知現(xiàn)在為什么這樣寫就會出現(xiàn)小問題呢這樣的問題和我的任務和信號里書寫位置有關系嗎A:必須在使用信號量前創(chuàng)建信號量.第136問:Q:UCOS在中斷處理完后調用OSIntExit(),該函數將判斷是不是要進行任務切換,如果是則調用OSIntCtxSw()切換任務,然后才恢復寄存器,中斷返回.這樣說來,在中斷返回前,已經切換到別的任務去了,在再次回到被中斷的任務前,是不是一直沒有中斷返回A:如果進行任務調度,則不會執(zhí)行OSIntCtxSw()后的語句,相當于中斷已退出.第137問:Q:最近我在學習使用SMALLRTOS時發(fā)現(xiàn)一個BUG.任務在調用系統(tǒng)等待函數OSWait(K_TMO|K_SIG,x)后,不能在延時x個ticks后被喚醒.我分析了一下原因如下:在OS_CORE.Cuint8OSWait(uint8typ,uint8ticks)small中,case(K_TMO|K_SIG):中執(zhí)行了函數OSTaskSuspend(OSTaskID);(OS_CORE.C第549行)而此函數將延時值改為了0!解決辦法:將此函數改用另一個函數OS_TaskSuspend(TaskID);并在其后加入任務切換函數OSSched();

便能工作正常.A:對,這是疏忽,謝謝.您的更改是對的.第138問:Q:在文件Os_cpu_a.s中的函數OSIntCtxSw中有如下語句:……(1)LDRR4,[R6](2)ADDSP,R4,#68;17寄存器CPSR,OsEnterSum,R0-R12,LR,SP(3)LDRLR,[SP,#--8](4)MSRCPSR_c,#(NoInt|SVC32Mode);進入管理模式(5)MOVSP,R4……(6)LDMFDSP!,{R0-R12,LR,PC}^;運行新任務《ARM微控制器基礎與實戰(zhàn)》404頁中解釋:只所以要(1)(2)是因為"OSTCBHighRdy—>OSTCBStkPtr保存的是任務棧位置,而寄存器恢復后堆棧指針并不指向這,所以要調33整新任務堆棧指針."可是將堆棧指針調整到"新任務入棧的其它數據(見《ARM微控制器基礎與實戰(zhàn)》圖6.3)"處后,除了取出了LR以外并沒有做什么,而當執(zhí)行了(4)后又重新將堆棧指針指向了棧頂(即第(5)句).我認為可以將(2)省去,直接將(3)改為"LDRLR,[SP,#60]",而當執(zhí)行完(6)后,堆棧指針就自動指向了"新任務入棧的其它數據"處.這樣修改后我運行了EX1_arm例子,正常.請問這利用(3)進行堆棧指針調整的原因是什么不調整可以嗎謝謝.A:注意不同模式有不同的SP指針.您這樣做會造成內存泄漏,長時間運行會耗盡堆棧而使程序崩潰.第139問:Q:不明白在光盤上ROMCODE/SRC/下的os_call.c做什么用.A:是應用程序與事先固化到flash中的ucosii接口的一些代碼.在本例中為應用程序如何調用事先固化到flash中的ucosii的OSFlagPend等函數的接口代碼.請看配套《ARM微控制器基礎與實戰(zhàn)》的7.4.3節(jié)的第10點.第140問:Q:請問在OS_CORE.C中的常數數組OSUnMapTbl[]是做什么用的A:用來計算優(yōu)先級的,查表計算比較快.第141問:Q:ucos的中斷嵌套層數是否受到初始化時分配的IRQ堆棧大小的限制我的理解是每一次中斷需入棧的寄存器有R0-R3,R12,LR,SPSR,共7個,如果想達到8層嵌套的話,堆棧長度IRQ_STACK_LEGTH應設為56,不知這樣理解對不對.A:是,但中斷至少占用8個字,因為c語言的中斷處理函數會將一些數據壓入堆棧.要達到8級嵌套需要的堆棧長度與具體的代碼有關.(編者注:新移植代碼已有改變)第142問:Q:請問:核心定時器中斷不進入可能因為……我的程序在運行一段時間以后,核心定時器中斷即操作系統(tǒng)用的Timer0不能進入,查發(fā)現(xiàn)CPSR的I位為1,請教這可能是哪個原因A:估計為開關中斷次數不匹配造成.第143問:Q:請問:Get

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論