第1章 體系結構
第1問:
Q:請問在初始化CPU堆棧的時候一開始在執行mov r0, LR這句指令時處理器是什麼模式
A:複位後的模式,即管理模式.
第2問:
Q:請教:MOV中的8位圖立即數,是怎麼一回事 0xF0000001是怎麼來的
A:是循環右移,就是一個0—255 之間的數左移或右移偶數位的來的,也就是這個數除以4
一直除, 直到在0-255的範圍内它是整數就說明是可以的!
A:8位數(0-255)循環左移或循環右移偶數位得到的,F0000001既是0x1F循環右移4位,
符合規範,是以是正确的.這樣做是因為指令長度的限制,不可能把32位立即數放在
32位的指令中.移位偶數也是這個原因.可以看一看ARM體系結構(ADS自帶的英文文
檔)的相關部分.
第3問:
Q:請教:《ARM微控制器基礎與實戰》2.2.1節關于第2個操作數的描述中有這麼一段:
#inmed_8r常數表達式.該常數必須對應8位位圖,即常熟是由一個8位的常數循環移
位偶數位得到.
合法常量:0x3FC,0,0xF0000000,200,0xF0000001.
非法常量:0x1FE,511,0xFFFF,0x1010,0xF0000010.
常數表達式應用舉例:
...
...
LDR R0,[R1],#-4 ;讀取 R1 位址上的存儲器單元内容,且 R1 = R1-4
針對這一段,我的疑問:
1. 即常數是由一個8位的常數循環移位偶數位得到,這句話如何了解
2. 該常數必須對應8位位圖,既然是8位位圖,那麼取值為0-255,怎麼0x3FC這種超
出255的數是合法常量呢
3. 所舉例子中,合法常量和非法常量是怎麼區分的 如0x3FC合法,而0x1FE卻非法
0xF0000000,0xF0000001都合法,而0xF0000010又變成了非法
4. 對于彙編語句 LDR R0,[R1],#-4,是先将R1的值減4結果存入R1,然後讀取R1所
指單元的 值到R0,還是先讀取R1到R0,然後再将R1減4結果存入R1
A:提示,任何常數都可用底數*2的n次幂 來表示.
1. ARM結構中,隻有8bits用來表示底數,是以底數必須是8位位圖.
2. 8位位圖循環之後得到常數,并非隻能是8位.
3. 0xF0000010底數是9位,不能表示.
4. LDR R0, [R1], #-4 是後索引,即先讀,再減.
可以看一看ARM體系結構對相關尋址方式的說明.
3
第4問:
Q:在程式移植的過程中,什麼代碼段處于什麼樣的模式,這可真是一個困擾人的大難題,
有沒有一種标志或辦法能夠識别"代碼段處于什麼樣的模式"
A:讀取 CPSR ,任何時候都是可以讀.
第5問:
Q:為什麼保護現場時,總是保護 R0-R3,R12,為什麼不保護R4-R11
A:請看一看"ARM-thumb過程調用标準"這個文檔.
第6問:
Q:請問 mov R1,#0x00003DD0 錯誤:out of the range of operation是怎麼回事情
我就是想IODIR=0x00003dd0,彙編就是
LDR R0,=IODIR
MOV R1,#0x00003dd0
STR R1,[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:為什麼在中斷向量表中不直接LDR PC,"異常位址".而是使用一個标号,然有再在後面
使用DCD定義這個标号
A:因為LDR指令隻能跳到目前PC 4kB範圍内,而B指令能跳轉到32MB範圍,而現在這樣
在LDR PC, "xxxx"這條指令不遠處用"xxxx"DCD定義一個字,而這個字裡面存放最終異
常服務程式的位址,這樣可以實作4GB全範圍跳轉.
Q:LDR 不是可以全空間跳轉的嗎 《ARM微控制器基礎與實戰》程式清單5.3.
A:LDR僞指令通過設定指令緩沖池才能實作全範圍跳轉,而LDR指令則隻能實作4KB範圍
跳轉.
第12問:
Q:ARM7TDMI-S和ARM7TDMI有何差別
A:ARM7TDMI-S是ARM7TDMI的可綜合(synthesizable)版本(軟核).
對應用工程師來說,除非晶片生産廠商對ARM7TDMI-S進行了裁減,
否則ARM7TDMI-S與ARM7TDMI沒有太大的差別,其程式設計模型與ARM7TDMI一緻.
第13問:
Q:DCD僞指令的疑惑.
"StackUsr DCD UsrStackSpace + (USR_STACK_LEGTH - 1) * 4"
這句話是什麼意思 DCD後面的程式标号或數字表達式是何意
A:它的内容是初始化遞減堆棧的最高位址,看《ARM微控制器基礎與實戰》2.3.2節.
5
第2章 編譯器與語言
第14問:
Q:00254: Unimplemented RDI message是什麼錯誤提示 我的設定連接配接都正常,是不是
晶片燒了
A:是JTAG的問題.可以先使用ISP操作試試就知道了,如果能ISP,說明LPC2104沒有損
壞,還能正常運作程式.
第15問:
Q:請教:我在調試程式的時候在AXD中出現這樣的提示資訊:
RDI Warning 00159:could not open specified device port.
我是根據配套教程的步驟設定的.
A:請按照CD光牒\easyarm_drive\readme.txt安裝驅動程式.
第16問:
Q:我用實驗程式運作經常出現下列資訊! 程式不能下載下傳到目标闆.
Warnning! interrupt vectors data is not correct!
Program you downloaded can not run freely!
A:1.仿真器配置一定要正确,即"EasyARM Configuration"設定視窗中的"FLASH"項中選擇
"Erase Flash when need";
2.向量表累加和要為0;
3.可以先在RAM調試一個程式(運作),然後STOP,再使用File->Load Image...加載要
下載下傳到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.h,用
lpc2106.inc則無法加入project,請問彙編器應如何設定
A:不用加2106.inc隻要該檔案在你的工程檔案夾中,就可以直接在彙程式設計式的開始處加
6
"include 2106.inc".
注意:該檔案是彙編檔案定義的頭檔案,定義内部寄存器.
第20問:
Q:入口點是什麼意思 我在使用LPC2106上移植UCOS-II,每次MAKE時總是提示我
Image does not have an entry point,可是我是把CD光牒的vetctors.s 複制過來的,
而且仔細看了看,已經聲明了ENTERY,這是怎麼回事
A:需要在ADS中設定入口.
第21問:
Q:請教:如何定義不被初始化變量
A:讓編譯器不知道有這個記憶體位址即可.
A:如用分散加載檔案配置設定RAM故意預留一部分RAM不配置設定,用它來存您不需要初始化的東
西.或者不調用編譯器提供的啟動代碼,不過這樣可能程式設計會麻煩一些.
第22問:
Q:我直接通過JTAG口下載下傳EasyArm闆帶的Ext1_test程式到ARM中,出現中斷向量的告警:
interrupt vector is not correct arm is not running freely.
果然複位後晶片不能運作.但是我用序列槽下載下傳後晶片能正常工作,中斷也行的.
并且我用JTAG仿真的話,晶片能正常工作,中斷也行的,唯獨JTAG口下載下傳不行.
不知道是什麼原因
A:仿真器配置中要設定Erase Flash when need.也可以這樣試試:
1.可以先打開一個工程在RAM中調試運作;
2.stop程式;
3.使用File->Load Image…重新加載Ext1_test生成的*.axf檔案.
Q:仿真器配置中我是設定了Erase Flash when need,但照你說的話,那不是在RAM下調
試嗎
在RAM下調試我是可以的,但是下載下傳後出現interrupt vector data is not correct.
我又看了幾篇文章,是不是跟中斷向量表的累加和不為零有關系啊
A:是的,是向量表的累加和不為零.
因為如果用ISP下載下傳能運作,說明向量表的累加和已為零,而用JTAG下載下傳不能運作的情
況可能是 沒有正常下載下傳代碼.先在RAM中調試,目的是為了後面正确下載下傳程式到
FLASH.
第23問:
Q:用Scatter怎樣将某個函數或檔案定位在Flash的某個位置
A:參考 ID=1009
7
第24問:
Q:我在仿真時遇到這樣的提示:
Error, Flash is protected by user configation!
怎麼寫到flash裡面呢
A:看配套《ARM微控制器基礎與實戰》附錄一.
第25問:
Q:我在移植實驗中想到了兩個問題,如下:
1.Debug和Release以及DebugRel有什麼不同,為什麼在作2104移植實驗時,要用
Release
2.在Release中為什麼要将RW Base設定為0x40000040 我将其設定為0x40003000,
為什麼不能工作
A:都隻是一個問題,記憶體空間的使用,因為跑OS要比較大的記憶體空間,是以要騰出點地方.
第26問:
Q:請問沒有MMU的ARM晶片是否支援使用malloc()函數動态配置設定記憶體
A:是否支援malloc()函數與晶片沒有多大關系,主要與編譯器有關.
Q:再問:如果沒有作業系統支援呢
A:也支援.
第27問:
Q:在I2C實驗程式中,我想檢視資料緩沖區DataBuf的值,怎麼檢視
A:watch視窗或滑鼠停留在要檢視的變量名上.
Q:我查詢的是寫入DataBuf緩沖區的值,滑鼠在上面根本就不會出現他的值,即使在watch
中加入,
結果也是"name not found".
A:變量被優化,調試時可以把該變量定義為全局變量檢視.
第28問:
Q:仿真軟體和2104開發闆連接配接不上
DBE Warning 00041:
!An unspecified Debug Toolbox call failed
電源和開發闆都連好,錯誤和沒接開發闆一樣,驅動也安裝了,安裝時按确定鍵時,軟
件很長時間才有如上反應,請幫忙
A:1.并口是否正常
2.在其它作業系統(如98)下或其它台式PC下試試.
第29問:
Q:如何生成32位hex檔案
8
我在Release Setting->ARM fromELF->Output Format中設定為Intel 32bit HEX,可
是好像沒有生成hex檔案
A:試試這種方法:
Target-->Target Setting-->Post Link中選擇"ARM fromELF"加上你上面設的應該不
成問題.
第30問:
Q:請問關于settings中r0 base rw base的意思
A:ro:read only,rw:read and write.
第31問:
Q:編譯成功後的資訊第一行,code,R0 data,RW data,ZI data,debug分别代表什麼
A:R0 隻讀段,即程式代碼空間;
RW 可讀/寫段,即資料變量空間;
ZI 清零變量段,即需要清零初始化的資料變量空間.
第32問:
Q:如何在ADS裡面看任務執行的一些情況 比如堆棧.
A:多任務環境下的堆棧,記憶體等資訊需要調試軟體的支援才可以實作.
ucos下有一個統計功能的子產品可以間接實作部分功能.
第33問:
Q:請問向flash燒資料時出現:exceeds flash limitation 請予賜教!
A:要寫入的flash位址超過了範圍.如果不是代碼太大的問題,可以檢查scf檔案是否正
确.
第34問:
Q:在LPC2214之類的晶片中如何實作數組的絕對位址定位,比如51的_at_的用法.
A:*((char*)0x40000300)類似通路
Q:謝謝,但這樣做就無須定義數組變量,通路也不便,還有高招嗎
A:可以使用分散加載.
第35問:
Q:請問 ADS編譯錯誤"L6221E:Execution region ER_RO overlays with Execution region
ER_ZI" 該如何解決
A:請用我們網站上的工程模闆試一試,最大的可能是因為你的RELEASE或者DEBUG選項裡
面沒有正确設定,按照參考《ARM微控制器基礎與實戰》上面的設定,是不會有這個問
題的.
9
第36問:
Q:請教一下:将程式寫入flash,再用從JTAG方式調試寫入之後再複位程式沒什麼反映.
看了很多以前的文章,說memmap寄存器要為1,我用的是一個很簡單的控制led的例子,
改動了參數之後寫入flash的.在這個程式的vectors中找不到關于memmap寄存器操作
的部分啊,這是怎麼回事,該怎麼辦呢
A:《ARM微控制器基礎與實戰》上附錄有"常見問題",列舉了幾點程式寫到FLASH不能運
行的原因. memmap操作可以在target.c中的TargetResetInit()函數内添加.
第37問:
Q:HEX檔案.EASY2100配套《ARM微控制器基礎與實戰》上講:把項目編譯成HEX檔案,
我不會呀,咋辦
A:Target-〉target settings設定Post-linker并且設定Linker-〉fromELF.
Q:再問:我用的是CD光牒裡的例子,打開工程項目裡是DebugInARM.DebugInFlash.
RelInFlash.不是《ARM微控制器基礎與實戰》上的DebugRel呀,我都照《ARM微控制
器基礎與實戰》上設定的,可用ISP下載下傳,提示無法找到HEX檔案.
A:CD光牒上的例子是用專用工程模闆建立,已經設定好參數,與預設模闆不同.
第38問:
Q:EasyARM2100開發闆如何通過JTAG接口下載下傳到Flash
我在用EasyARM2100開發闆時JTAG接口不能進行Flash中的調試(DebugInFlash),但
是可以在RAM中調試(DebugInRAM),且通過ISP程式設計可以寫入Flash.
通過JTAG接口進行DebugInFlash調試時,總是出現如下提示:
Flash Sector 0 write failed!
Warnning interrupt vectors data is not correct!
Program you downloaded can not run freely!
請問是什麼原因 我該如何辦
A:仿真器設定選項有一個允許擦除FLASH的選項,選擇它.
第39問:
Q:我發現程式在RAM調試時(RO=0X40000000) OK,但是JTAG下載下傳到FLASH(RO=0X00000000),
顯示如下:
The session file 'c:\Documents and Settings\jan\default-1-2-0-0.ses'
could not be loaded.
A:這是ADS自身的問題,請不要通過IDE運作AXD,而是通過開始菜單運作,然後Load調
試檔案調試.
第40問:
Q:我有幾個問題想問問大家.
10
調試主機負責對ARM源程式進行編譯連結,最好用什麼樣的進階語言對ARM源程式進行
編譯連結 使用調試程式(如AXD)進行JTAG調試,AXD是什麼調試程式,是否是類
似什麼軟體之類的 到哪能下載下傳AXD的調試程式呢 怎麼樣進行AXD程式進行JTAG調
試
如何通過JTAG仿真器發送到目标機上呢
對于單片機的調試,都用到了什麼軟體
都個有什麼作用呢
A:可以使用 ADS1.2,Keil C也支援.AXD是ADS的一個元件.
您可以在本公司網站下載下傳 EasyARM2100開發套件快速入門看一看.
第41問:
Q:EasyARM2100AXD調試時出錯,故障現象:
按照CD光牒上的方法設定好ADS1.2後打開CD光牒上的expamples\gpio\c\LedDisp的工程文
件(從CD光牒上拷貝到硬碟,已去處隻讀屬性).
編譯通過後,按Debug按鍵運作調試,進入AXD.按Go按鍵,EasyARM沒有反應.再按
Stop按鍵.
AXD彈出兩個确認框視窗:
"No disassembly could be read at the requested address".
如果進入AXD直接按Step按鍵,也是會彈出同樣的兩個确認框.
軟體是CD光牒上的,沒有經過任何改動.CD光牒上的程式試過4,5個都是這種情況.
AXD的設定是按照CD光牒上的說明設定的.
EasyARM上的JP8 是斷開的.ADS在出現這種問題後重新安裝過,故障依舊.
出現這個問題前,可以調試.隻是單步的時候感覺比較慢.差不多1-2秒鐘才能單步一
次.
A:原因找到了,是晶片被加密了,無法寫入新的程式,用FLASH ISP清除後解決.
加密後JTAG完全不能控制晶片,否則可能被解密.
第42問:
Q:我闆上的lpc2214開始可以線上程式設計,隻搞了兩三次可以把檔案寫進去.但我發現P0.14
未置低電平時也進入ISP模式,燒入的檔案原來可以ISP下載下傳到2014開發闆中運作的.
最後隻能讀晶片的一些ID,載檔案都不能進行.以下是對整片ERASE時,對序列槽的捕獲,
指令傳回是19.
Synchronized
Synchronized
OK
11059
OK
U 23130
P 0 14
E 0 14
11
19 configure tar... -> ARMUL , 隻能仿真ARM核外設不能仿真.
第48問:
Q:為什麼盤中的工程會出錯啊
A:檔案的隻讀屬性去掉了嗎
第49問:
Q:您在2104的《ARM微控制器基礎與實戰》中提到ucos與應用代碼分開編譯,在分開編
譯調試成功之後,最後要将代碼統一固化到晶片中.在最後一步需要注意什麼 統一編
譯時感覺要改動很多東西,有沒有什麼最簡單的辦法 能否詳細介紹一下方法 多謝!
A:使用我們的工程模闆,可在本公司網站下載下傳.其實不分開編譯也可調試.
的EasyARM2104開發套件快速入門和LPC210...
第50問:
Q:請問,我的2104闆子,通過EasyJTAG仿真時,在AXD上沒有檔案,而且出現這樣
"Error, Flash is protected by user configation!"
的提示,這是怎麼回事啊 在AXD應該打開什麼類型的檔案啊 謝謝啦!!!!
A:在仿真器的配置視窗設定仿真器允許擦除FALSH.
AXD->Options->configure target->configure->erase……
13
第51問:
Q:關于arm彙編語言跳轉指令的特殊用法.有如下兩條跳轉指令:
beq lablef
beq lableb
其中lable為某段程式的标号,beq lablef 表示向前跳轉到與目前指令最接近的标号
lable處執行,而beq lableb表示向後跳轉到與目前指令最接近的标号lable處執行.
在arm彙編中有定義這樣的用法嗎
A:沒有.
第52問:
Q:我将一段程式從flash從複制到了RAM中,但是因為混合程式設計中不能直接向PC寄存器中
指派來實行跳轉,這樣我該如何跳轉到這個RAM中的位址呢
A:用函數指針.可參考IAP例子.
第53問:
Q:我想詳細的了解一下ADS開發工具中的stack.s ,heap.s和startup.s中代碼的含義,
各位高手推薦本書或給解釋一下
A:開發套件使用者指南的第3.1.3節有說明.
stack.s定義了系統模式堆棧的起始位址.
heap.s為初始化庫函數的堆,是按ADS的編譯器要求編寫的.
startup.s向量表及初始化代碼,是根據CPU來編寫的.
第54問:
Q:我不知道所選擇的C檔案到底是用ARM還是THUMB編譯的,請大俠指點!
A:看配套《ARM微控制器基礎與實戰》7.1,7.2,7.3節.
第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中申明的,不知道為什麼會出現這種錯誤,能不能給我一個比較合理的目錄
結構
A:請參考我們CD光牒的目錄結構.最好使用我們的工程模闆.
第56問:
Q:請問,我現在做2114的産品開發.出現以下問題,特向您請教! 問題:
我們開發的産品要采樣,采用周期固定.于是我們采用timer0進行時鐘觸發,利用觸發
中斷程式 每隔10毫秒采樣一次并顯示波形.這都能很好的進行.但是在中斷程式裡
面對幾個全局變量指派, 跳出中斷後卻不能使用該全局變量.很是頭疼!請賜教!!
14
架構如下:
uint8 a; //全局變量
void __irq funtimer0()
{
...
a=0; //在中斷函數裡面對全局變量指派
...
}
void fun1()
{
uint8 i;
i=0;
.......
i=a; // 出錯位置,在調試過程中運作到目前位置,滑鼠移動到變量a上
// 顯示數值是0,但是不能傳給i,i的值不會随該指令改變.
......
}
是以,我在中斷函數中采集到的資料放到全局數組中.采集完成關中斷後在使用者模式下
的程式中來處理該數組,但是該數組中的資料也不能使用!全局數組變量占1000個位元組,
IRQ堆棧長度是256.
A:全局變量用volatile聲明.
第57問:
Q:在AXD裡打開Debuger Internals,在Variable Name裡為什麼沒有PINSEL2,ADDR,ADCR
等寄存器 要在哪裡設定
A:有些片内外設寄存器是不能讀出,《ARM微控制器基礎與實戰》上的P33頁有說明及處理
方法(在Memory視窗寫入相應寄存器位址).
第58問:
Q:請問不連easyArm闆可不可以直接軟體調試程式
我是指如果想直接調軟體部分,能不能在ads或axd裡直接調試
A:這和闆子沒關系啊,你直接選ARMulate不就行了,注意把等待PLL配置完那條語句屏蔽
就可以啦!
第59問:
Q:AXD裡面出現 "RDI Warning 00159: Could not open specified device port"
誰能告訴我這個是問題啊我一直搞不懂啊,全部是按照《ARM微控制器基礎與實戰》第4
章上配的圖做的啊,但是就是不能仿真啊.
A:請先按照CD光牒的easyarm_drive\readme.txt安裝驅動程式.
15
第60問:
Q:1.在《ARM微控制器基礎與實戰》的2.6.3節有說到"浮點數寄存器(F0-F7...)",2104
是否具有這些寄存器
2.如果EasyArm不支援浮點運算,而我的程式需要用到浮點運算,請問可以實作嗎
A:1.沒有.
2.用C就可以用浮點運算.
第61問:
Q:EASYARM2104的例子程式怎麼都是調用C寫的程式,彙編那個怎麼沒用的啊
A:按如下步驟進行處理:
1.在項目管理視窗中删除原來的所有檔案;
2.在項目管理視窗中增加彙編檔案*.S;
3.編譯連結,調試.
第62問:
Q:請問版主:在AXD調試軟體中,我單步運作到一定時候,我想讓自己編的軟體從複位處
重新運作, 在AXD軟體中,EXECUTE欄目中有單步,連續,運作到光标處等功能,但
無複位功能,如果要實作此功能,如何操作
A:我也沒有發現,目前隻能用重新裝載的操作實作.
第63問:
Q:在AXD調試中,通過從jtag接口,連接配接上lpc2106,出現如下資訊:
TKSimulator for ADS, V1.2, 2003/08
Software Supplied by: ZLGMCU
ARM7TDMI-S, Little Endian
在從file|load imgage...檔案,出現兩種情況:
1.正常,完全能調試;
2.出現問題,如下:
RDI Warning 00254: Unimplemented RDI message
請問,這是錯在哪裡 如何解決 謝謝!
A:可能是電源或其他接插件接觸不良引起.
第64問:
Q:請教幾個問題:
1.移植中底層接口裡的__swi關鍵字在SDT中能用嗎
2.為什麼在勘誤文檔中時鐘節拍服務子程式裡去掉了開中斷及關中斷的宏
3.時鐘節拍中斷的優先級應該設為最高嗎
16
A:1.不知,請自己看一看軟體自帶文檔.
2.因為中斷服務程式中肯定是關中斷的.
3.不必.
第65問:
Q:arm彙編中的中括号是什麼意思 比如下面的例子中括号是什麼作用呀
[ PLLONSTART
ldr r0,=PLLCON
ldr r1,=((0xe8<<12)+(0x4<<4)+0x2)
str r1,[r0]
]
A:等效于:
IF PLLONSTART
ldr r0,=PLLCON
ldr r1,=((0xe8<<12)+(0x4<上電->啟動AXD.現象:數位管能
顯示不斷變化的數字0--F,但是AXD的連接配接失敗,提示"DBE Warning 00041: ....".
重複試了幾遍,現象相同.
請教原因以及對策.
A:剛才把我機器的Win2K系統的使用者屬性從"PowerUser"修改為"Administrator"就沒
問題了.可能是ADS/AXD安裝的時候用了Administrator權限,在"PowerUser"下工作
有問題吧.
如果哪位老兄有類似問題,不妨試一下這個方法.
第67問:
Q:在Init.s中有這樣一段:
Reset
BL InitStack ;初始化堆棧
BL TargetResetInit ;目标闆基本初始化
B __main ;跳轉到c語言入口
誰知道__main()函數的具體内容
假如我不需要調用庫函數的話,是否可以改為B main
A:看調試是彙編代碼裡有__main(),組成成分與一些連結選項有關.
可以.但是全局變量初始化不了.
17
第68問:
Q:我在C中嵌入這樣一條語句
__asm
{
MRS R4,CPSR;
STMFD SP!,{R4};
ORR R4,R4,0x80;
MSR CPSR_cxsf,R4
}
會出新報錯"illegal write to sp"版主和各位大俠有什麼辦法解決阿
A:嵌入彙編不能使用SP.
第69問:
Q:請問 ADS如下的編譯錯誤是什麼意思
L6221E:Execution region ER_RO overlays with Execution region ER_ZI
A:程式段記憶體配置設定可能有問題,RO(隻讀),ZI(0初始化)
第70問:
Q:在axd中有沒有運作程式的時間電腦 keil中就有那樣的東西.
A:有的,不過不是時間而是執行周期,可以換算成時間.在debugger internals中,具體
可以參考幫助文檔.
第71問:
Q:我最初的init.s中沒有加入heap的配置設定和__user_initial_stackheap函數,結果程式
跳到SWI中死循環.我把他們加入後就好了.或者不加入他們,把B __main改為B main
也可以.請問何解 另外,就算目标闆會陷入死循環,但是用軟體仿真卻可以正常運
行.何解
A:堆的位置沒有配置設定到有效的RAM中.
第72問:
Q:在ARM彙編語言中,對立即數的有要求,我記得原來沒有這樣一說了.現在反而糊塗了,
用立即數時候,很小心很忌諱,不回象51下随心所欲的使用了,有對立即數熟悉的朋友
站出來給大家釋疑.
A:如使用"非法資料可以使用lrd送到寄存器"的方法.
首先在存儲器中定義一個常量,再ldr進去,編譯器是這樣弄的.可以看下面語句反彙
編的差別;
int z=0x101;
int z=0Xff;
18
第73問:
Q:請教各位:我在AXD中單步運作一段程式後,想回到程式的開始重新運作,除了重新加
載,
還有其他方法或按鍵
A:你的程式有多大 程式在Flash運作點選Reload Current Image也不需要1秒吧~
或在代碼視窗Set PC=0
第74問:
Q:在《ARM微控制器基礎與實戰》程式清單6.22的376頁的OSIntCtxSW_1中:
LDR R4, [R6]
ADD SP, R4, #68
LDR LR, [SP, #-8]
MSR CPSR_c, #(NoInt | SVC32Mode)
MOV SP, R4
LDMFD SP!, {R4,R5}
LDR R3, =OsEnterSum
STR R4, [R3]
MSR SPSR_cxsf, R5
LDMFD SP!, {R0-R12, LR, PC }^
請問高手:LDMFD SP!, {R0-R12, LR, PC }^是不是恢複新任務工作寄存器和工作模式,
LR寄存器一并得到恢複,那麼ADD指令後面的 LDR LR, [SP, #-8] 指令是不是可
以去掉
A:兩者恢複的是兩個不同處理器模式的LR.
第75問:
Q:既然option頁中的Image entry Point填入的是調試入口位址,那麼在實際的程式運作
當中它是不會 覆寫代碼中的ENTRY入口聲明的,對嗎 僅僅是為了調試的友善.
A:Image entry Point優先.其實代碼中的ENTRY是為了確定代碼不被優化掉.
第76問:
Q:我想使用标準C語言的庫函數,比如memset 在string.h中有定義,可是我直接包含
#include , 但是編譯沒錯誤,運作确有錯誤,應當怎麼設定
A:請使用最新的工程模闆
第77問:
Q:軟體中斷是不是必須由SWI指令觸發
A:可以直接用你定義成軟中斷的函數名啊.比如:
19
__SWI(0x12) void myswi(void); // 聲明函數
__asm // 調用方式1
{
swi 0x12
}
myswi(); // 調用方式2
第78問:
Q:《ARM微控制器基礎與實戰》程式清單6.9的程式是在哪裡被調用的
_user_initial_stackheap
LDR r0,=bottom_of_heap
MOV pc,lr
A:__main.千萬别删喲, 否則出大事的.
第79問:
Q:"LDR R0, =PINSEL0" 中"="是什麼意思 這語句是取位址還是取位址中的内容呢
A:這是LDR僞指令,可用來加載32位立即數或位址,LDR R0,=PINSEL0是将PINSEL0的地
址加載到R0中.
第80問:
Q:我不明白"SWI 0"和"SWI 0X123456"這兩條指令中的0和0X123456中有何用.
有沒有應用SWI的具體例子讓我看看
A:那是特定的中斷入口位址,見ADS_DeveloperGuide_D.pdf下的swi.
第81問:
Q:SWI的功能表嗎
A:SWI的功能表由swi異常服務程式決定.很多時候由程式設計者自己決定.
第82問:
Q:請問:我在實驗您的原代碼進行ucos移植時用的是例1,但是在按照圖7.17設定處理
器的仿真器模式時enable comms channel view 和semihostin項為不可激活狀态.為
什麼,能否給一點提示
A:在一些仿真器上使能了它們會影響swi異常處理程式.
第83問:
Q:請問"Unimplemented RDI message"這個出錯提示是什麼意思啊
20
還有,有的時候當我用axd load一個.axf檔案時,常常loading的沒完沒了,這是怎
麼回事啊
A:Unimplemented RDI message:為指令操作失敗,需要重新連接配接.
下載下傳不結束為出現不正常現象,請重新連接配接并下載下傳.如果每次都出現該現象請聯系我們
的技術支援.
第84問:
Q:各位高手好,我是ARM初學者我在程式調試中"LDR PC,[PC,R2]"指令執行後PC為什麼
=0x0000000c, 在這條指令執行前PC+R2位址上的值是0x0000000c嗎
A:要使用軟體仿真.0x0000000C是預取中止了.
Q:請問:ARM7在初始化CPU堆棧時,寄存器CPSR和CPSR_c有什麼關系 CPSR_c是在那裡
定義的
A:這是MSR指令的文法,"_"後部分指定CPSR的域,請參考《ARM微控制器基礎與實戰》
上關于這條指令的說明.
第85問:
Q:軟中斷SWI作底層接口的問題.以下函數為啥要通過軟中斷調用,可以直接調用嗎
OS_TASK_SW(),
_OSStartHighTdy(),
OS_ENTER_CRITICAL),
OS_EXIT_CRITICAL(),
A:在使用者模式或Thumb狀态不能直接調用.
第86問:
Q:ARM的一條指令是32bit長, 但有時一個立即數也是32bit, 這是如何解釋的
A:指令中使用的立即數需要時8位數移位獲得,并非所有數都可以.
第87問:
Q:請教:全局變量的值在複位(不斷電)後會不會自動清零 (用CD光牒自帶的啟動代碼)
A:在C語言中一般會會初始化0或使用者指定的值,但這不是硬體自動的.
第88問:
Q:the setting files for *.mcp is locked!是什麼問題
A:檔案屬性隻讀.
第89問:
21
Q:請問,關于printf() 在ads中怎麼用不了 謝謝!
A:請用我們我們網站上下載下傳2104的工程模闆,它解決了這個問題.
即使這樣,也不能真正使用prinf.您還需要自己編寫一些底層函數才能使用,詳細參
考ads自帶的ADS_CompilerGuide_D.pdf.
第90問:
Q:swi的功能号是如何來的 它和LR寄存器的值是何關系
如《ARM微控制器基礎與實戰》程式清單6.13
LDREQ R0,[LR,#-4] ;BICEQ R0,R0,0xff000000
A:LDREQ R0,[LR,#-4] ;用來讀SWI的代碼
BICEQ R0,R0,0xff000000 ;是ARM 方式進入,取低24bit
第91問:
Q:請問在TargetInit()中函數開始會執行srand((INT32U)TargetInit),它是做什麼用的
A:ex1用它來産生随機數種子的.
Q:請問:我建立的工程中,所有源檔案與2104附帶的CD光牒例子源檔案相同,編譯連結也一
切正常, 可就是不能到闆子上跑!
提示錯誤是:向量中斷有錯誤,無法自由運作!!
這是怎麼回事 相同的源檔案,加在你的工程裡,正常;加到我的工程中就出錯!
我建立的是ARM可執行映象.
A:vector.s你自己的嗎 如果是要計算向量去的累加和了.
第92問:
Q:請問:vectors.s中"DCD 0xb9205f80" 的0xb9205f80在實際運用中需要改動嗎
A:不需要更改,除非改動了向量表中的指令代碼.
第93問:
Q:請問,為什麼queue資料隊列,《ARM微控制器基礎與實戰》上給畫成了環形
A:因為頭跟尾的指針指向一個位址,隊列邏輯上是環狀的.
第94問:
Q:有沒有人成功的把一個資料定義到程式空間裡 各種方法我都試了,是不是有什麼編譯
開關
A:使用const修飾,定義變量時帶初始化值,要定義為全局的變量.
第95問:
Q:ads裡沒有CODE關鍵詞,怎樣使定義的字元串數組不占用RAM空間
22
A:const unsigned char string[]
第96問:
Q:在例程中TIME_test中的TIMEOUT當寫入時提示:
Warnning! interrupt vectors data is not correct!
Program you downloaded can not run freely!
我不知怎樣改設定,哪位提醒一下
A:中斷向量表的校驗和不為0,用AXD看0位址的資料(32位方式),自己加一下.注意把
高于32位的部分去掉.
第97問:
Q:請教各位:我做TIMEOUT實驗(2104闆),Make通過,Debug時出現了如下錯誤提示:
Warnning! interrupt vectors data is not correct!
Program you downloaded can not run freely!
設定Link:ARM Link
r0 base:0x00000000
rw base:0x40003000
image entry point:0x00000000 其它的沒變!!
而我使用ISP完全可以下載下傳而且可以運作!這可以說是設定問題,但是我實在找不到!
怎麼辦
A:請看一看配套《ARM微控制器基礎與實戰》附錄1,ISP軟體可能對它進行了處理,而JTAG
沒有特殊處理
第98問:
Q:*(volatile unsigned int *)是什麼意思 例如*(volatile unsigned int *)addr具體
是什麼意思
A:分開來看,(volatile unsigned int *)就是定義一個可變的無符号整形指針,前面的那
個*就是取起内容.
第99問:
Q:如何了解#define VICIRQStatus (*((volatile unsigned long *) 0xFFFFF000))
A:宏定義,參考C語言的書籍.
(volatile unsigned long *) 0xFFFFF000 将0xFFFFF000強行轉換為指針,然後 *(指
針) 即可對此位址進行通路.
第100問:
Q:在異常處理向量表的設定中,為什麼不直接将異常向量的入口位址寫入PC中呢,為什麼
非要用什麼DCD這些僞指令,到底有什麼用啊
A:為了保證任何時候其累加和為零,不然改一次程式就要計算一次.
23
鄭重聲明:本文來源自網際網路,版權歸原作者及其所在機關,其原創性以及文中陳述文字和内容未經本站證明,請讀者僅作參考,并請自行核實相關内容。