發表文章

目前顯示的是有「Coding」標籤的文章

Linux serial port programming: read always success but no vaild data

在非標準的輸入程序模式下, 輸入的資料不會被組合成一行而輸入後的處理功能 (清除, 殺掉, 刪除, 等等.) 都不能使用. 這個模式有兩個功能控制參數: c_cc[VTIME] 設定字元輸入時間計時器, 及 c_cc[VMIN] 設定滿足讀取功能的最低字元接收個數. 如果 MIN > 0 且 TIME = 0, MIN 設定為滿足讀取功能的最低字元接收個數. 由於 TIME 是 零, 所以計時器將不被使用. >>>block and wait for data 如果 MIN = 0 且 TIME > 0, TIME 將被當做逾時設定值. 滿足讀取功能的情況為讀取到單一字元, 或者超過 TIME 所定義的時間 (t = TIME *0.1 s). 如果超過 TIME 所定義的時間, 則不會傳回任何字元. 如果 MIN > 0 且 TIME > 0, TIME 將被當做一個分割字元組的計時器. 滿足讀取功能的條件為 接收到 MIN 個數的字元, 或兩個字元的間隔時間超過 TIME 所定義的值. 計時器會在每讀到一個字元後重新計時, 且只會在第一個字元收到後才會啟動. 如果 MIN = 0 且 TIME = 0, 讀取功能就馬上被滿足. 目前所存在的字元組個數, 或者 將回傳的字元組個數. 根據 Antonino (參考 貢獻) 所說, 你可以用 fcntl(fd, F_SETFL, FNDELAY); 在讀取前得到相同的結果. >>>default setting and result the read always return success without vaild data Reference: http://www.linux.org.tw/CLDP/OLD/Serial-Programming-HOWTO-3.html

Regular Expression for C/C++

http://changyy.pixnet.net/blog/post/22760327 http://mij.oltrelinux.com/devel/unixprg/

indent 程式設計師的好幫手

這個套件名如其人,就是幫你自動重新整理程式碼的。 Ubuntu下安裝很簡單,就是sudo apt-get install indent 然後,indent xxx.c就會自動完成排版 如果對於預設格式不滿意,也有也有很多參數可以設定調整,包君滿意

GTK/Glade 入門資源

GTK速查手冊: http://library.gnome.org/devel/gtk/unstable/index.html 官方教學文件(英文): http://library.gnome.org/devel/gtk-tutorial/stable/ 官方教學文件熱血鄉民中文版: http://job.achi.idv.tw/2008/02/18/gtk-20-tutorial/ GTK學習筆記: http://caterpillar.onlyfun.net/Gossip/GTKGossip/GTKGossip.html Glade官方教學: http://live.gnome.org/Glade/Tutorials

GNU Autotools 初探 & share library 的蠢事

圖片
說GNU Autotools 可能很多人不清楚那是什麼?但是編譯提到編譯套件三部曲"./configure ; make ; make install",就很清楚了,這就是Autotools的功勞,它大大簡化了編譯程式的移植跟相容性問題,只要三個步驟就可以把軟體裝到你的Linux上,*nix系統特點就是家族衍生繁雜,因此也凸顯出Autotools之於GNU / Linux 的重要性。 前情提要說完了,再來一點心得感想,其實一直覺得編譯套件三部曲"./configure ; make ; make install"很神奇,想知道後面的動作,如何能精確的檢查編譯需要的函式庫跟相依性,再進一步就是如何把自己的軟體改成一樣的形式,讓它們可以在各系統暢行無阻,這次因為buildroot強烈要求外掛軟體要遵循Autotools的規範,就開始這次的研究。 廢話交代完畢,進入實做細節,首先是整個Autotools的流程圖:(取自 http://en.wikipedia.org/wiki/GNU_build_syste m) 圖中的橢圓形指的是處理的程式,長方形就是相關的資料檔。 Step by Step教學可以在這裡找到; http://markuskimius.wikidot.com/programming:tut:autotools/ 按著步驟一步一步大概就知道要怎麼進行了,基本上要準備的就是configure.ac跟Makefile.am,前者可以由autoscan產生,後者就要自己寫了,但是configure.ac不是拿到就可以用的,autoscan產生的檔名是configure.scan,要自己手動更名為configure.ac,再來要小小修改一下內容,才能繼續後面的步驟,必須要加入的兩行是: AM_INIT_AUTOMAKE(httpfs2, 1.0) AM_PROG_CC_C_O 另外,一個完整的GNU套件需要有一些相關的文件,就是我們拿到套件會包含在內的NEWS、README、AUTHORS、ChangeLog等,上述四個檔案需要自己準備,可以用touch創造空檔案騙過檢查即可,其他的可以透過"automake --add-missing"自動補齊 再來談到Makefi...

用C語言修改MBR的懶人包....

MBR資料結構篇: http://en.wikipedia.org/wiki/Master_boot_record BIOS INT 13解說篇: http://en.wikipedia.org/wiki/INT_13#INT_13h_AH.3D02h:_Read_Sectors_From_Drive INT 13更完整的解釋: http://www.answers.com/topic/int-13 不想看技術文章,重點在這裡,C sample code,不需修改,即可使用: http://www.p-dd.com/chapter9-page20.html

關於blog跟syntax highlight(續)

上次在 [轉貼]部落格手動張貼程式碼 提到一個網站可以幫你把程式碼轉成網頁編碼,這幾天繼續挖掘類似資訊,發現提供這類服務的網站還挺多的, 以下就是一個收集 online syntax highlight的網頁 ,裡面共有六個類似的網站, 至於哪一個好就自己嘗試比較一下嘍! 題外話,其中有個網站已經停止服務了,不過停止服務並不是什麼新鮮事,重點是 該BLOG的作者Gustavo Duarte 對於Linux跟程式語言有很深的研究,還有圖文並茂的解釋,想知道更多關於Linux如何開機、高階作業系統如何管理記憶體等都有很豐富的文獻,不可錯過喔!

[轉貼]部落格手動張貼程式碼

偶然間發現一個網站Online syntax highlighting, 之前我一直都是使用SyntaxHighlighter, 但是載入速度實在太慢, 換行等又有一堆問題, 還不如用貼HTML碼的方式. 這個網站有支援幾乎所有的code種類, 算是相當齊全, 也有樣式可以選擇. 更改背景色或是自動換行只要在開頭pre後面style中加上如同下列HTML就可以了..... 看來也該花時間整理一下部落格的版面了

eCos 開發相關資源

安裝 http://ecos.sourceware.org/getstart.html 取得cvs更新 http://ecos.sourceware.org/anoncvs.html eCos 文件 http://ecos.sourceware.org/docs-3.0/user-guide/ecos-user-guide.html RedBoot使用手冊 http://ecos.sourceware.org/docs-3.0/redboot-guide/redboot-guide.html 討論區 http://ecos.sourceware.org/ml/ecos-discuss/ 使用技巧; 這兩天嘗試的結果,發現直接從GUI的configtool創立專案,很容易有編譯錯誤, 像是多重定義這種東西 如果改用ecosconfig直接從命令列創造專案,反而容易許多

Mercurial 版本管理系統簡介 v.s. Google Code 線上備份Server

前言: 今天意外看到Google Code這個由Google 提供的免費線上備份程式碼服務 重新燃起應用SVM(原始碼版本管理)軟體管理專案的念頭 google一下之後(還是逃不出google的制約) 進入google code的首頁申請了我的第一個google code project 也展開一連串的嘗試過程 以下是精簡版 一 申請google code 進入 http://code.google.com/intl/zh-TW/ 首頁 選取左中的" 專案托管 " 在這邊理應開始創建專案,不過似乎沒有馬上創建的按鈕,輾轉從Contribute找到" Create Project "的連結 點進去填妥基本資料之後,專案也創建完畢 二 取得網址跟密碼 Goole Code提供的無非是備份的空間,這是廢話,所以其他眼花撩亂的額外功能可以不予理會 直接點取上方的Source Tab, 就會顯示本專案的下載網址 以我的測試網站為例,就是  http://code.google.com/hosting/createProject 這邊還有另外一件工作,就是取得上傳用的使用者名稱跟密碼 使用者名稱就是google的登入帳號,密碼請按下" googlecode.com password . "就可以看到 以上完成Server端的準備工作 三 使用Mercurial SVM軟體 三點一 下載客戶端軟體 請到 Mercurial的官網 下載 三點二 SVM 概念 這一節其實是最重要的,不過既然是紀錄文就讓它跟安裝平起平坐吧! 以下都以Mercurial介紹,SVN那套中央集權的SVM請自行嘗試 三點二點一 從新開始一個新專案 簡單的流程如下:  => mkdir建目錄:這不用多講了吧 => hg init 初使化 : 產生控制用的.hg目錄 => ***加入並編輯第一版的程式碼*** => hg status 觀察修改狀況: 這裡會看到一堆問號跟檔名,他們就是即將被送進資料庫的檔案 => hg add: 確認這次新增的檔案 => hg commit:真正執行上傳的動作,不過注意在此例中資料庫初始化是在本地做的,意思就是東...

Ubuntu 9.10 vs Ralink 3090 Wireless Driver

在Ubuntu 9.10版本中使用的kernel 是 2.6.31 這一Kernel版本對於網路的driver有一項重大更動 就是對於傳統的net_device結構中的open/stop/ioctl/xmit/等op的向後相容性取消了 以Ralink 3090 Wireless Network Driver為例,須手動修改rt_linux.c才能順利編譯 詳情請看 這個PATCH

Linux Keyboard Resource

基礎知識 http://tldp.org/HOWTO/Keyboard-and-Console-HOWTO.html 測試程式: xev (x-Window),  showkey ( Text Console) KBD source (相關工具程式原始碼) http://www.openmamba.org/distribution/distromatic.html?tag=devel&pkg=kbd.source Linux Keycode Keymap速查 http://www.comptechdoc.org/os/linux/howlinuxworks/linux_hlkeycodes.html

tracelog: /proc/net/dev

起因:同事問我怎麼抓到ifconfig -a中所有的interface 追蹤記錄: 執行檔 ifconfig => 套件 net-tool 關鍵字 "-a" => 函示 "for_all_interface" => 檔案 "/proc/net/dev" 檔案 "/proc/net/dev" => 函示 "dev_proc_init" (net/core/dev.c) 函示 "proc_net_fops_create" (include/linux/proc_fs.h) 目錄 "/proc/net" => 函示 proc_root_init (fs/proc/root.c) dev_seq_fops (net/core/dev.c) => open => dev_seq_open => dev_seq_ops 結論: net/core/dev.c中的 dev (struct net_device) 就是核心的 net device list

Linux 開機時期保留記憶體實做

在LDD一書中提過要獲取大量連續記憶體有幾種方法 1) 設定cmdline parameter mem=XXM 2) 在開機時候保留記憶體 之前適用第一種方法,但是要boot loader配合 這次實驗第二種方法,於是開始HACK KERNEL 函示原型跟標頭檔如下: #include linux/bootmem.h void *alloc_bootmem(unsigned long size); void *alloc_bootmem_low(unsigned long size); void *alloc_bootmem_pages(unsigned long size); void *alloc_bootmem_low_pages(unsigned long size); 實做步驟: 1) 修改init/main.c,找到start_kernel函示 2) 在setup_arch(..)之後,加入alloc_bootmem_XX的程式碼 3) 把得到的指標export出來,大功告成

quiz: ioctl 與 down的問題

在IOCTL中有一段這樣的code: if ( down(&(enc->ptr_frame_queue[0]->frame[0].ptr_sem)) ) return -EFAULT; 錯誤訊息如下: void value not ignored as it ought to be 問題在哪裡? 答案是down的return value是void,無法傳回值給if 改用down_interruptible即可。

實體記憶體映射技術:mmap ioremap

要在AP中直接設定裝置或者直接存取實體記憶體位址, 在作業系統的保護下,通常要透過ioctl或read/write方法。 但是對於大量資料進出,比如video或streaming這樣的方法就顯的效能很低, 所以Linux提供了另外一套機制叫做mmap。 透過mmap可以把檔案映射到使用者虛擬位址空間,透過這個指標就可以存取檔案。 那檔案怎麼支援mmap呢?答案是要實做mmap這個方法,把上層的mmap請求, 轉換成實際的動作。 那怎麼利用mmap做實體記憶體的應用呢? AP要利用/dev/mem這支檔案,它可以映射到實際的記憶體。 DRIVER端則要用ioremap把實體記憶體轉換成核心虛擬位址,之後就讀寫這個記憶體指標。 最後簡單圖解如下: AP->開啟/dev/mem->mmap到實體記憶體位址->AP快樂的存取 DRIVER->module_init時做ioremap->取得記憶體指標->DRIVER快樂的存取

C語言 便利的除錯巨集

參考自下列文章: http://blog.linuxdby.com/?uid-42063-action-viewspace-itemid-207 有時候會在程式碼中加入除錯的訊息, 通常會附上函示名稱、行號、時間等訊息。 一次一次寫總是麻煩了一點,這時候可以參考C編譯器提供的巨集 __FILE__,__LINE__,FUNCTION__等 就會自動的幫你填上相關資訊嘍~~ Microsoft版: http://msdn2.microsoft.com/en-us/library/b0084kay(VS.80).aspx Linux 版(GCC):請看第112頁 http://www.sm.luth.se/csee/courses/smd/137/doc/gcc.pdf

Socket Programming: Connect with timeout

http://developerweb.net/forum/showthread.php?p=13486 關鍵是下列幾行: // Set non-blocking if( (arg = fcntl(soc, F_GETFL, NULL)) < 0) { fprintf(stderr, "Error fcntl(..., F_GETFL) (%s)\n", strerror(errno)); exit(0); } arg = O_NONBLOCK; if( fcntl(soc, F_SETFL, arg) < 0) { fprintf(stderr, "Error fcntl(..., F_SETFL) (%s)\n", strerror(errno)); exit(0); }

Linux jiffies/HZ mini trace

處理器:arm 平台:IXP425 變數名稱:jiffies 用途:記錄開機到當前經過的時間 定義於:arch/arm/kernel/time.c u64 jiffies_64 = INITIAL_JIFFIES; 型態:64bit unsigned long int 初值:include/linux/jiffies.h #define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ)) 更新變數的函示: HW TIMER interrupt==> ixp4xx_timer_interrupt (arch/arm/mach-ixp4xx/common.c) timer_tick (arch/arm/kernel/time.c) do_timer (kernel/timer.c) 變數名稱:HZ 用途:jiffies與秒換算的比率 定義於: linux/include/asm-arm/param.h 值:100 # define HZ 100

Linux Kernel 的 Notify Chain 與應用

在很久很久以前有個遠的要命王國..... (下略...) 扯遠了,現在不是在演史瑞克... 早在Linux Kernel version 1.2.X時代(資料來源:LXR), 就有Notify Chain的設計了。 Notify Chain 就是核心裡面的Callback Function List 跟一般的Callback Function不同處就在於它是個LIST(廢話) 所以可以註冊一個以上的Callback。 對應的LIST處理函示有: notifier_chain_register notifier_chain_unregister notifier_call_chain 前面兩個是登錄跟註銷,最後是啟動整串Callback 典型的應用就是reset跟panic的處理, 可以加一大串對應的處理函示,相當方便。 另外如果核心程式有連動的需求,也可以自己創一個: static struct notifier_block *your_notifier_list;