1. 程式人生 > >mdk錯誤記錄(持續更新)

mdk錯誤記錄(持續更新)

1、 warning: #61-D: integer operation result is out of range

由於編譯器預設signed int即32位有符號整數型別,而1<<31實際為0x80000000,
這樣就有可能改寫了符號位(最高位)
依此類推,(2<<30),(3<<29)...等都會出現編譯警告問題.
解決辦法為: ((unsigned int)1<<31),((unsigned int)2<<30),...

2、warning:  #3048-D: inline assembly not permitted when generating Thumb1 code

原文地址::http://www.openedv.com/posts/list/0/55803.htm;jsessionid=BF32A849CB8EF733FEEC85010EBCE48C

 

void WFI_SET(void)
{
__ASM volatile("wfi");  
}
//關閉所有中斷
void INTX_DISABLE(void)
{  
__ASM volatile("cpsid i");
}
//開啟所有中斷
void INTX_ENABLE(void)
{
__ASM volatile("cpsie i");  
}
//設定棧頂地址
//addr:棧頂地址
__asm void MSR_MSP(u32 addr) 
{
    MSR MSP, r0 //set Main Stack value
    BX r14
}
 

//===========修改如下就可以了==============//

 

 

01 //THUMB指令不支援彙編內聯
02 //採用如下方法實現執行彙編指令WFI 
03 __asm void WFI_SET(void)
04 {
05     WFI;         
06 }
07 //關閉所有中斷
08 __asm void INTX_DISABLE(void)
09 {
10     CPSID I;         
11 }
12 //開啟所有中斷
13 __asm void INTX_ENABLE(void)
14 {
15     CPSIE I;         
16 }
17 //設定棧頂地址
18 //addr:棧頂地址
19 __asm void MSR_MSP(u32 addr)
20 {
21     MSR MSP, r0             //set Main Stack value
22     BX r14
23 }

3、提示查詢不到AT91SAM9G45的驅動檔案

我看了下在ARM的ATMEL的INC檔案下有這顆晶片的檔案,為什麼找不到呢?

我猜想可能是由於我先安裝的MDK,後安裝的C51,由於版本或者軟體本身的bug

導致的。重灌MDK,解決。

4、const

以前一直用PIC和瑞薩,以為靜態區域性變數+const還是存貯在RAM裡面,今天

分析了MDK的map檔案,發現是存貯在ROM裡面。

 

 

 

5、字串顯示bug

以前一直習慣於用十六進位制列印log,分析協議。最近在除錯AT指令,改為字元輸出log。

期間發現一個很奇怪的問題,下面這段程式碼如果單步執行沒有問題,可以列印輸出,全速執行就不行。

    {        
        uint16_t    j=0;
        //delay_ms(50);
        TRACE_DEBUG("\r\nJZQ_AT_CMD_MYNETWRITE   %d  \r\n",hwSize);
        for(j=0;j<hwSize;j++){
            printf("%02X",pchBuffer[j]);
        }
        printf("\r\n");
    }

加上優化級別為0,也不行。但是其他地方的Log都正常啊,這是為什麼呢?

經過前後的log輸出,和改為16進位制輸出,最後得到結論,根本原因是字串結束符問題。

前面的Log是直接列印的通訊協議,是16進位制,並咩有做格式化,同時由於log輸出太快,這就導致

字元顯示時候快取裡面有好幾個log包,但是串列埠助手就當做一個字串,但是這幾個log包當中又正好包含

\0,這個恰巧也是字串結束符,因此字元顯示時候當遇到\0就認為字串結束了,後面再有也不顯示了。

如果換位16進位制,後面是有列印的。

解決方法:

1)同時開啟串列埠監視助手和串列埠除錯助手,一個16進位制顯示,一個字元顯示;

2)每個log輸出後面都加延時;

3)過濾掉\0結束符;

結合實際除錯,我採用的1和3的方法,1是最笨的,但是檢視Log真的頭大;3需要有個log快取,然後輸出的

時候做過濾,但是實時性最高,不影響實際程式;不建議加延時,影響程式碼實時性。