找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 7309|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

ADS調(diào)試心得(LPC2478的調(diào)試)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:72519 發(fā)表于 2015-1-23 03:59 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
1、在調(diào)試“E:\htwang\smart2200v201\ARM嵌入式系統(tǒng)實(shí)驗(yàn)教程()\開(kāi)發(fā)板出廠編程程序\液晶顯示程序\LCM_Disp”的程序時(shí),想使用外部RAM進(jìn)行仿真調(diào)試,在將ADS1.2中的“DebugInExram Settings…->Arm Linker -> Output -> Equivalent Command Line”的“-info totals -entry 0x8100000 -scatter .\src\mem_b.scf”改為“-info totals -entry 0x80000000 -scatter .\src\mem_b.scf”時(shí),編譯時(shí)總是出現(xiàn)錯(cuò)誤信息“Error: L6206E: Entry point(0x80000000) lies outside the images”,經(jīng)梁工(寶瓊)提示:“這是由于程序空間超出范圍,需要改一個(gè)參數(shù)。”
       打開(kāi)關(guān)于外部RAM調(diào)試的分散加載文件“mem_b.scf”發(fā)現(xiàn)所有的程序調(diào)試地址都是指向0x81000000Flash地址空間,而不是0x80000000RAM地址空間(此時(shí)硬件電路板上的短路片RAMCS0、Flash CS1),后把0x81******全部改為0x80******,編譯調(diào)試都正常。
2、不正�,F(xiàn)象:在調(diào)試“SmartARM2200 V2.02”實(shí)驗(yàn)箱時(shí),每次實(shí)驗(yàn)箱斷電或?qū)嶒?yàn)箱上復(fù)位按鍵后,H-FlashLoad操作都要重新執(zhí)行一遍(或者簡(jiǎn)單一點(diǎn):只要在H-Flash -> Programming -> Check 按鈕上點(diǎn)擊一下也可以),否則下載程序后實(shí)驗(yàn)箱運(yùn)行不了。
(先是在選用DebugInExram出現(xiàn)這種情況,后選用RelOutChip則不會(huì)出現(xiàn)這種情況。)
       <2008-9-12> 另外,每次重新啟動(dòng)H-JTAGH-Flash后,都要將H-Flash重新設(shè)一遍。
3  現(xiàn)象:在調(diào)試GB_Disp工程時(shí),程序無(wú)法正常運(yùn)行。
分析:當(dāng)調(diào)試的程序中包含中斷時(shí),分散加載文件“mem_*.scf”的“IRAM ”項(xiàng)設(shè)置不能從0x40000000開(kāi)始,而應(yīng)該從0x40000040開(kāi)始(給中斷向量留下空間),否則程序無(wú)法調(diào)試。(先是在選用RelOutChip出現(xiàn)這種情況,后選用DebugInExram也出現(xiàn)這種情況。)
< 2008-9-12 htwang: 上面的解釋并不正確,因?yàn)樵谡{(diào)試其他中斷實(shí)驗(yàn)的過(guò)程中,配置文件“mem_*.scf”的“IRAM ”項(xiàng)設(shè)置成從0x40000000開(kāi)始也可以正常運(yùn)行。(估計(jì)可能是存儲(chǔ)器映射的問(wèn)題)
打開(kāi)GB_Disp工程“target.c”文件,果然發(fā)現(xiàn)在函數(shù)“void TargetResetInit(void)”中將存儲(chǔ)器映射寄存器初始化成“MEMMAP 0x2”,這是選用的用戶(hù)RAM模式,中斷向量也從靜態(tài)RAM重新映射。如果想映射到用戶(hù)外部存儲(chǔ)器模式,應(yīng)該改為“MEMMAP 0x3”(見(jiàn)《ARM嵌入式系統(tǒng)基礎(chǔ)教程》P166 或《****ARM7—LPC2200P119)。按此方式更改后,實(shí)際調(diào)試也正常。
>
2008-9-12結(jié)論:要么把該工程文件 mem_bscf 中的“IRAM ”項(xiàng)改成從0x40000040開(kāi)始;要么把該工程文件“target.c”中的存儲(chǔ)器映射初始化為“MEMMAP 0x3”。
4、在調(diào)試中斷程序時(shí),如果使用IRQ.S中的匯編宏定義程序和“IRQ_Eint3_Handler  HANDLER IRQ_Eint3”代替原來(lái)的C語(yǔ)言函數(shù)中斷方式(當(dāng)然同時(shí)將代碼“VICVectAddr0 = (uint32)IRQ_Eint3;”改為“VICVectAddr0 = (uint32)IRQ_Eint3_Handler; ”),則應(yīng)將C語(yǔ)言中斷函數(shù) void   __irq IRQ_Eint3(void)”改寫(xiě)成“void   IRQ_Eint3(void)”。
       否則調(diào)試是出現(xiàn)的情況就是程序在“IRQ_Eint3_Handler HANDLER IRQ_Eint3”和中斷函數(shù)“void   __irq IRQ_Eint3(void){}”里面反復(fù)執(zhí)行,再也退不出來(lái)。
2008-9-12 調(diào)試“SmartARM2200 V2.02實(shí)驗(yàn)箱”心得:
5、現(xiàn)象:在自己編寫(xiě)定時(shí)器中斷程序時(shí),如果自己用工程模板“ARM Executable Image for lpc2200”建立工程并編寫(xiě)中斷程序后,調(diào)試過(guò)程中總是不能進(jìn)入中斷,但是用定時(shí)中斷的事例程序可以進(jìn)入。
       原因:經(jīng)將自己建立的模板工程文件中的“Startup.s”文件和事例程序中的比較,發(fā)現(xiàn)在模板工程的“Startup.s”文件中的堆棧初始化代碼“InitStack  …”中有一行語(yǔ)句為:
    ;設(shè)置系統(tǒng)模式堆棧
        MSR     CPSR_c, #0xdf
        LDR     SP, =StackUsr
       這就將IRQFIQ都禁止了,需要將“MSR     CPSR_c, #0xdf”改為“MSR     CPSR_c, #0x5f”來(lái)打開(kāi)IRQ中斷才行。
6、現(xiàn)象:用C語(yǔ)言編寫(xiě)中斷函數(shù)時(shí),如void   __irq Timer0Int(void){   },該中斷函數(shù)必須放在主函數(shù)main()的上方,否則編譯時(shí)會(huì)出現(xiàn)錯(cuò)誤(因?yàn)橹骱瘮?shù)需要調(diào)用語(yǔ)句“VICVectAddr0 = (uint32)Timer0Int;”):
1Error: (Serious) C2933E: type disagreement for “Timer0Int”
2) Error: C2456E: undeclared name, inventing ‘extern int Timer0Int’
       解決方法:在主函數(shù)前面加上聲明“void  __irq Timer0Int(void);”(ZLG李工),此時(shí)編譯應(yīng)該不會(huì)再出現(xiàn)上述的問(wèn)題,但如果此時(shí)Debug運(yùn)行時(shí)不正常,需在ADS1.2(編程軟件)執(zhí)行操作“Project -> Remove Object Code… ”后,再重新編譯調(diào)試。
       如果把C語(yǔ)言編寫(xiě)的中斷函數(shù)放到其他文件中,也是類(lèi)似的處理方法,如:“extern void  __irq Timer0Int(void);
7、在ADS軟件中int類(lèi)型占用4個(gè)字節(jié)的空間。
8ALIGN=2 ,即定義2n次冪對(duì)齊方式(梅工(程宇))。(見(jiàn)ARM指令集ARM_zhiling.pdf
9SvcStackSpace      SPACE   SVC_STACK_LEGTH * 4; 其中的SPACE為字節(jié)空間定義(梅工(程宇)),并用0對(duì)之進(jìn)行初始化。(見(jiàn)ARM指令集ARM_zhiling.pdf
10、要想看到所有文件(函數(shù))對(duì)FLASHRAM的使用情況,在編譯選項(xiàng)設(shè)置->ARM Linker -> Listings -> Listings的“Image map”和“Symbols”前面的復(fù)選框選中,編譯后即可輸出想要的詳細(xì)信息(梅工(程宇))。
11、實(shí)驗(yàn)箱上的ZLG7290芯片由于內(nèi)部鍵盤(pán)處理程序沒(méi)有去抖動(dòng)和防連擊處理,所以用起來(lái)不太好用。(據(jù)說(shuō)ZLG7290芯片只是ZLG用一款單片機(jī)寫(xiě)了軟件貼了個(gè)商標(biāo))
2008-9-16 調(diào)試“SmartARM2200 V2.02實(shí)驗(yàn)箱”心得:
12、中斷使能寄存器VICVectEnable寫(xiě)入1,對(duì)應(yīng)通道的中斷使能;寫(xiě)入0,無(wú)效。如指令:
VICIntEnable = 1 << 6;
VICIntEnable = 1 << 4;
指令這兩條指令之后,通道6和通道4都被中斷使能。
       (課本《****ARM7--LPC2200》的P164有詳細(xì)說(shuō)明)
13、在任務(wù)Task定義的局部變量與定義的靜態(tài)局部變量功能等同,因?yàn)槿蝿?wù)不可能返回,只能被中斷(大部分是定時(shí)中斷,也可能是其他中斷)所打斷,這時(shí)中斷會(huì)保存相應(yīng)的現(xiàn)場(chǎng)。(自我理解,沒(méi)有看到相關(guān)資料上如此解釋?zhuān)?/font>
14、用typedef定義的結(jié)構(gòu)體不能多次用#include 包含,否則會(huì)出現(xiàn)錯(cuò)誤:
       Error(Serious) C2930E: duplicate definition of  ‘ ***’
<2008-9-16 htwang注:上述結(jié)論并不正確,出現(xiàn)這種情況是因?yàn)橐粋€(gè)有typedef的頭文件在同一個(gè)文件中include包含了兩次。
>
2008-9-17 調(diào)試“SmartARM2200 V2.02實(shí)驗(yàn)箱”心得:
15、因?yàn)槿蝿?wù)創(chuàng)建成功后OSTaskCreate()即進(jìn)行任務(wù)的調(diào)度OS_Sched(),因而與此相關(guān)的事件創(chuàng)建(如消息郵箱)程序要放在先創(chuàng)建的任務(wù)中,而不是放在即將創(chuàng)建的高優(yōu)先級(jí)任務(wù)中。
<2008-9-17 htwang注:上述結(jié)論不正確,因?yàn)槿蝿?wù)創(chuàng)建后并不會(huì)馬上運(yùn)行,它創(chuàng)建后的切換操作總是會(huì)切換到最高優(yōu)先級(jí)的任務(wù)運(yùn)行,而一般我們都是用高優(yōu)先級(jí)的任務(wù)進(jìn)行所有低優(yōu)先級(jí)任務(wù)的創(chuàng)建,因此任務(wù)仍然會(huì)返回起始任務(wù)繼續(xù)創(chuàng)建其它任務(wù)。所以與此相關(guān)的事件創(chuàng)建(如消息郵箱)程序必須要放在相關(guān)的即將創(chuàng)建的高優(yōu)先級(jí)任務(wù)中。
>
16、現(xiàn)象:在使用消息郵箱進(jìn)行工程“E:\htwang\uCOS_Homework\uCOS_Homework”調(diào)試時(shí),發(fā)現(xiàn)消息郵箱的指針DispMbox總是被不正常修改(因此程序也就不能正常運(yùn)行)。
檢查調(diào)試:經(jīng)反復(fù)檢查調(diào)試,發(fā)現(xiàn)在一個(gè)任務(wù)中使用了一個(gè)100字節(jié)的字符數(shù)組,而給這個(gè)任務(wù)分配的堆棧長(zhǎng)度只有64個(gè)字節(jié),分析應(yīng)該是由于堆棧溢出造成的上述現(xiàn)象。于是把該任務(wù)的堆棧長(zhǎng)度分配為256個(gè)字節(jié),不正�,F(xiàn)象消失。
17、在調(diào)液晶顯示程序時(shí),液晶顯示速率非常慢,經(jīng)查是由于uC/OS II工程模板的Startup.s文件中的總線速率配置太慢。原值為:
;IDCY = 0x0f(最大值), WST1 = 0x1f(最大值), WST2=0x1f(最大值)  
;RBLE=1(字節(jié)選擇有效),MW=1(16位寬總線)
        LDR     R0, =BCFG0
        LDR     R1, =0x1000ffef     
        STR     R1, [R0]
;IDCY = 0x0f(最大值), WST1 = 0x1f(最大值), WST2=0x1f(最大值)  
;RBLE=1(字節(jié)選擇有效),MW=1(16位寬總線)
        LDR     R0, =BCFG1
        LDR     R1, =0x1000ffef     
        STR     R1, [R0]
;IDCY = 0x0f(最大值), WST1 = 0x1f(最大值), WST2=0x1f(最大值)  
;RBLE=1(字節(jié)選擇有效),MW=2(32位寬總線)
;        LDR     R0, =BCFG2
;        LDR     R1, =0x2000ffef            
;        STR     R1, [R0]
;IDCY = 0x0f(最大值), WST1 = 0x1f(最大值), WST2=0x1f(最大值)  
;RBLE=1(字節(jié)選擇有效),MW=2(32位寬總線)
;        LDR     R0, =BCFG3
;        LDR     R1, =0x2000ffef
;        STR     R1, [R0]
修改后的總線配置為:
; 定義總線速度控制字
BCFG_DEF        EQU          0x10000400
IDCY                  EQU          (0x00<<0)
WST1                  EQU          (0x01<<5)
WST2                  EQU          (0x01<<11)
BCFG3_SET      EQU          (BCFG_DEF | IDCY | WST1 | WST2)
IDCYFS             EQU          (0x01<<0)
WST1FS             EQU          (0x03<<5)
WST2FS             EQU          (0x03<<11)
BCFG_FS     EQU           (BCFG_DEF | IDCYFS | WST1FS | WST2FS)
        
        LDR     R0, =BCFG0
        LDR     R1, =BCFG_FS
        STR     R1, [R0]
        LDR     R0, =BCFG1
        LDR     R1, =BCFG_FS
        STR     R1, [R0]
        LDR     R0, =BCFG2
        LDR     R1, =0x1000ffef
        STR     R1, [R0]
        LDR     R0, =BCFG3
        LDR     R1, =BCFG3_SET
        STR     R1, [R0]
分析:由于液晶接在CS3,而CS3的總線配置在uC/OS II工程模板的Startup.s文件中被分號(hào)所屏蔽,所以其值為默認(rèn)值(最大延時(shí))。把有關(guān)CS3的屏蔽去掉,也應(yīng)該能加快液晶顯示速度。
結(jié)論:經(jīng)實(shí)際調(diào)試,把uC/OS II工程模板的Startup.s文件中有關(guān)CS3的總線配置屏蔽去掉并不能正常進(jìn)行液晶顯示,因?yàn)樵禐榕渲玫?/font>32位總線寬度(見(jiàn)上面程序中后加的注釋分析),原總線類(lèi)型配置值與液晶不匹配,必須要進(jìn)行修改。
2008-09-19調(diào)試“E:\htwang\uCOS_Homework2”目錄下的工程心得:
18、互斥信號(hào)量是對(duì)共享資源的獨(dú)占,最好一次使用完必須立即釋放。如果不想一次使用完就釋放(需要該共享資源使用一段時(shí)間或好幾次循環(huán)),那么在另一個(gè)任務(wù)中對(duì)共享資源的請(qǐng)求當(dāng)然可以采用OSMutexPend(RTCModifyMutex,0,&err) 的方法,但只需要該任務(wù)如果得不到共享資源就不能執(zhí)行其他操作;如果任務(wù)在得不到共享資源的情況下仍然需要執(zhí)行其他必須的操作,那么用ifOSMutexAccept(RTCModifyMutex,&err))的方法請(qǐng)求互斥信號(hào)量是一個(gè)很好的選擇。
19、信號(hào)量發(fā)送(包括互斥信號(hào)量)沒(méi)有廣播發(fā)送的方式,信號(hào)量集也沒(méi)有;只有消息和消息隊(duì)列有廣播發(fā)送的方式。
20、為什么在所有軟中斷和IRQ中斷只保存了R0-R3R12,其他的R4-R11為何沒(méi)有保存?(見(jiàn)《嵌入式實(shí)時(shí)操作系統(tǒng)uC/OS-II 原理及應(yīng)用》的P220
2008-9-19 趙永科答)查看一個(gè)C語(yǔ)言函數(shù)編寫(xiě)的反匯編代碼,如果使用了太多的局部變量等,C語(yǔ)言函數(shù)會(huì)在程序開(kāi)始部分自動(dòng)把R4-R11保存起來(lái)(不是全部,用到多少保存多少),如:
STMFD    r13!,{r4-r11,r14}   (其中一個(gè)C函數(shù)頭部的反匯編)
stmfd    r13!,{r1-r11,r14}  (其中一個(gè)C函數(shù)頭部的反匯編)
stmfd    r13!,{r3-r7,r14}    (其中一個(gè)C函數(shù)頭部的反匯編)
所以IRQ中斷只保存了R0-R3R12)。
<htwang注:在編譯階段的所有C語(yǔ)言函數(shù)里,函數(shù)會(huì)在開(kāi)頭自動(dòng)把R4-R11都保存起來(lái),如:STMFD    r13!,{r4-r11,r14}   (編譯階段其中一個(gè)C函數(shù)頭部的反匯編)
而在調(diào)試階段的所有C語(yǔ)言函數(shù)里,函數(shù)會(huì)在開(kāi)頭自動(dòng)把R4-R11中用到的變量智能自動(dòng)保存起來(lái),如:
stmfd    r13!,{r1-r11,r14}  (調(diào)試階段其中一個(gè)C函數(shù)頭部的反匯編)
stmfd    r13!,{r3-r7,r14}    (調(diào)試階段其中一個(gè)C函數(shù)頭部的反匯編)
>
2008-09-20調(diào)試“E:\htwang\uCOS_Homework3”目錄下的工程心得:
21、使用內(nèi)存分區(qū)時(shí),每“一組”數(shù)據(jù)都要申請(qǐng)一個(gè)內(nèi)存塊。(不是每一個(gè)數(shù)據(jù),存放每一個(gè)數(shù)據(jù)只需把申請(qǐng)到的對(duì)應(yīng)的指針加1就行)
22、在調(diào)試“E:\htwang\uCOS_Homework3”目錄下的工程時(shí):如果分配AD數(shù)據(jù)采樣任務(wù)TaskSamp的優(yōu)先級(jí)大于顯示任務(wù)TaskDisp的優(yōu)先級(jí)時(shí),當(dāng)AD數(shù)據(jù)采樣任務(wù)TaskSamp中在開(kāi)始沒(méi)有延時(shí)(如OSTimeDly(1);)程序總會(huì)出現(xiàn)預(yù)取指中止;但當(dāng)設(shè)置AD數(shù)據(jù)采樣任務(wù)TaskSamp的優(yōu)先級(jí)小于顯示任務(wù)TaskDisp的優(yōu)先級(jí)時(shí),即使沒(méi)有延時(shí)OSTimeDly(1)程序也能運(yùn)行。不知是什么原因。
       經(jīng)反復(fù)檢查調(diào)試,發(fā)現(xiàn)給AD數(shù)據(jù)采樣任務(wù)TaskSamp分配的堆棧太�。ㄖ挥�64個(gè)字節(jié)),當(dāng)把該任務(wù)堆棧大小改為256個(gè)字節(jié)時(shí),各種情況下調(diào)試都很正常。
       分析得出:當(dāng)給任務(wù)分配的堆�?臻g太小,在堆棧使用溢出后,會(huì)占用其他任務(wù)的堆棧空間。因此程序就會(huì)出現(xiàn)不可預(yù)料的結(jié)果。
(堆棧分配太小還可能出現(xiàn)的情況,如本調(diào)試心得第15條)
2008-09-22調(diào)試“E:\htwang\uCOS_Homework3”目錄下的工程心得:
23、像程序中的函數(shù)“OSTimeDly(OS_TICKS_PER_SEC * 5); //5s采樣一次” (配置頭文件中定義:#define OS_TICKS_PER_SEC 200) ,其參數(shù)并不需要人工強(qiáng)制類(lèi)型轉(zhuǎn)換,如“OSTimeDly((uint16)OS_TICKS_PER_SEC * 5);”調(diào)試階段的反匯編會(huì)自動(dòng)將它們算好作為一個(gè)常量處理,如下面的實(shí)際反匯編:
[0xe3a00ffa]   mov      r0,#0x3e8  ;OS_TICKS_PER_SEC * 5 =200*5 =1000=0x3e8
[0xebffff4e]   bl       OSTimeDly
24、創(chuàng)建動(dòng)態(tài)內(nèi)存分區(qū)時(shí)“OS_MEM  *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err)”,需注意:
       1)、必須要指向一個(gè)具體的二維數(shù)組,如“uint8  ADCDataPart[10][100];”即addr不能為空;
       2)、每個(gè)內(nèi)存分區(qū)的塊數(shù)必須不能小于2,即nblks  >=  2
       3)、每個(gè)塊的大小必須至少能夠放下一個(gè)4字節(jié)的指針(void *),即blksize  >= sizeof(void *);
<htwang注:也就是說(shuō)每個(gè)塊有4個(gè)字節(jié)的空間被指針?biāo)�。即如果你定義了100個(gè)字節(jié)的塊空間大小,只能使用96個(gè)字節(jié)。這樣看來(lái)在《基于嵌入式實(shí)時(shí)操作系統(tǒng)的程序設(shè)計(jì)技術(shù)》的P130-P133的例程L8-7出現(xiàn)錯(cuò)誤。
>
2008-09-22注:經(jīng)ZLG梅工(程宇)多方確認(rèn):原來(lái)的程序沒(méi)有錯(cuò)誤。這個(gè)需要將OSMemCreate()、void  *OSMemGetOS_MEM *pmem, INT8U *err)和INT8U  OSMemPutOS_MEM  *pmem, void *pblk)三個(gè)函數(shù)聯(lián)系起來(lái)看。
OSMemGet()中,總是將指針OSMemFreeList指向下一個(gè)未用的空間,這樣申請(qǐng)到的塊中的所有空間(包括4個(gè)字節(jié)的指針空間)可以一起使用。原來(lái)申請(qǐng)到使用的塊的指針空間會(huì)在OSM emPut()中恢復(fù)。
OSMemPut()中會(huì)把在OSMemGet()中申請(qǐng)到的指針(指向該塊的首址)重新建立一個(gè)指向下一個(gè)塊(原OSMemFreeList指向的單元)的指針。
具體請(qǐng)看這3個(gè)函數(shù)的源代碼。
25、對(duì)按鍵的延時(shí)去抖和防連擊處理。參考了《基于嵌入式實(shí)時(shí)操作系統(tǒng)的程序設(shè)計(jì)技術(shù)》P163的按鍵處理例程。
26、(2008-9-23)在使用LPC2000系列ARMAD轉(zhuǎn)換部件時(shí)發(fā)現(xiàn):每個(gè)通道在進(jìn)行AD轉(zhuǎn)換時(shí),第1次采樣和第2次采樣有較大的誤差;而第3次采樣又和第1次一樣,第4次采樣和第2次一樣
如:1994mV2036mV,1994mV,2036mV…
       因此,每次都應(yīng)對(duì)同一個(gè)通道采樣兩次,然后舍棄前一個(gè)值。見(jiàn)《基于嵌入式實(shí)時(shí)操作系統(tǒng)的程序設(shè)計(jì)技術(shù)》P132AD采樣例程

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表