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的程式時
一定要考慮到一個問題
你現在所寫的程式到底是軟體, 硬體, 還是韌體
多了這番考量
相信各位在撰寫時
也能慢慢體會這三種微妙的差異

2 則留言:

小翁 提到...

受益良多 :)

Unknown 提到...

這個觀念是非常重要的
一定要搞清楚你寫的程式到底是哪個部分
不然在寫程式的時候很容易有問題
加油囉