2010年7月2日 星期五

如何認識一塊嵌入式電路板

想踏入嵌入式系統的朋友們,最常問我的一句話就是:「紀老師,我想要把作業系統移植到這塊板子上。我拿到這塊板子,要讀懂哪些硬體規格,才有辦法順利移植呢?」

好問題!嵌入式系統的特色就是每塊板子都不一樣,充分地「客製化」!所以我也很難寫一篇「Step by Step 移植作業系統」、或是「快快樂樂移植嵌入式作業系統」的文章給您。不過的確有些共通之處。我就在這裡告訴您!



一塊空板子在拿到手以後,必須由文件中瞭解下列主題,才算對整個系統有點梗概,可以開始開發軟體:
  • 電源(Power):
    • 輸入電壓/電流種類與組數:是否為雙電源設計(e.g. 5V/2.5A + 12V/3A...之類)?外部電源輸入後,分流成幾股(e.g. 分流至 CPU、實時時鐘、I/O...數股)?
    • 是否有省電模式:包含 CPU、風扇、硬碟、螢幕、各式週邊有無省電設計,以及應該如何以程式初始化與進入/退出各種省電模式等。
  • 時 脈(Clock):
    • 外頻使用多少(e.g. 12MHz)?
    • 內頻需要多少(e.g. 250MHz)?
    • 如何設定「鎖相迴路(PLL, Phase Lock Loop)」使外頻得以除頻成內頻所需的時脈?
    • CPU 是否有輸入時脈到特定的其他週邊設備當作參考時脈?若有,輸出頻率為多少?
  • 重置電路(Reset):
    • 要讓系統重置(Reset),需要發出怎麼樣的訊號?
    • 重置後,需要提供哪些參數,讓 CPU 可以開始工作(e.g. 匯流排寬度多少?使用 Little Endian 或是 Big Endian?...等)?
    • 系統重置後,第一個讀取的 記憶體位置是哪一個?
  • 記憶體(嵌入式 硬體架構中,軟體工程師最需瞭解的一塊):
    • 系統所使用 的記憶體種類有幾種(e.g. ROM, Flash, SDRAM...)?
    • 架構出來的「記憶體映射空間(Memory Map)」為何?
    • 每種記憶體(ROM/Flash/SDRAM...)所佔的空間有多大?位址從哪裡到哪裡(e.g. 0x00000000 ~ 0x0FFFFFFF 這 4KB 空間,是由 1 顆 Mask ROM 組成,所以就要小心,不可以對此位址發出寫入需求...等)?
    • 每類記 憶體所佔空間,是由幾顆晶片所組成?
    • 每顆晶片是由多少 Banks 所構成?每個 Bank 有多大?匯流排總寬度有多少?
    • CPU 有無「記憶體管理單元(Memory Management Unit, MMU)」?如何初始化它們?哪些暫存器可以做這些事情?
    • 是否有些特殊的記憶體需要特殊的設定(如:DRAM 就需設定「刷新時間(Refresh Time)」)?如何設定?
    • CPU 內部有無特殊的記憶體需要設定(如:以 SRAM 組成的 Cache、Non-cache、或 Write Buffer...)?如何設定?
    • 整個 CPU 中,有幾組通用暫存器?幾組特殊暫存器?
  • 中斷系統(Interrupt):
    • 中斷的種類(e.g. ARM 架構內的快速中斷/一般中斷;或 i386 架構中的不可遮罩中斷/可遮罩中斷...)。
    • 中斷的來源(如:INT 0~7 為可客製化中斷,INT_ZDMA0, INT_ZDMA1, INT_BDMA0, INTBDMA1 為來自 DMA 的中斷...)。
    • 各中斷的優先順序,以及如何調整優先順序?
    • 撰寫「中斷服務常式(Interrupt Service Routine, ISR)」的方法(會自己寫,才能改變系統原先預設的行為)。
  • 看門狗計時器(Watchdog Timer):
    • 如何初始化?
    • 如何設定看門狗每隔多 久檢查一次系統存活狀態?
  • 輸出入埠 (I/O Port):
    • 輸出入埠的「位址空間 (Address Space)」有多大?如何存取?
    • 有多少「通用輸 出入埠(General Port for I/O, GPIO)」?這些埠又連往哪些週邊(e.g. LED 燈、按鈕、風扇...)?如何控制它們?
  • 其他週邊初始化:
    • UART(通 用非同步收發器,Universal Asynchronous Receiver & Tranceiver,一般指的是板子上的 RS-232 Port)。
    • LCD(液晶螢幕,好讓您將圖形化介面輸 出到此設備中)

不要小看上面這些項目!上面列的每一項,都有可能需要寫到 Boot Loader 裡(您可以把 Boot Loader 想像成 PC 上的 BIOS),以便在開機時給予初始化,讓後續載入的 Linux 核心可以馬上使用。一般而言,這些設定有可能使用組合語言寫。不過近來也有工程師習慣儘可能少用組合語言。做過簡單的 CPU 與 Memory 初始化後,就開始導入第一支 C 語言程式,接下來的初始化,都由 C 語言做。

聽完了是不是還「霧沙沙」呢?呵呵!很正常的!真的要瞭解,必須捲起袖子,移植過一塊開發板,您就了然於胸了。不然,來上我的課也可以啊!(廣告之嫌!折凳伺候!)


喜歡這篇文章嗎?喜歡的話請幫忙按一個「讚」喔!
歡迎加入「紀老師電腦教學網」的 Facebook 粉絲團,取得更多資訊喔!


關於作者
紀俊男,現任和群資訊總經理。曾任職於筌寶電子、趨勢科技、西基電腦、展望電腦等公司。教書經驗約 20 年。專長是程式設計、系統管理、嵌入式系統等領域。您可以在本篇留言與之聯繫、討論、或邀課。

2 則留言:

  1. 大大您好,
    我是在家接案的SOHO,近來被尋問是否有辦法製作RISC的板子,
    說實在我不行,可有合作廠商可推薦?
    必須可跑1024X768的圖像及聲音,影像由VGA輸出,
    通訊上用RS232及TCP/IP,
    由於客戶的AP是用LINUX寫的,所以BSP也必須是LINUX,
    Thanks

    Marx

    回覆刪除
    回覆
    1. 抱歉,我接觸的都是學生或是教學單位,這方面的合作廠商我可能接觸的比較少,所以可能無法提供有效的協助。沒能幫上忙請見諒。

      刪除