通過研究2440啟動代碼,發(fā)現(xiàn)這個啟動代碼壓根就沒有從nandflash復制代碼的功能,怪不得下載到nandflash沒現(xiàn)象呢!用偽C代碼來描述2440的正常的啟動過程。
本文引用地址:
http://butianyuan.cn/article/201611/321602.htm
2440啟動函數(shù)()
{
復位函數(shù)();
未定義模式函數(shù)()//這個是死循環(huán)
SWI函數(shù)();//這個函數(shù)在其他文件中存在
PAbt_Addr函數(shù)();//又是個死循環(huán)函數(shù)
DAbt_Addr函數(shù)();//還是個死循環(huán)函數(shù)
......
}
復位函數(shù)()
{
if(關掉看門狗==1)
關掉看門狗;
Else
不關;
if(設置時鐘==1)
設置好時鐘;
Else
不設置時鐘;
If(初始化儲存控制器==1)
初始化內(nèi)存控制器;
Else
不初始化儲存控制器;
If(初始化I/O控制寄存器==1)
初始化I/O控制寄存器;
Else不初始化I/O控制寄存器
If(異常中斷向量復制到IRAM==1)
異常中斷向量到IRAM;//IRAM為0x40000000;
Else不復制;
配置相應模式堆棧的大小;//最后配置的是用戶模式堆棧的大小,在用戶模式下進入main函數(shù)
main();//調(diào)用main函數(shù),這就是為什么單片機裸奔的時候需要死循環(huán)了。
}
其實在2440中main函數(shù)中不用死循環(huán),在執(zhí)行main函數(shù)完畢之后,相當于復位函數(shù)()已經(jīng)執(zhí)行完畢,接下來執(zhí)行的是未定義函數(shù)(),由于剛才分析未定義函數(shù)是個死循環(huán),相當于最壞的情況是,2440一直在未定義函數(shù)中停留著。當然并不希望看到這樣的情況,所以2440裸奔時,最好在main函數(shù)中構成死循環(huán)!對于51單片機來說,沒有死循環(huán)的話,這個51單片機程序會跑飛?。?!
如果想從nandflash啟動,并啟動一個系統(tǒng)的話,需要在C函數(shù)之前加入初始化nandflash函數(shù)以及從nandflash代碼復制到sdram的函數(shù)。如果再加一點其他的東西的話,一個小的bootloader就完成啦!
評論