more: Jollen 的 Embedded Linux 教育訓練

Jollen's Blog「GNU Toolchains & Linux Systems Programming」裡的所有文章!

  

Linux 的應用(刊載於 PC2000 雜誌四月號) -- Video Streaming 探討 (1)

jollen 發表於 February 13, 2001 3:41 AM

Video Streaming 的技術已經出現多年,在 Internet 上的應用也已經相當廣泛,而利用 Linux 建構 Video Streaming Server 也是相當熱門的話題。如果您想瞭解什麼是 Video Streaming,本文對 Video Streaming 的觀念與技術將做了清楚而基本的介紹。 Video Streaming 來的正是時候 看到 "Video" Streaming 就知道這個技術與影音有關。Video Streaming 是一種經由網路來撥放影音檔案的技術,Video "Streaming" 的基本概念為「一邊下載一邊撥放」,我們稱之為「Play as received」。 經由 Internet 如果要收看遠端伺服器的電視檔案,最原始的做為是「下載後再撥放」,也就是經由 FTP 或 HTTP 將整個檔案下載至本地端後再利用撥放程式來撥放,我們稱之為「Play after download」。 以最常見的例子來講,我們可以經由網路將 MP3...

Linux 的應用(刊載於 PC2000 雜誌六月號)-- Video Streaming 探討 (2)

jollen 發表於 May 14, 2001 2:36 PM

繼上一篇介紹過 Video Streaming 的影像標準與網路通訊協定後,本期將要實際介紹目前常見的 Video Streaming 產品,並且由基本構成開始講解。本期首先介紹 video4linux 的設計方式。 繼上一篇介紹過 Video Streaming 的影像標準與網路通訊協定後,本期將要實際介紹目前常見的 Video Streaming 產品,並且由基本構成開始講解。本期首先介紹 video4linux 的設計方式。 Video Streaming 產品介紹 目前在網路上流行的 Video Streaming 產品相當多,這些利用 Video Streaming 技術設計的軟體在網路多媒體的應用已經有相當長的一段時間了。 底下先來介紹幾套常用的 Video Streaming 軟體。 Read Video Real Video 是 Real Networks 公司的產品,Real...

Linux 的應用(刊載於 PC2000 雜誌八月號)-- Video Streaming 探討 (3)

jollen 發表於 July 17, 2001 6:49 AM

本期的重點在介紹影像擷取卡與影像擷取卡常見的 BT848/BT878 晶片。除了介紹影像擷取卡外, 也會來看 xawtv 這個有名的 video4linux/BTTV 應用程式。 作者: 陳俊宏 (www.jollen.org)什麼是影像擷取卡 影像擷取卡的主要功能當然就是做影像的擷取了, 一張影像擷取卡應該擁有底下的基本功能。 影像擷取 影像擷取卡可擷取的影像頁框 (frame) 的大小是很重要的, 本文第一篇裡提到的幾個基本影像頁框大小都應該要支援, 包含 NTSC (640x480) 與 PAL (768x576)。 影像擷取卡所捕捉的畫面都是屬於動態的畫面, 影像的來源則要看所支援的視訊系統與所有的視訊裝置。 支援的視訊系統 大部份影像擷取卡都會具備一組視訊輸入端子, 即 S-Video (Y/C) 端子或 Composite 端子。 在台灣的標準當然是 NTSC 系統, 一般而言, 我們是希望一張影像擷取卡可以支援越多視訊系統越好, 包括:...

Linux 的應用(刊載於 PC2000 雜誌九月號)-- Video Streaming 探討 (4)

jollen 發表於 August 13, 2001 3:32 AM

本期的重點在介紹擷取 frame 的方法, 並且將重心由 video4linux 轉移到網路方面。在網路影像即時傳送方面, 我們採用的 RTP 也是各大廠商使用的標準, 在這一期裡, 我們將可以學習到利用 JRTPLIB 來加入網路功能的方法。 作者: 陳俊宏 www.jollen.orgvideo4linux 擷取 frame 的方法 在上一期的 xawtv 裡, 我們看到了 xawtv 的影像擷取功能, 其中對我們最重要的部份是利用 video4linux 做影像擷取的部份。 只要可以寫出 video4linux 的軀動部份, 要做影像擷取其實是很容易的, 我們利用的是 mmap 的方式來擷取影像。 mmap 擷取方式 為了說明如何以 mmap 方式來擷取影像,...

Linux 的應用(刊載於 PC2000 雜誌十一月號)-- Video Streaming 探討 (5)

jollen 發表於 September 14, 2001 8:31 AM

本期將以完整的程式範例為主, 說明之前未深入說明的地方。並且更詳細地介紹video4linux 如何以 mmap (filp-flop) 方式擷取影像資料, 同時也會展示如何將擷取出來的影像存成圖檔, 並且利用繪圖軟體開啟。 作者: 陳俊宏 www.jollen.orgmmap 的初始化從那裡開始 繼前四期介紹有關 Video Streaming 的內容後, 最近收到幾位讀者的來信, 詢問有關 video4linux 利用 mmap 擷取影像的方法。video4linux 以 mmap 擷取影像的方法在本文第 4 篇曾經簡單介紹過, 但是有讀者希望可以做更詳細的介紹, 因此筆者特別將相關的程式碼完整列出供參考。 要提到 mmap 的初始化, 我們要配合第 2 篇文章的程式範例。底下是對影像擷取裝置做初始化的程式碼, 與第 2 篇文章的範例比較, 底下的函數設計的更完整: int...

Linux 的應用(刊載於 PC2000 雜誌十二月號)-- Video Streaming 探討 (6)

jollen 發表於 October 18, 2001 12:06 PM

本期將是我們一系列 Video Streaming 專欄的結束,本期最重要的工作當然免不了是對之前的內容做系統性的整理,然後再對 Video Streaming 的應用就目前最被討論的理論做簡單介紹。 作者: 陳俊宏 www.jollen.orgVideo Streaming 系統概觀 一個完整的 Video Streaming 系統應該包含四個部份: Content (例如影像、聲音、coded 資料) Server Client Data network (例如 Internet,或任何連結 server-client 的媒介) 那麼我們在這一系列 Video Streaming 主題介紹的有那些呢?從一開始的名詞介紹、影像擷取、RTP 通訊協定,我們將重心放在 contente 與 data network 上。當然我們系列主題名為「Linux 的應用」,最關鍵的地方則是在如何在 Linux 環境下設計影像擷取程式。...

Nano-X 程式設計, #2:「Hello World」

jollen 發表於 April 26, 2004 8:10 PM

說在前頭 Jollen: 對於「學習」這擋事,其實我有很多自己的想法。以「學程式庫」來講,我的看法是... 學習任何一套程式庫或 application framework,絕對不是「函數導向」的學習法,也就不能以學習函數做為主軸;正確的方式應該是「主題式(subjective)」的做法,也就是由「Hello World」開始(我想這個已經成為萬年標準了!),然後由不同主題的範例來深入,由於每個主題的範例都有其目的,因此可以透過範例,將達成目的的做法學起來。 其次,每個範例一定都包含「隱含」的觀念,除了學會做法外,也要把裡頭的觀念挖出來研究,以加強能力。Jollen 在撰寫這些程式庫、程式語言與 application framework 的教學專欄時,都是用這套思考邏輯來規劃整個大綱,並且也是我自己的寫作習慣。 在這樣的學習方式與前提下,「老師不會教、學生必須自己來」的工作是: 1. 安裝(當然囉!) 2. 準備 API 手冊 3. 瀏覽 API 手冊 4. 查 API 的能力與技巧 5. 一邊看 code 一邊查 API 手冊 6. 編譯範例 7. 改範例亂玩 歡迎提供您的意見,或是不同看法讓我參考。 Nano-X 的...

Nano-X 程式設計, #1:介紹與安裝

jollen 發表於 August 11, 2004 10:56 AM

本篇首先要簡單說明一下 Microwindows 的基本概念與架構,然後再說明讓 Microwindows 支援 X11 的編譯方式,最後則是一個 Hello World 的程式。一開始我們會先在 X 上發展 Microwindows 的程式,在之後的專欄裡我們會適時將發展環境移到 Embedded Linux 系統。 作者: 陳俊宏 www.jollen.orgMicrowindows 的網路資源 官方網站: http://www.microwindow.org SDK 手冊: http://embedded.centurysoftware.com/docs/nx/ 入門文件 (Getting Started): http://home.twcny.rr.com/embedded/microwin/install/index.html 下載 (原始碼): ftp://microwindows.org/pub/microwindows/microwindows-0.89.tar.gz 下載 (字型, 含中文字型): ftp://microwindows.org/pub/microwindows/microwindows-fonts-0.89.tar.gz Microwindows 簡介 分層式架構...

建立 Cross GNU Toolchains for ARM

jollen 發表於 August 11, 2004 4:09 PM

作者/陳俊宏 Copyright (c) 2004 www.jollen.org Last date: 2004/08/11 1. 下載以下套件: gcc-3.4.1.tar.bz2 newlib-1.12.0.tar.gz binutils-2.15.tar.bz2 2. 解開套件: # bzip2 -dc gcc-3.4.1.tar.bz2 | tar xf - # tar zxvf newlib-1.12.0.tar.gz # bzip3 -dc binutils-2.15.tar.bz2 | tar xf - 3. 建立編譯用目錄: # mkdir build-gcc...

Build uClibc for ARM

jollen 發表於 August 11, 2004 4:10 PM

作者/陳俊宏 Copyright (c) 2004 www.jollen.org Last date: 2004/08/11 本文示範如何建立支援ARM9的uClibc。筆者所使用的target device為KS8695的板子,microprocessor是KENDIN的ARM9TDMI。 1. 下載uClibc-0.9.20. 因為某些原因,我們 使用0.9.20的 版本,請 不要下載其它的板本,以 免無法順利編譯。下載後的 uClibc-0.9.20 必須做小部份修改,因此 請讀者直接下載筆者修改好的uClibc。 http://www.jollen.org/EmbeddedLinux/ARM/uClibc-0.9.20-xwire.tar.gz 2. 解開uClibc後並進入設定選單: # tar zxvf uClibc-0.9.20-xwire.tar.gz # cd uClibc-0.9.20-xwire # make menuconfig 接著直接離開並儲存設定即可,筆者 修改過的版本預設值支援KS8695板子。 3. 修改 Linux kernel 路徑設定。將...

一篇有關 Reentrant Code Program (可重覆進入程式碼) 的文章

jollen 發表於 September 20, 2006 10:12 PM

"Reentrant Code" 是 embedded system 相關教科書很重要的一個主題,學習 Linux 驅動程式的學員也一定了解到這個主題的重要性。 由於 Linux 驅動程式裡的每一個 "operation" (eg. fops->read) 是 "共用" 的,例如 major number 相同的 device file (minor number 不同) 是共用同一塊 code,所以必須考量程式碼的「可重覆進入」寫法 (thinking about filp->private data)。 這也是為什麼在 Jollen 的 Linux 驅動程式課程裡,我們如此這般在強調 Reentrant Code (Reentrant Function)...

利用 Monotone 與朋友客戶協同發展與測試

jollen 發表於 September 21, 2006 10:57 PM

Monotone 是一個版本控管系統,但是他跟 SVN/CVS 並無衝突,我們由 monotone 首頁節錄官方的摘要說明如下: monotone is a free distributed version control system. it provides a simple, single-file transactional version store, with fully disconnected operation and an efficient peer-to-peer synchronization protocol. SVN 是廣為使用的版本控管系統,並將取代 CVS。然而 SVN/CVS 的操作與管理的學習成本是挺高的,我們無法「勸導」客戶積極地配合我們的 CVS 模式來跟我們的程式碼同步,還好 monotone...

libiconv: 字元集碼編轉換

jollen 發表於 September 27, 2006 11:10 PM

實作 Linux 系統程式時,常需要做「Unicode 與 Big5」間的字元編碼轉換;嵌入式 Linux 的應用也經常會遇到這樣的需求,例如我們原則上會將文件存成 Unicode,當程式執行時,再決定要輸出成 Unicode 或 Big5 (or GBxxxx),這時就要使用到 GNU 的 libiconv 專案。 GNU libiconv 用來做字元間的編碼轉換,已經廣泛被使用在 GNU/Linux 系統中,例如 PHP 的 iconv 系統即是使用 GNU libiconv。libiconv 要移植到 ARM9 平臺上也是非常容易的。GNU libiconv 的官方首頁是: http://www.gnu.org/software/libiconv/ 把 libiconv 套件解開並編譯後,可以在 src/ 目錄下找到 iconv...

Name Service Switch 程式設計:基本觀念

jollen 發表於 October 3, 2006 10:21 PM

有些 C 函數的運作會依據 localhost 的設定而有不同行為,而這些設定的做法是透過「設定檔」(eg. /etc/services) 來實現。目前在 GNU/Linux 系統底下,可以看到許多這樣的設定檔,我們把這些設定檔稱為 system database,這些資料庫主要是以文字檔方式儲存重要的系統資訊,例如: /etc/passwd 存放使用者名稱、/etc/services 存放網路服務的通訊埠 (port) 設定等等。 GNU C library 實作的 "Name Service Switch" 函數群便是用來讀取所有 system database 內容的介面! System Database NSS 支援 11 種資料庫名稱:aliases、ethers、group、hosts、netgroup、networks、protocols、passwd、rpc、services 與 shadow。分別說明如下。 aliases: Mail 別名 ethers: Ethernet...

Name Service Switch 程式設計:原理探討

jollen 發表於 October 4, 2006 2:30 PM

我們以一個 'gethostbyname' 的例子來說明 NSS 的運作原理 假設我們想要查詢網路上某台 host 的 IP 位址,那麼 GNU C Library 手冊告訴我們說,有一個 gethostbyname() 的函數可以使用。 不過,在真正寫 code 時,其實並不建議呼叫此函數,在說明原因前,有一句必名言是大家一定要銘記在心的: Multi-threaded safe code must be reentrant. 由於 gethostbyname() 並非 reentrant 的版本;所以,呼叫 gethostbyname() 並不是正確寫法,我們必須改成呼叫 reentrant 的版本:gethostbyname_r()。 NSS module 裡 non-reentrant 的函數,是不能使用在 multi-threaded...

getpriority() 與 setpriority() 程式設計

jollen 發表於 October 17, 2006 10:40 PM

前幾天介紹到 Linux 的一個排程(Scheduling)系統服務叫做 sys_nice(),與 sys_nice() 相關的 system call service 是 sys_getpriority() 與 sys_setpriority(),不過在看 kernel code 前,我們應該先試著了解 getpriority() 與 setpriority() 二個 system call 的用法。 先來了解一下 getpriority() 的用途,GETPRIORITY(2): SYNOPSIS #include <sys/time.h> #include <sys/resource.h> int getpriority(int which, int who); getpriority() 的 which 參數用來指定要取得...

關於 gcc 的 __attribute__ 用法

jollen 發表於 October 27, 2006 12:02 AM

gcc 提供一種「定義函數屬性(attribute)」的語法,也就是前一篇日記我們所提到的 __attribute__ 標籤。__attribute__ 用來讓我們定義函數的行為,以便告訴 gcc 在編譯時期對此函數做一些特殊的處理或檢查動作。 以 asmlinkage 的例子來說,asmlinkage 的定義是(/usr/include/linux/linkage.h): #if defined __i386__ #define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0))) #elif defined __ia64__ #define asmlinkage CPP_ASMLINKAGE __attribute__((syscall_linkage)) #else #define asmlinkage CPP_ASMLINKAGE #endif 由此可知,以 sys_nice() 的原型宣告來說,以下的二行程式碼是等價的: asmlinkage sys_nice(...); __attribute__((regparm(0))) sys_nice(); "__attribute__" 寫在函數宣告之前或之後都可以(左括號前或右括號後),並接著使用一對「雙括號」來註明此函數的屬性。語法: __attribute__((keywords))...

Kconfig 與 "-mregparm=num" 參數

jollen 發表於 October 30, 2006 3:27 PM

gcc 在 i386 / x86_64 的 machine dependent 參數 (-m) 中,有 1 個參數與參數的傳遞相關的:-mregparm=num,這個參數的用途與先前提到的 "__attribute((regparm(?))__" 作用相同*2。 -mregparm 用來指定有多少個 integer 的參數可以透過暫存器(register)來傳遞, 以下是 -mregparm 的 man(GCC(1)): Intel 386 and AMD x86-64 Options ... -mregparam Use a different function-calling convention where the first two...

ELF(Executable and Linking Format)格式教學文件, #1: ELF 簡介

jollen 發表於 November 19, 2006 10:12 PM

ELF(Executable and Linking Format)是 object file 的檔案格式,其主要結構是以 section(節區)為主,我們可以利用 GNU binutils 套件的 objdump 工具來列出執行檔的 section 與其內容。例如,我想把 ls 命令的 ELF section 列印出來: # objdump -x /bin/ls |more ... Idx Name Size VMA LMA File off Algn 0 .interp 00000013 08048114 08048114 00000114...

ELF(Executable and Linking Format)格式教學文件, #2: ELF header 與範例規劃

jollen 發表於 November 22, 2006 11:39 PM

本文接續之前的日記「ELF(Executable and Linking Format)格式教學文件, #1: ELF 簡介」,在了解 ELF 的用途後,再來我們先由「ELF Header」的部份開始看起,我們的目標是寫一個可以將 ELF 執行檔裡所有 section 讀取出來的程式。未來將繼續朝 user-space 的 ELF 處理前進。 如果您是 Jollen 的讀者,或許曾經在書上讀到這個章節,本系統的內容與書上內容大致相仿,但仍有一些小差異,建議您可再讀一次。我希望能以其它的出版形式,將這些內容都與大家分享。 ELF header:檔頭格式 ELF 於 SysV ABI 標準中定義,其中 ELF header 的結構如下表: Field Description e_ident 用來辨別檔案是否為ELF,並包含一些machine independent 的資料。 e_type 檔案的類型 e_machine...

我用來建立 Linux System Calls' Table 的程式

jollen 發表於 November 23, 2006 7:12 PM

以 Perl 寫的簡單 script,可以用來產生 Linux 的系統呼叫表(system call's table)。雖然程式笨笨的,跑一次也要一段時間,不過還是幫了我許多忙。由於 Jollen 網站上的 Linux System Calls' Table 並不會針對每個版本做更新,所以我就把我用的 Perl script 提供出來給大家自行使用。 不過,2.4/2.6 不同版本間的 system call 都是一樣的,除了注意是否有新增的 system call 外,也不會有什麼差別。而且,也不常看到 kernel 在新增 system call。 這個 Perl Script 的使用方法請參考檔案內的 README 說明。下載檔案 [lsct_gen-0.1.tar.bz2(10 KBytes)]。另外,這個 script 也會把...

ELF(Executable and Linking Format)格式教學文件, #3: 第一個範例:loader v0.1(讀 ELF 檔頭)

jollen 發表於 November 24, 2006 12:06 AM

ELF 的第一個範例:loader v0.1 ELF header 儲存執行檔的重要資訊,我們必須先知道如何讀取 ELF 檔案的檔頭資訊(header),才能處理個別節區(section)。在 GNU/Linux 系統下,程式可以直接引用 elf.h 標頭檔。完整的程式範例 loader-0.1.c 列表如下。 /* * Copyright (C) 2003 www.jollen.org * * ELF programming. ver 0.1 * */ #include <stdio.h> #include <unistd.h> #include <elf.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h>...

ELF(Executable and Linking Format)格式教學文件, #4: 第一個範例:loader v0.2(ELF Identification)

jollen 發表於 November 26, 2006 12:27 PM

ELF Identification ELF header 資料結構裡的 e_ident 欄位用來判斷檔案是否為ELF格式的欄位,e_ident 欄位是一個陣列資料結構,其長度由 SysV ABI所定義的常數 EI_NIDENT指定。 EI_NIDENT 的值為 16 代表 e_ident 欄位有 16 個元素,SysV ABI 定義了 8 個常數來索引 e_ident 陣列的元素。 表 e_ident[] 索引值定義 Name  Value  說明 EI_MAG0  0  ELF 識別字元 EI_MAG1  1  ELF 識別字元 EI_MAG2...

ELF(Executable and Linking Format)格式教學文件, #5: 讀 ELF Section(說明)

jollen 發表於 November 28, 2006 5:14 PM

今天的內容「讀取 ELF section」是這系列 ELF 文章的重點戲。因為我們終於進入 ELF 的核心議題「節區的觀念」了。在 loader v0.5 以前的範例,都是屬於靜態的討論(linking view);在 loader v0.6 開始的討論中,我們將會開始提到動態的執行行為(execution view)。 如何讀取 ELF Section 我們分 2 個步驟來讀取 ELF 的 section 資訊: 1. 如圖一,一開始先讀取 section header table 的資訊。section header table 是所有 section 的紀錄表格,所有的 section 都要透過 section header...

ELF(Executable and Linking Format)格式教學文件, #6: 讀 ELF Section(程式列表)

jollen 發表於 December 4, 2006 4:39 PM

範例列表:loader v0.3 /* * Copyright(c) 2003,2006 www.jollen.org * * ELF programming. ver 0.3 * */ #include <stdio.h> #include <unistd.h> #include <elf.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> int elf_ident(char *ident) { if (*(ident+EI_MAG0) != ELFMAG0) return 0; if (*(ident+EI_MAG1) !=...

ELF(Executable and Linking Format)格式教學文件, #7: 讀 ELF 的 Section Name(透過 strtab)

jollen 發表於 December 4, 2006 5:25 PM

根據 SysV ABI 的定義,若 section 的類型為 SHT_STRTAB,則該 section entry 即為 string table 的 section header。Section 的類型可由 section header 的 sh_type 欄位來判斷,SysV ABI 定義的 section 類型(sh_type)如下表所示。 表 sh_type 欄位的定義 Name  Value SHT_NULL  0 SHT_PROGBITS  1 SHT_SYMTAB  2 SHT_STRTAB  3 SHT_RELA  4...

ELF(Executable and Linking Format)格式教學文件, #8: loader v0.5 與結果輸出(改善與小討論)

jollen 發表於 December 6, 2006 1:12 AM

我們接續 loader v0.4 的工作,強化一下輸出結果的可讀性;先來比較一下 loader v0.4 與 loader v0.5 的輸出畫面。 $ ./loader-0.4 loader-0.4 $ ./loader-0.5 loader-0.4 ELF Identification Class: 32-bit objects Machine: Intel 80386 Num of secionts: 34 .interp .note.ABI-tag .hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text...

「Truncate It」小技倆的原始碼與原理

jollen 發表於 January 9, 2007 11:41 PM

先前提到的「一個防止程式被玩耍的小技倆」中,Jollen 提供了一個稱為「Truncate It」的小工具,我把他的原始碼放在此處「http://tw.jollen.org/elf-programming/truncate_it.tar.bz2」,有興趣的朋友可下載回家把玩。 用法請參考前一則日記的介紹,另外,「Truncate It」只是一個「呈現概念的原型」,並未良好的 coding,除了結果是輸出到 stdout 外,現階段也只能處理 IA32 的 ELF image。 Truncate It 的原理 Truncate It 的原理相當簡單,我只是把「Section Header Table」等資訊由 ELF image 中移除,因此「標準工具」便無法處理 ELF image;這是由於 GNU binutils 的工具都是以 linking view 來解讀 ELF image 之故,若要正常反組譯「truncated ELF image」,就要以 execution view 的角度來解讀執行檔。 此外,Section...

.bss section:C 語言所種下的因

jollen 發表於 January 10, 2007 10:44 PM

由於當初 C 語言標準提到「未初始化的全域變數(un-initialized global variables)其初始值為零(zero)」,所以得到的結果便是「程式執行時,必須將未初始化的全域變數都初始化成零」。 Linux 針對這種狀況的解決方式是「配置 zeroed pages 給 .bss section」,因此 un-initialized global variables 的值(value)便會為零。 註:Un-initialized global variables 會被編譯器放到 .bss section,可參考 Jollen 的「BSS Section 觀念教學」專欄。 此外,global variable 被初始化為零時,也會被 GCC 放到 .bss section 裡。所以,以下的寫法: int foo; main() { ... }...

Nano-X 程式設計, #3:顯示圖片(image.c)

jollen 發表於 January 13, 2007 8:41 PM

程式範例 image.c 是以 hello.c 為基礎,加上顯示圖片的功能。透過 image.c 我們可以學到以下的 Nano-X 程式設計方法: ˙ 如何使用嵌入式圖片 ˙ 如何將圖片顯示於視窗上 由檔案讀取圖片檔並顯示顯示圖片是一般常見的做法,這裡我們所要實作的範例是希望可以將圖片直接嵌入程式裡,而不是由外部檔案讀取。 如何使用嵌入式圖片 要將圖片嵌入於程式裡,首先必須將圖片轉換成數值資料形式的 C 程式。Nano-X 提供一個檔名為 convbmp 的工具來將 BMP 格式的圖片轉換成 C 程式。 convbmp工具的原始程式位於 src/mwin/bmp/convbmp.c,這是提供給 Microwindows API 使用者的工具,因此我們在設定 Nano-X 編譯選項時,除了勾選 Nano-X API 外,還要勾選 Microwindows API 選項才能產生 convbmp 執行檔。編譯後可以在...

Nano-X 程式設計, #4:設定 Window Manager(wm.c)

jollen 發表於 January 13, 2007 11:11 PM

wm.c 以 image.c 為範本,wm.c 執行後在畫面上只會看到圖片圖(沒有視窗標題列與邊框),並且可使用滑鼠來拖曳圖片。本範例主要在展示以下的 Nano-X API 程式設計方法: ˙ 如何設定視窗屬性(window manager)。 ˙ 如何與使用者做互動(human interactive)。 要寫出「托曳圖片」的功能,首先必須把視窗的標題列與邊框去除,否則只能在標題列上托曳整個「視窗」。做法非常簡單,只要在建立視窗時設定 window manager 即可: wid = GrNewWindowEx(GR_WM_PROPS_APPWINDOW | GR_WM_PROPS_NODECORATE | GR_WM_PROPS_NOAUTOMOVE, NULL, GR_ROOT_WINDOW_ID, 0, 0, image_jollen.width, /* 圖片寬度 */ image_jollen.height /* 圖片高度 */, 0xFFFFFF); 粗體字的地方是新加入的 window...

Shared Memory 的 Race Condition

jollen 發表於 January 16, 2007 3:54 PM

今天在討論基本的 shared memory 機制時聊到,shared memory 有同步性的問題(synchronization),主要的原因是 Linux 並未對 shared memory 做同步的控制。以下單純由 user-space programming 的角度來探討此觀念。 首先,試作以下 3 個小程式: shm_allocate.c,用來請求 shared memory shm_read.c,用來讀取 shared memory shm_write.c,用來寫入 shared memory 以上程式可由 [http://tw.jollen.org/ipc-programming/shm_race.tar.bz2] 下載。以下是操作方法: # ./shm_allocate jollen Shared Memory Segment ID: 98306 先執行 shm_allocate 配置...

研究 Dynamic Loader, #1: dlopen

jollen 發表於 February 5, 2007 11:54 PM

學到 ELF 的格式,並了解 .text/.data/.bss section 後,接下來絕對不能錯過「ELF loader」領域最經典的題目 - dynamic loader。不把 dynamic loader 從頭到腳好好研究一遍的話,實在是可惜了! 要學習 dynamic loader 的議題,並深入核心實作,最好可以由 ld.so 程式設計的主題切入。ld.so 是 Linux 的 dynamic loader,如果 man ld.so 的話,可以得到以下解釋: DESCRIPTION ld.so loads the shared libraries needed by a program, prepares the pro-...

小聊 .dynstr 節區

jollen 發表於 March 5, 2007 12:31 PM

昨天與同學小談了一下 .dynstr 節區,簡單紀錄如下。 我們知道 ld.so(dynamic linker/loader)與 ldd 指令,而這二個程式都會參考到 ELF 的 .dynstr(dynamic linking 的 string table)。以 ldd 來說,我們用 ldd 來找出 ELF 執行檔的相依動態程式庫: # ldd hello libc.so.6 => /lib/tls/libc.so.6 (0x42000000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) 這個動作依賴 .dynstr 節區所提供的資訊,也就是說,當 .dynstr 的內容有誤或是不存在時,ld.so 與 ldd 便無法正常工作。例如:...

小談 mmap() 與 VMA

jollen 發表於 March 16, 2007 5:38 PM

最近在 program loader 專欄裡,整理並分享了 kernel 的 ELF loader 主題;接著下來就是 dynamic linking 的議題了。在正式介紹 dynamic linking 前,先來簡單提一下「memory mapping」的觀念;近期在進行 Linux programming 的教育訓練,正好可以跟同學做個小討論。 在 IPC 的課程中提到 mapped memory 的行程間通訊機制,是透過「shared file」來做訊息的傳遞;將 shared file mapping 到 process address space 的 system call 為 'mmap()'。以下是其中一個簡單的程式範例 (mmap_write.c): #include...

Embedded System 與使用者的互動:關於 Event-Driven 架構

jollen 發表於 April 4, 2007 2:43 PM

關於 embedded system 的應用程式架構,最廣為人知的模型就是「event-driven」的做法。傳統的應用程式若是採用「結構化」的方式來設計,是否能適合 embedded system 的應用還需要進一步評估。 典型的 embedded system 裝置經常需要處理圖形顯示與使用者互動,通常使用者是透過像是 touch panel 或是 GPIO 的硬體介面與應用程式溝通,再由應用程式更新圖形顯示。 因此,有沒有任何做法,可以讓我們在 Linux 系統下以直觀的「事件」方式設計程式呢?經常看到的實作方式是使用 pthread 的方式來實作,透過 pthread 來產生多個執行緒,每個執行緒負責設定一個以上的事件;所有的事件都在 parent process 裡的 software loop 做判斷處理。這是最簡本的做法。 上述所提的 parent process 負責「case」(C 的 swith 敘述)所有的事件,並做出相對應的處理,這個 process 通常也被叫做 thread manager,或是...

Embedded System 與使用者的互動:Event-Triggered or Not?

jollen 發表於 April 7, 2007 1:16 PM

Event-Driven(或 Event-Trigger)的架構研究,通常伴隨嵌入式系統與控制的主題出現,我們以「嵌入式控制系統(Embedded Control Systems)」來泛指相關的研究主題。目前,在 embedded control system 的研究領域中,以 event-trigger 和 feedback scheduling 的技術為主;embedded control system 目前是 pervasive computing 的當紅題目。相關的研究,可在 [Feng XIA] 的網站中找到許多有用的 paper,建議可先由 "Event-Triggered Feedback Scheduling of Embedded Control Systems [1]" 此篇 paper 著手,以了解更多這方面的最新研究。 不過,我的目的並不是在了解 embedded control system 的設計理論,而是希望由相關的研究文獻中,找到一些適合「顯示與互動式」的嵌入式軟體架構。大略分享一下目前的初步研究如下。 互動是指使用者與機器的互動,而我想要的架構在於能簡化與有效設計「顯示(GUI)與互動(user...

關於 Acceptable Time 概念:運用在我的 Event-Driven 架構中

jollen 發表於 April 8, 2007 2:34 PM

前一篇日記提到,「feedback scheduler」是 time-triggered 模式,但我所規劃的架構為「full user-space」的實作,因此,怎麼在 user-space 計算時間,便成為一個核心議題;考慮到我們所定義的「acceptable time」有別於真實的系統時間(clock),或是即時性(real-time),因此我定義了一個基本時間單位:T。 若下一個時間單位為 T2,則 T_interval = T2 - T1,也就是每個 T 時間可以取得一個真實的系統時間,即 T_interval,但這不是我們想要的「時間」;假設 T_interval = 10ms,那個在我的系統中,每個基本時間單位 T 會等於真實時間的 10ms。 我們定義 TS(n) 為:每個事件到達後,一直到它的「control task」被「啟動」所需的花費時間(latency)。再定義 TD(n) 為:control task 啟動後,到執行結束所需要的時間長度。由於在這個系統裡,是不考慮真實時間的,只用「幾個單位」來表示所謂的「時間」,所以可以簡單將此系統的概念表示成: TS(n) = n * T TD(n) = n...

ELF 之 Dynamic Linking 觀念教學, #1: 前言與簡介

jollen 發表於 April 16, 2007 1:17 PM

接續前些時日的「Program Loading」專欄,本系列日 記將會介紹「dynamic linking」的核心觀念。首先,我們由 dynamic segment,即 .dynamic section 切入;如果您還不清楚為何以此做切入,建議先行閱讀 'Program Loading' 專欄,以建立基礎概念。 Dynamic section 是整個 dynamic linking 體 系的觀念核心,絕對不能放過;在 System V ABI 規格中,有詳細的 dynamic section 介紹。Dynamic section 裡頭包含多個 'entry',每一個 entry 紀載不同的資訊。首先,我們先找出 dynamic section 的資料結構定義如下: /* Dynamic section entry. */ typedef...

ELF 之 Dynamic Linking 觀念教學, #2: DT_NEEDED 基本概念

jollen 發表於 April 17, 2007 10:53 PM

所謂「如何找到程式所需(depends)的程式庫」並非一件很技術面的事情,程式經常會呼叫程式庫裡的函數,並且由於 Linux 是 shared library 系統,因此 程式執行時,如何找到程式需要的程式庫,其實是一件很自然的事情。 程式所需的程式庫,稱為相依性程式庫,即 library dependencies;並且,程式庫也會再相依其他的程式庫,因此,找出 library dependencies 是一種拓樸邏輯關係。 由 dynamic linker 的實作角度來說,程式的 library dependencies 紀錄在 dynamic segment 的 DT_NEEDED entry 裡,dynamic linker 便是由 DT_NEEDED 為起點,建立 library dependencies 關係圖,此圖又稱做 NEEDED list。 例如,若程式相依 libm 與 libc,那麼,DT_NEEDED entry...

無痛入門:OpenMoko Toolchain

jollen 發表於 May 20, 2007 2:06 PM

接續幾天提到的「Embedded Linux 應用的痛處: OpenEmbedded」。對初入門的使用者或是學生來說,比較好的方法就是儘量提供一個使用簡便的開發環境,才能降低 Embedded Linux 開發的「恐懼感」。 針對 OpenMoko 的開發應用來說,目前我初步提供一個簡單的解決方案,大致概念如下: - 希望可以 build applications,而不是 build the 'system'。 - OpenMoko framework 本身以原始碼形式提供,因為這是 OpenMoko 的核心,並且我們也會經常修改程式碼。 - OpenMoko 的 architecture 部份,除了 OpenMoko framework 本身外,其它的 library、dependencies library 以及相關的 infrastructure(例如 sysvinit、busybox 等),以 binary 形式提供。 -...

開放原碼架構設計:Glib 小談 (1)

jollen 發表於 May 25, 2007 10:31 AM

前言 就程式碼內部的組織來說,以往我們經常重新定義一些基本的東西,並透過這些 're-defidition' 的巨集或函數(亦稱為 wrapper function)來撰寫程式。有時,也能透過重新定義的方式,將框架(framework)的實作隱藏起來。這種技巧,大量被應用在許多軟體專案中。 Glib 小談 Glib 是 GTK+ 計畫下的「副產品」,Glib 原本主要是給 GTK+ 與 GNOME 使用,不過,現在也有越來越多的應用程式開始使用 Glib 來開發軟體。Glib 就本質來看,他提供一套重新定義過的 data type、event loop 框架、thread 框架、以及物件(object)系統。 Glib 以一種「宏觀」的方式,提供 C 語言一套高度可攜性、簡單易學且通用的工具庫(toolkit)。由於 Glib 實在太優異了,除了 GTK+ 與 GNOME 本身外,也有非常多的 Free / Open Source Software...

週三的 stack-based coroutine 範例

jollen 發表於 May 30, 2007 11:37 PM

週三至工研院進行教育訓練,其中提到了「Linux pthread」的議題,並透過作業系統的觀念(sys_fork),簡單分析了一下為何 Linux pthread 是「bad」。在講解過程中,展示了一個 video surveillance 的應用程式,說明如何改用 event-driven / event-loop / feedback scheduling 的方式來取代傳統的 multi-threaded 架構。 此外,也提到 co-routine(協同式多工)的概念,建議可先行閱讀 [jserv] 兄的「使用 coroutine 實做 user-level thread」。 只以程式語言的技巧,來實作「多工」是一種很有用的做法,課程中,撰寫了一個「stack-based coroutine」的簡單實例,程式碼如下: #include <stdio.h> #include <pthread.h> int count = 0; int state = 0; #define...

何謂 Monolithic Process?

jollen 發表於 July 29, 2007 1:59 PM

今天討論到 IPC 的程式設計議題時,順帶提及「monolithic process」的觀念,簡單紀錄如下。 傳統的應用程式架構方式,是把不同的「功能」以結構化程式設計觀念,寫成不同的函數。每當我需要使用某個功能時,便以「函數呼叫」的方使來叫用,當該函數結束工作並返回(return)後,主程式才能繼續「polling」下一個所要執行的功能。 這種架構應用程式的程式寫法,會讓整個應用程式是以「單一執行緒」的方式存在,此種「整合應用程式」的做法,便稱為「monolithic process」。例如,Linux kernel 本身也是屬於這種架構。 但是,在應用程式越來越複雜與多元化的今天,我們無法再使用這種方便來整合「不同的應用程式套件」,因為可能會變動到相當大量的程式碼。因此,便導入「應用程式框架」(application framework)的觀念來解決此一問題。 延伸閱讀: * 開放原碼架構設計:D-BUS 觀念小談...

qemu + Linux kernel 模擬與除錯環境實習

jollen 發表於 December 31, 2007 3:41 PM

Qemu 是一個功能強大的「processor emulator」,qemu system emulator 還能模擬開發板的週邊。此外,qemu 還包含一個 gdb server 的實作,配合 gdb client 能組合出一個很棒的 kernel & device driver「source-level debug」環境。 Jollen-Kit! Pro. 是由 jollen.org 所推出的 ARM9 開發板,主要用途是拿來做 Embedded Linux 的教育訓練。在前一陣子的 Linux Device Driver 訓練課程中,特別規劃了一個時段的「qemu + Linux kernel 模擬與除錯環境實習」的操作課程,此課程所採用的 qemu 能模擬我們的 Jollen-Kit! Pro....

libusb 簡介與第一個範例

jollen 發表於 January 25, 2008 3:49 PM

[libusb] 是一個 user-space 的 USB 程式庫,在 embedded linux 應用實作上,我們會使用 libusb 實作一個 host 端的應用程式,並透過 USB 介面存取或控制 target device。 找到所有 USB bus 與 USB device 要撰寫一支 user-space 的 USB device 控制程式,最首要的工作就是找到自己的 USB 裝置。這個工作主要透過以下 4 個函數來進行: usb_init: 初始化 libusb usb_find_busses: 尋找系統裡的所有 USB bus...

Top | 授權條款 | Jollen's Forum: Blog 評論、討論與搜尋
Copyright(c) 2006 www.jollen.org