2007年12月13日 星期四

軟體, 硬體, 還是韌體?(下)

首先我們來思考一個問題
如果我們使用的SOC是NIOS II
裡面包含了LCD模組
以及一些簡單的IO
那在使用LCD模組時
我們會如何使用呢

以下是NIOS II裡的一個範例:
void showLCD(unsigned int duty_cycle)
{//Initial LCD
FILE *lcd;
lcd = fopen("/dev/lcd_16207_0", "w");
if (lcd != NULL )
{
fprintf(lcd, "The duty cycle\nis: %d"
, duty_cycle);
}
fclose( lcd );
}

這是在NIOS II 中使用LCD的一個副程式
很顯然的, 它是採用fopen的方式來使用
我們知道利用C語言中所謂的"格式化IO"
基本上都會使用到指標
指標可說是C語言的精神象徵
曾有過一句話"沒學懂指標, 別說你會C語言"
而指標的用意往往是指向記憶體位址

現在問題來了
假如一個SOC的記憶體不大
或者是記憶體尚未規劃
指標可以運作嗎

很遺憾, 這個答案是否定的
因為C語言的指標
是使用在一個已將記憶體規劃完成的系統才能使用
也就是說
當你不清楚你寫的程式是軟體還是韌體時
若貿然的使用指標的方式
很容易就會造成"無法挽救的後果"
也就是Visual C中常出現的"Fatal Error"(強者可能不常出現啦...)
因為它沒辦法去找到相對應的記憶體位址
因此不管怎麼指, 永遠也指不到正確的地方
這一點要特別小心

就算今天系統內並沒有加記憶體
使用以上方式仍能將LCD正確使用
為什麼在NIOS II 中的LCD模組可以用此方法呢
原因在於LCD模組本身就有記憶體了
也就是說當我們利用上述程式碼執行
SOC在判斷上是去LCD模組內的記憶體抓資料
而非其他的記憶體
如此一來也不會造成LCD出現奇怪的文字

這個系列的文章到此接近尾聲
不知各位對程式語言的應用是否有更深一層的了解
因此當各位在撰寫SOC的程式時
一定要考慮到一個問題
你現在所寫的程式到底是軟體, 硬體, 還是韌體
多了這番考量
相信各位在撰寫時
也能慢慢體會這三種微妙的差異

2007年12月8日 星期六

軟體, 硬體, 還是韌體?(中)

要清楚區分SOC的軟體, 硬體
得先從SOC的架構來看
基本而言, SOC的架構可以想像成一個PC
SOC該有的, 基本上PC應該也不會少
PC中, 其架構分為軟體, 硬體, 韌體
SOC也沒有少
因此, 我們可以把架構以圖形的方式來表示:


由上圖中我們可以發現
所謂的韌體部分, 並不是獨立形成一個區塊
而是包含在硬體裡面
這點必須要解釋一下

在SOC裡面, 所謂的韌體是相等於"硬體的初始化程式"
我們知道在硬體之前, 必須要先對它做初始化的動作
就好比一般PC在開機時, BIOS會先自我檢測所有的硬體
在檢測的同時, 也將這些硬體"喚醒(Wake UP)"
也就是等同於告訴它們該準備工作了

一般的韌體是以"組合語言(Assembler)"來撰寫
當然現在很多也是藉由C語言撰寫後, 經由編譯器及組譯器轉成機械語言
再將機械語言存放至ROM裡面
開機的時候, BIOS會先到ROM去讀取初始化資料
如此一來才能將其他硬體喚醒

有了這基本的了解, 再來就是解釋所撰寫的程式是哪一層

以現在的C語言來說, 已經包含了軟體, 硬體及韌體
並不是C語言的能力比較強
而是許多的程式編輯軟體中
已經包括了各種硬體的編譯器及組譯器

換句話說, 不論寫的是硬體軟體, 甚至韌體
都有辦法轉換成該系統的機械語言執行
再加上C語言是大多數設計人員所能接受的語言
因此支援性也越來越廣

在本篇最後, 敝人整理一下這三大部份常用撰寫軟體及撰寫語言:
硬體 : VHDL, Verilog, SystemC, C
韌體 : C, 組合語言(依系統而異)
軟體 : C, JAVA

介紹到此, 是該為本篇下個結論了
當各位在撰寫程式的時候
需要多考量到所寫的程式是軟體還是硬體
因為在程式撰寫的時候, 這是相當重要的關鍵

怎麼說呢? 下一篇會有更深入的探討

軟體, 硬體, 還是韌體?(上)

對於一個工程師而言
寫程式是必經之路
從學校裡學寫C語言開始
就註定這輩子與程式脫離不了關係

學到目前, 本人只會兩種程式語言
一種是C, 另一種則是VHDL
前者相信大家十分熟悉
而後者對它的了解, 我想只有相關人士比較了解

VHDL是一種硬體描述語言
基本上跟所謂的"寫程式"是相同的
只是目的不一樣
C寫好的程式是在windows中執行
VHDL寫好的程式則是以實現一個硬體去執行
同樣是寫程式, 為何兩者差異性這麼大?

隨著SOC的快速竄紅
"跨平台"的特性也日驅顯見
大家都希望只學會一種程式語言就能在任何平台上執行
到目前為止, 這已不是夢想
JAVA成功的跨平台特性已為SOC打開了一扇門
接踵而至地便是大家熟悉的C語言

C語言有多好用?相信對程式設計的初學者並不了解
對它的印象應該也僅限於交作業前一天熬夜趕工的痛苦日子
但對一個SOC來說, C語言可說是它的精神所在
不管是NIOS II, ARM 或是TI的OMAP
都支援C語言的編輯
現在想想, 真有點後悔當初沒將C語言學好
不然的話我應該已在大公司上班了.......

廢話扯到這裡
不知各位看出些端倪了沒
本篇的主題是"軟體, 硬體, 還是韌體?"(先別管上中下...)
相信這三個名詞在計算機概論中都有提過
而在定義上也應該相當的明確
又為何會在這裡再次提出呢?

記得有一天在寫NIOS II 的程式時
老闆突然問我一個問題
"你現在寫的C是硬體還是軟體?"
當下我毫不考慮的回答是軟體
可是我老闆用十分懷疑的眼光看著我
"你確定是軟體嗎?"
我心想, C不就是用來寫軟體的嗎?但我沒答腔

事隔多日, 我才發現為何老闆會問這樣的問題
正如同先前所提的, 跨平台的時代已來臨
C已不僅僅是軟體, 甚至可以設計成硬體
換個方式來說, 我當時的情況, 撰寫的是NIOS II 的程式
那麼C在這裡應該是屬於硬體囉?

看到這裡, 各位是否對SOC中的程式語言感到疑惑呢?
軟體, 硬體, 還是韌體?
讓我們繼續看下去