學習arm開發(10)
/* 用迴圈呼叫所有初始化函式 */
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr)
}上次說到在函式指標陣列裡,不斷地呼叫所有初始化函式進行初始化,下面就來仔細地分析一下,它們到底是做什麼的,做什麼樣的初始化,怎麼樣為後面做好執行的準備工作。看到第乙個初始化函式,就是cpu初始化(cpu_init),這個函式是在cpu/s3c44b0/cpu.c裡,它的作用就是進行s3c44b0初始化工作。看到這個函式內容如下:
/* cpu初始化。
蔡軍生 2005/07/23
*/int cpu_init (void)
它在裡面呼叫了函式icache_enable(),它就是用來初始化s3c44b0的緩衝區,並且啟用cpu緩衝區。因為cpu在加電之後,它的初始化值是不啟用內部的8k緩衝區的,必須由程式進行設定。接著看看那個呼叫的函式又是怎麼樣初始化內部快取區的呢?
/* cpu記憶體的緩衝初始化。
蔡軍生 2005/07/23
*/void icache_enable (void)
在這個函式裡,第乙個先呼叫函式是進行緩衝區清0的工作,它有一些特別的地方,如下:
/* cpu的內部緩衝初始化。
蔡軍生 2005/07/23
*/static void s3c44b0_flush_cache(void)
}它用乙個for迴圈進行內部的緩衝區初始化,由於s3c44b0決定每次讀寫都是按16位元組進行的。因此,這裡的i就是不斷地加16個位元組。不過,這裡為什麼不清除0x10000000到0x10001fff區域呢?這個我也沒有搞清楚,等我有空試試清除有沒有問題!
到現在為止,緩衝區已經清空,就要設定那些記憶體區域是不要進行快取的。因為不是所有記憶體都需要進行緩衝的,比如讀取外面的io,就不需要進行緩衝;讀取flash也不需要。因此,設定第乙個非緩衝區的起始位址為ncachbe0 = 0xc0000000,這個值裡的低16位是起始位址0x0000,它的32位位址就是從0x00000000開始。它的高16位是結束位址0xc000,它的32位位址就是從0xc0000000結束。最後就是通過設定syscfg暫存器的[2:1]位的值為11,就啟用了8k記憶體資料和指令緩衝區。到這裡為止,就已經設定好cpu的緩衝區初始化和啟用。
讓我們的產品超越日本產品!
學習ARM開發 10
學習arm開發 10 用迴圈呼叫所有初始化函式 for init fnc ptr init sequence init fnc ptr init fnc ptr 上次說到在函式指標陣列裡,不斷地呼叫所有初始化函式進行初始化,下面就來仔細地分析一下,它們到底是做什麼的,做什麼樣的初始化,怎麼樣為後面做...
學習ARM開發20 21
學習arm開發 20 os的任務切換 有了前面的tick中斷,那麼基本的任務切換條件已經是 萬事俱備,只欠東風 了。不過,這個 東風 也是很難搞得懂的,只有不斷地通過實踐才會找到合適的方法。現在我就需要去找這個東風了,就是解決不同的任務切換的問題。從簡單到複雜,這是任何事物的認識過程,也是行之有效的...
學習ARM開發 5
學習arm開發 5 蔡軍生 2005 07 16 寫於深圳 上一次說到要學習uboot的 但在看之前,首先要知道目標機器的程式設計資源,這裡的資源,是指s3c44b0所提供的執行程式的資源,對任何嵌入式軟體開發,都首先要對硬體有乙個很好的了解,這跟pc機的程式設計是大不一樣的。因為pc機都已經發展了...