keil和arm裸機開發遇到的一些問題
阿新 • • 發佈:2018-11-26
為什麼會對沒有指定的空間進行讀寫?
原因是啟動檔案中棧設定的太小了,尤其是開大陣列的時候要注意。這個錯誤具體表現一種情況為,程式試圖對指定ram範圍之外的地址進行讀寫,SP暫存器的值也在RAM範圍之外,那麼顯然是棧分配太小了。
啟動程式碼裡可以看到6種堆疊,一般修改USR_Stack_Size
的值就可以了。
同時也要注意堆設定的大小,程式設計時要對動態記憶體是否分配成功進行判斷。
還遇到一種情況是棧分配的過小時,有足夠大的堆也是可以正常執行。
另外也要注意stack和heap的大小分配,不能大於ram的大小。
出現Error: L6218E: Undefined symbol Image$$ER_ROM1$$RO$$Length (referred from s3c2440.o)
是因為啟動檔案裡寫了一下內容:
IF :LNOT::DEF:__EVAL
IMPORT ||Image$$ER_ROM1$$RO$$Length||
IMPORT ||Image$$RW_RAM1$$RW$$Length||
ENDIF
所以在option->asm->define 里加上 __EVAL
就可以了
keil5 中開發裸機程式using simulator除錯卡死在SWI_Handler或Undef_Handler
- 網上查的原因貌似是觸發了某個軟體中斷,但是並沒有對這個中斷並沒有配置好。
- 工程很簡單,包括S3C2440A.s和main.c, main.c內容也很簡單,如下
#include<stdio.h>
int main()
{
unsigned char src[100];
int i=0;
printf("1234");
for(int i=0;i<10;i++)
{
src[i] = i;
}
while(1);
return 0;
}
-
那麼哪一句可能觸發中斷? 只有
printf("1234");
這句有可能。註釋掉之後,發現除錯時程式終於可以正常運行了,不會再卡在swi_handler中斷。遇到這個問題,可以耽誤除錯,檢視哪一行程式碼觸發了軟體中斷。 -
那麼為什麼這一句會觸發中斷? 老師說記憶體中有無效程式碼會觸發這個中斷。
之後又遇到這個問題,這次是使用了malloc函式但是沒有設定heap_size,就導致卡在swi_handler。
其實keil中除錯時看一下反彙編的程式碼可以解決任何程式執行相關的問題。