1. 程式人生 > >keil和arm裸機開發遇到的一些問題

keil和arm裸機開發遇到的一些問題

為什麼會對沒有指定的空間進行讀寫?

原因是啟動檔案中棧設定的太小了,尤其是開大陣列的時候要注意。這個錯誤具體表現一種情況為,程式試圖對指定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中除錯時看一下反彙編的程式碼可以解決任何程式執行相關的問題。