saturn 寫:Anonymous 寫:嗯.....有趣的現象!
現在先來 try 一下是 hardware 有問題呢?? 還是 software (kernel)有bugs??
如果可以的話,先來單純使用 bootloader 來測試 SDRAM .
(確定可以用 bootloader 來 access (讀及寫)所有的 16M/32M SDRAM).
這樣做的目的是想要確認 SDRAM 是正常,且 Memory controller 是正確被
設定的.
如果是沒問題的話,那麼使用這個沒有問題的 bootloader 配合著
linux-2.4.19-rmk4 ,(kernel 部分也請不要修改任何東西,不用傳參數)
看看到底同一份的 kernel 會不會有不同的結果...
----------
--CK
那請問該如何寫測試程式!?用組合語言嗎!?還是用c寫!?
可否明示整個大概的流程!?
謝謝!
Brian
什麼語言寫都可以...
貼一下我曾寫過的範例,可能要稍微修改一下符合你的環境.
- 代碼: 選擇全部
static void
Memory_Read_Write(void)
{
unsigned int start,end,total;
unsigned int counter, *memory_pointer;
unsigned int value;
unsigned int err_count=0;
do {
Serial_Printf("%s\n\rPlease input memory address to start :",MEMORY_PROMPT);
start = Serial_Get_Int();
}while(Verify_Addr(start));
do {
Serial_Printf("\n\rPleas input end of memory address :");
end = Serial_Get_Int();
}while(Verify_Addr(end));
total=(end-start);
if ((total/1024/1024) > 3)
{
Serial_Printf("Sorry it must be in 3MB range for testing....\n\r");
return;
}
Serial_Printf("Write memory from 0x%x to 0x%x and total %dKB\n\r",start,end,(total/1024));
/* Memory write */
memory_pointer=(unsigned int *)start;
for (counter =0;counter < total ; counter+=4)
{
*memory_pointer ++= counter;
if ((counter % 0x10000 ) ==0)
{
Serial_Printf(".");
}
}
Serial_Printf("\n\rMemory writing OK,then try to testing memory read...\n\r");
/* Memory read */
memory_pointer = (unsigned int *)start;
for (counter =0;counter < total;counter +=4)
{
value = *memory_pointer;
if( value != counter)
{
Serial_Printf("%x = %x\n",(unsigned int)memory_pointer,value);
err_count++;
}
memory_pointer++;
if ((counter % 0x10000)==0)
Serial_Printf(".");
}
if(err_count ==0)
{
Serial_Printf("\n\rMemory read write test ....OK.\n\r");
}
else
{
Serial_Printf("\n\rMemory read write test ....FAIL.\n\r");
}
}
請記得把它寫在 bootloader 中來一起測試,最好可以多試一些memory 區域.
(MMU 請記得關掉,cache 也不要打開..)
如果 32M RAM 都沒問題的話,那就要來好好花時間看看 kernel 部分的 code.