2/28/2012

2/05/2012

簡單好用的LIST之C語言實作

LIST用時方很少

撰寫程式時,多少都會用到一些串列、佇列等資料結構,有的程式語言會提供相關的實作,很容易就可以取用,相較之下,C language的使用者在這方面就比較麻煩。老練的C language程式設計師討生活的工具箱裡,都會有這方面的程式碼,以備不時之需。在open source的領域裡,也有不少高手提供這方面的函式庫。如果有需要搭配搜尋、排序的演算法,SimCList會是一個不錯的選擇,它的優點是使用方便,容易上手,速度也不錯,且授權方式採用極為友善的BSD license;倘若僅需要用到單純的list、stack、FIFO時,FreeBSD核心中的相關程式碼片段就可立即派上用場。其實Linux核心中也有功能相似的實作,較之前者可說各有勝場,只是Linux核心採用GPL授權,使用上需要多加斟酌。FreeBSD的List與Queue實作,位於sys/queue.h

2/01/2012

3分鐘Git入門

何謂Git
Git是一個版本控制系統。效能優異,管理眾多檔案時,速度都能保持一定水準。使用時,無須連結至特定伺服器。大多數情況下,只要熟悉幾個指令,就能輕鬆上手。

Git單機使用流程
這裡指的「單機」意思是「單人」,不考慮多人協同工作的情形。不過,由於Git採取分散式架構的緣故,熟悉單人使用環境後,應可輕鬆軟換到多人協同工作的模式。簡單來說,Git單機使用流程如下:
  • 將目錄納入Git控制
  • 將目錄下的檔案納入Git管理
  • 提交變更的檔案內容

1/21/2012

lwIP網路卡驅動程式撰寫

lwIP網路卡驅動程式主要以輪詢模式(polling mode)運作。使用者將網路卡介面(network interface)透過netif_add()添加至lwIP後,其生命週期便由lwIP接管,之後只要在主程式迴圈(main program loop)中,按時輪詢網路卡驅動程式,將接收到的封包派送至通訊協定堆疊即可。驅動程式撰寫者,只需要專注於提供與lwIP相容之驅動程式介面即可。

11/17/2011

如何正確停止「live555 RTSP串流伺服器」

前一篇文章裡,我介紹如何利用live555撰寫RTSP串流伺服器。文章的原始碼範例,並無針對一些例外訊號例如:「Ctrl+C(SIGINT)」進行捕捉處理。 在Linux中,這些例外訊號若沒有處理,其預設行為將是立刻終止程式,進而導致資源遺漏(resource leak)。
在Linux裡,我們可以透過signal()於程式中設立處理常式(signal handler),於對應之處理常式中,我們將可正確地停止RTSP伺服器。

11/06/2011

YAML簡介

什麼是YAML
YAML是YAML Ain't Markup Language的遞迴縮寫(一種來自Opensource界的奇怪幽默,如果你懂,你就...)。顧名思義,它設計的目的是作為表達、傳遞資料的一種資料描述方式(data serialization language)。與XML或類似的用途的語言相比,它著重於資料於人們的可(易)閱度讀性。
例如,以下兩個YAML的例子:
--- # 最喜愛的電影
- Casablanca
- North by Northwest
- Notorious
-
  name: Mark McGwire
  hr:   65
  avg:  0.278
-
  name: Sammy Sosa
  hr:   63
  avg:  0.288

11/04/2011

移植lwIP至U-Boot

U-Boot是嵌入式系統上被廣為運用的boot loader,它擁有極為活躍的開發社群,也支援許多不同類型的CPU核心架構。U-Boot目前並不支援完整的TCP/IP,僅有限度地支援TFTP,方便開發者上傳韌體或是網路開機(BOOTP)。U-Boot身為boot loader非嵌入式作業系統,依據開放原始碼社群秉持地「精簡就是美」原則,不支援TCP/IP是可以理解的。萬一真的需要網路功能,移植一套完整的TCP/IP協定堆疊的任務雖然富有挑戰性,實務上亦是可行之道。

lightweight IP(lwIP)是一個輕巧的開放原始碼之TCP/IP通訊協定之實作。lwIP首先由Adam Dunkels發表,目前則是以Kieran Mansley為計畫主持人,帶領開放原始碼社群進行該專案的維護與開發。
目前lwIP已實做的協定如下:
  • IP (Internet Protocol) including packet forwarding over multiple network interfaces
  • ICMP (Internet Control Message Protocol) for network maintenance and debugging
  • IGMP (Internet Group Management Protocol) for multicast traffic management
  • UDP (User Datagram Protocol) including experimental UDP-lite extensions
  • TCP (Transmission Control Protocol) with congestion control, RTT estimation and fast recovery/fast retransmit
  • Raw/native API for enhanced performance
  • DNS (Domain names resolver)
  • SNMP (Simple Network Management Protocol)
  • DHCP (Dynamic Host Configuration Protocol)
  • AUTOIP (for IPv4, conform with RFC 3927)
  • PPP (Point-to-Point Protocol)
  • ARP (Address Resolution Protocol) for Ethernet
  • Optional Berkeley-like socket API 
lwIP設計理念主要是希望於支援TCP/IP協定的同時,於執行時期也能精簡記憶體之運用,以達成支援小型的嵌入式裝置、平台或即時作業系統(RTOS)的目標;除此之外,lwIP也已經移植到眾多RTOS平台上,例如:eCos...等等。由此這些特性來看,使用lwIP搭配U-Boot是一個好的選擇。