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快取,然後輸出的
時候做過濾,但是實時性最高,不影響實際程式;不建議加延時,影響程式碼實時性。