2440 led 管道 控制應用程式詳細解釋

2021-05-23 17:11:51 字數 3896 閱讀 5492

/*led_player伺服器*/

/*實現對管道/tmp/led-control的監控*/

/*並實現對led的控制*/

#include /*標準輸入輸出*/

#include /*標準庫*/

#include /* */

#include /*輸入輸出控制*/

#include /*一些型別*/

#include /*一些狀態*/

#include /* */

#include /*select函式*/

#include /*時間方面的*/

/*包含的標頭檔案越多,程式也就越複雜,實現的功能也就越強大*/

/*也就是說,標頭檔案的多少,是判斷乙個軟體規模的重要指標*/

/*我們希望盡量多包含一些標頭檔案,但是不希望包含不必要的標頭檔案*/

/*而且,一定要清楚所包含的標頭檔案是幹什麼的!!!*/

/*對static的理解:編譯時即做好記憶體的分配工作,只要整個程式開始執行,

則分配空間,一直到整個程式終止,才釋放空間.*/

/*dynamic則不同,比如,子程式內部定義的乙個區域性變數,是在用到子程式,

並且到達建立該區域性變數的語句時才建立,然後子程式執行完,就釋放空間*/

static int led_fd; /*靜態變數,led裝置號*/

static int type = 1; /*型別,據此實現對led運作方式的控制*/

/*push_leds()函式*/

/*根據led的控制引數,實現對led的控制*/

/*事實上,很多子函式完成的才是核心的任務*/

/*而主函式做的工作則是使用者介面,即人機互動方面的工作*/

/*也就是如何讓使用者來呼叫這些完成實際工作的子函式*/

/*gui,圖形使用者介面則是人機互動的理想方式*/

static void push_leds(void);

/*主函式入口*/

int main(void)

/*下面則是開啟正確的處理*/

/*包括控制引數的獲取和依據控制引數進行裝置的控制*/

/*由於本程式是leds裝置伺服器程式,所以需要不斷檢測控制資訊的變化*/

/*這就需要乙個無限迴圈,在這個迴圈裡完成檢測任務,一旦檢測到需要的東西*/

/*則跳出檢測迴圈,依據檢測到的資訊去作相應的控制工作*/

/*而我們對leds的控制工作也不是簡單的一蹴而就的事情*/

/*它事實上是乙個無限迴圈的動態過程,涉及到時間的處理*/

/*如何改變該迴圈的模式以及如何跳出該迴圈是我們關心的重點*/

/*改變迴圈的模式當然還是要根據檢測到的控制資訊*/

/*下面開始*/

/*解開管道的連線*/

unlink("/tmp/led-control"); /*unlink()函式*/

mkfifo("/tmp/led-control",0666); /*mkfifio()函式,fifo方式的確立*/

/*開啟管道*/

/*注意o_rdonly和o_nonblock的開啟方式*/

/*管道號賦給led_control_pipe*/

led_control_pipe = open("/tmp/led-control",o_rdonly | o_nonblock);

/*led_control_pipe的處理*/

if(led_control_pipe < 0) /*開啟錯誤*/

/*以o_wronly方式開啟管道,並將管道號賦給null_writer_fd*/

/*其與前面的led_control_pipe管道號,構成了一讀一寫*/

null_writer_fd = open("/tmp/led-control",o_wronly | o_nonblock);

/*對null_writer_fd的處理*/

if(null_writer_fd < 0) /*開啟錯誤*/

/*for迴圈,對leds裝置的動態控制*/

for(;;)

if(ret == 0) /*表明沒有檔案可讀*/

/*也就是說沒有新訊息過來*/

else /*即ret大於0時,此時表示管道可讀*/

/*即管道已經被寫入了新的控制訊息*/

/*那麼我們接下來就是要讀取訊息了*/

if(fd_isset(led_control_pipe,&rds))

/*此處作判斷有必要嗎?*/

/*led_control_pipe本來就在rds裡面*/

/*從管道中讀取字元,先放入c字元變數*/

/*之後放入buffer中*/

/*這才是控制資訊獲取的核心步驟*/

/*這實質上是管道裝置的驅動程式完成的*/

/*通過read()函式完成*/

if(read(led_control_pipe,&c,1) != 1) /*讀取異常*/

/*本來緊接著就該把c裡的字元放進buffer中*/

/*但是對c中的字元進行判斷*/

/*因為並不是所有的字元都要放進緩衝區中*/

/*如/r,好像是空格,如/n,是回車*/

/*對這些特殊的字元有特別的處理,要非常小心*/

/*而對一般的控制資訊的字元,則正常地放進buffer中就行了*/

/*對/r的處理,跳出本次迴圈,進入下次迴圈,continue語句*/

if(c == '/r') /*即是空格符就跳過去*/

/*對/n的處理*/

/*/n實質上是跳出整個訊息獲取迴圈的標誌*/

/*回車符一到來,就證明訊息結束了*/

/*之後我們要做的工作有兩個*/

/*乙個是將buffer中儲存的訊息傳達給有關變數*/

/*之後,就需要清空buffer*/

/*至於對管道的清空處理,這裡不是本伺服器作的*/

/*有個疑問,在管道讀取的過程中,是否可以繼續寫入呢?*/

if(c == '/n')

/*輸出提示資訊*/

fprintf(stderr,"type is %d,period is %lf/n",type,period);

/*為什麼要輸到stderr中呢*/

memset(buffer,0,sizeof(buffer)); /*清空buffer*/

/*跳出迴圈*/

break;

}/*正常的c的處理*/

buffer[len] = c; /*讀取字元到buffer*/}}

}/*關閉leds裝置*/

close(led_fd); /*close()函式*/

/*主函式返回*/

return 0;

}/*子函式*/

static void push_leds(void)

else /*3,4,5的處理*/

break; /*跳出*/

case 1: /*模式1*/

if(step > 255) /*此迴圈還是比較大的*/

led_bitmap = step; /*對led_bitmap賦值*/

break; /*跳出,顯然,模式1還是相對簡單的*/

default:

led_bitmap = 0; /*其它模式,都是0,就是全滅*/

}step ++; /*step的自增運算,跑馬燈就要靠它來動態實現了*/

/*step每隔period變化一次,顯示狀態就會發生變化*/

/*注意說的是顯示狀態,而不是說顯示模式*/

/*就是說,同乙個顯示模式下,狀態也會不斷變化*/

/*而不同模式,led的變化情況是不同的*/

/*下面依據led_bitmap對leds裝置進行處理*/

for(i = 0; i < 4; i++) /*依此對0,1,2,3燈管進行處理*/

mini2440 led驅動及 應用程式注釋

驅動程式部分 在核心 driver char 目錄中建立檔案s3c2440 leds.c 原始碼如下 include include include include include include include include include include include include inc...

mini2440 LED燈裸機硬體控制程式

查詢mini2440的原理圖,找到led部分的原理圖 然後查詢nled 1到nled 4分別連線的s3c2440的引腳 由圖可知 nled 1 gpb5 nled 2 gpb6 nled 3 gpb7 nled 4 gpb8 在s3c2440的引腳劃分中,這四個引腳都屬於port b,因此可以通過配...

ArcEngine控制台應用程式

wbaolong原文 arcengine控制台應用程式 控制台應用程式相比其他應用程式,更加簡單,簡化了許多冗餘,可以讓我們更加關注於本質的東西。現在讓我們看一看arcgis engine的控制台應用程式吧!一 首先是許可繫結 1 執行時環境的繫結 esri.arcgis.runtimemanage...