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