ARM學習之Nand FLash控制器

BLSxiaopanlaile發表於2017-08-13

今天學習了Nand Flash的一些內容。在此做下回憶和總結:

1.什麼是Nand Flash?
答:Nand FLash是一種非易失性的儲存性介質,一般用於儲存嵌入式系統執行所必需的作業系統、應用程式、使用者資料等,地位和PC上的硬碟類似。一般來說,它的介面引腳不像SDRAM那樣多(SDRAM有20多根),一般也就是十幾根。以三星公司的K9F1208U0M為例,如下所示。
這裡寫圖片描述

正因為它的資料引腳較少,所以它的命令、地址、資料都是公用這一組IO引腳再配上ALE、CLE等其他使能訊號進行傳輸的。操作Nand Flash(讀、寫、擦除)也和簡單,基本上是按照傳輸命令、傳輸地址、最後讀寫資料這樣一個流程實現的。這些命令在具體的晶片手冊上都會有。
就像上面說的,命令、地址、資料都是通過那一組IO引腳傳輸的,不過對於S3C2440晶片來說,它為我們準備好了一組暫存器(NFCON、NFCONT等),我們只要操作具體的暫存器就可以實現上述流程。

2.static在嵌入式程式設計中的作用?
答:今天在看程式碼的時候,看到了用static修飾的靜態函式。有點疑惑,所以查閱瞭解了一下。
有一篇CSDN部落格上講的挺詳細的,先摘錄如下(http://blog.csdn.net/janeqi1987/article/details/46998603):
static從本質來講就兩個作用:
(1)、限定儲存域
(2)、限定作用域

第一、限定儲存域:被static修飾的變數無論是區域性變數還是全域性變數都將被編譯器存放在靜態區。而實際上在gcc編譯完生成的ELF格式檔案中並沒有靜態區這個概念,所謂靜態區是我們在概括討論程式資料段的一種泛稱。實際上編譯器會根據具體情況把被static修飾的變數分為兩類:當變數被定義並初始化為非零值的時候,變數將放在.data段;當否則為初始化或初始化為零的時候將放在.bss段。我們在不深入討論的時候暫且可以將此兩段概括為靜態區。而放在靜態區的變數由於儲存域的原因導致生命週期很長,長度為程式(確切講應該是該程式執行後的程式)的一次執行過程,而普通區域性變數由於在執行過程中被系統分配在棧區所以生命週期只是一次函式的呼叫過程。

第二、限定作用域:由於靜態還是普通區域性變數本身的作用域就是函式內部,因此static的作用域主要是對全域性變數和函式的限定。被staitc修飾的全域性變數或函式都被編譯器標記為僅在本檔案中使用,由於編譯器在編譯過程中是以.c結尾的原始檔為單位依次生成以.o結尾的目標檔案,所以最後聯結器在連線過程中將不允許被static修飾的變數或函式的地址對外連結。這樣既可以防止全域性變數或函式的重名問題,又可以防止由於無關的全域性變數誤操作引起的程式邏輯問題。因此static就限定了變數或函式的作用域。
  1. volatile在嵌入式程式設計中的作用?
    答:volatile是不穩定的意思,它是一個變數修飾符,用來指示編譯器不要對此修飾符修飾的變數進行優化,否則可能會出現錯誤。簡單來說,當有些變數從記憶體中讀入到暫存器中的時候,可能會保留一個備份,下次操作此變數的時候就不用在此從記憶體中讀取,直接使用這個備份暫存器中的值就可以了(這是由編譯器優化實現的)。但是在涉及到多執行緒或者有關硬體程式設計的時候,對有些變數不需要這些優化(可能是為了保持資料的穩定性、一致性),就用到了這個修飾符。

4.一個小的發現:以前在程式設計的時候,定義了一個結構體之後,都是用這個宣告的結構體定義一個變數,由系統給我們分配這個變數的空間(動態或靜態)。今天在看程式碼的時候,發現在底層的程式設計中,有的時候可以直接給變數賦一個指定的值(長知識了)。如下圖所示,

這裡寫圖片描述

相關文章