發表文章

目前顯示的是 5月, 2011的文章

tmpfs : (virtual memory)

圖片
tmpfs 是一套以使用記憶體為基礎的檔案系統。 不同於 ramdisk 的最大差別在於,ramdisk 雖也使用記憶體,但它的屬於 Block device,使用前必須先 format(mkfs), tmpfs 使用上就很方便囉.. 直接 mount 就可以使用了 要使用需確認 kernel 有沒有勾選  Virtual memory file system support (former shm fs) 可以用下面方法使用: 1. mkdir /mnt/ramfs     vi /etc/fstab     none /mnt/ramfs tmpfs defaults 0 0     mount /mnt/ramfs     沒指定大小,預設是 ram 的一半。 2. mount -t tmpfs -o size=256m none /mnt/tmpfs     256m 是 256Mb 的意思。 3.  vi /etc/fstab     tmpfs /tmp tmpfs size=100m,mode=1777 0 0     編輯 fstab 開機時可以透過 mount -a 自動載入。 Reference: http://www.ibm.com/developerworks/cn/linux/filesystem/l-fs3/                        http://wiki.debian.org.hk/w/Tmpfs

HID report descriptor

圖片
The Items on report descriptor is classified into three categories. Main Items: - Input - Output - Feature - Collection - End Collection Global Items: - Usage Page - Logical Minimum / Logical Maximum - Physical Minimum / Physical Maximum - Report Size - Report Count - Report ID - Unit - Unit Exponent - Push / Pop Local Items: - Usage, Usage Minimun / Usage Maximum - Designator Index, Designator Minimum / Designator Maximum - String Index, String Minimum / String Maximum - Delimiter - Reserved Global and Local items describe the details of the format Main Item (Input, Output, Feature) generates report field(s) of specified type, detailed by global and local items. Collection / End Collection pair defines a block of report fields - which may be nested The value of each global item is carried over to all of following lines, until new value is defined. On the other hand, value of local item is cleared, when it is applied to a major item. This table illustrates the

UBIFS

有關ubifs的詳細介紹,請參考:  http://www.linux-mtd.infradead.org/doc/ubi.html  http://www.linux-mtd.infradead.org/doc/ubifs.html  linux 2.6.28 開始支援 ubifs. UBIFS 是由NOKIA Engineers開發用於Flash memory的檔案系統. UBIFS可以視為下一代的Jffs2 file system. 與Jffs2一樣,UBIFS建構於MTD device之上而與一般的block device是不相容的. 1.Jffs2的架構與限制 Jffs2在mount時會scan整個flash所有的資料,再將檔案系統目錄儲存在system memory. 這種作法帶來的缺點是mount動作會消耗很多時間. 而當flash size越大所需的時間及system memory都將成線性倍數成長 Jffs2沒有write-back機制.(write-back : 先cache寫入的資料到一定的量再一次作write動作) 當Application寫入資料,Jffs2幾乎是同步將資料寫入實體flash. 會說幾乎是因為Jffs2的確有一塊NAND page size大小的buffer用來紀錄最後寫入的資料. 沒有write-back機制的缺點是對flash I/O的動作頻繁 Jffs2檔案存取所需要的時間跟檔案大小呈線性倍數成長 Jffs2如果歷經許多檔案小部份修改寫入動作,Jffs2的運作效率會逐漸變差. 2.UBIFS帶來的改進 UBIFS有個子系統UBI用以處理與MTD device之間的動作. UBIFS檔案系統目錄儲存在flash上.這代表UBIFS mount時不需要scan整個flash的資料來重新建立檔案目錄. 因此mount所需時間約為幾百個ms而且不隨著flash size增加. UBIFS support write-back. 寫入的資料會被cache住直到有必要寫入時才寫到flash. 這樣的作法降低分散小區塊數量及I/O效率. 但write-back非同步的寫入行為使得Application在寫入檔案時要謹慎處理同步問題. 重要的檔案使用fsync強迫

crosee compilie mtd-utils

需要 lzo 和 zlib 這 是提供資料壓縮之用的函式庫 還有  e2fsprogs(包涵 uuid, 這是 ubifs 需要的) 1. zlib   http://www.zlib.net/   wget http://www.zlib.net/zlib-1.2.7.tar.gz ./configure --prefix=/joseph/LIN/mtd/install make install 如果要在 arm 上執行, 要修改 Makefile vi Makefile,    gcc 改成  arm-mv5sft-linux-gnueabi-gcc ar   改成  arm-mv5sft-linux-gnueabi-ar ranlib   改成  arm-mv5sft-linux-gnueabi-ranlib 如果沒有加上  --static, 會變成 shared library 就需要 libz.so   ./configure --prefix=/joseph/LIN/mtd/install --static  這是 static library 方法 2. lzo   http://www.oberhumer.com/opensource/lzo/ wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gz ./configure --prefix=/joseph/LIN/mtd/install make install 如果要在 arm 上執行,  ./configure --prefix=/joseph/LIN/mtd/install_marvell --host=arm-mv5sft-linux-gnueabi 3.  e2fsprogs   http://e2fsprogs.sourceforge.net/ wget http://sourceforge.net/projects/e2fsprogs/files/e2fsprogs/1.45.5/e2fsprogs-1.42.5.tar.gz ./configure --prefix=/joseph/LIN

SSDP UDP broadcast ...

#include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/select.h> #include <sys/time.h> #include <sys/socket.h> #include <netdb.h> #include <stdio.h> #define RESPONSE_BUFFER_LEN 1024 #define SSDP_MULTICAST      "239.255.255.250" #define SSDP_PORT           1900 int main (int argc, const char * argv[]) { int sock; size_t ret; unsigned int socklen; struct sockaddr_in sockname; struct sockaddr clientsock; struct hostent *hostname; char data[] =  "M-SEARCH * HTTP/1.1\r\n" "Host: 239.255.255.250:1900\r\n" "Man: \"ssdp:discover\"\r\n" "ST:upnp:rootdevice\r\n" "MX:3\r\n" "\r\n"; char buffer[RESPONSE_BUFFER_LEN]; unsigned int len = RESPONSE_BUFFER_LEN; fd_set fds; struct timeval timeout; hostname = gethostbyname(SSDP_MULTICAST); hostname->h_addrtype = AF_INET; if((sock = socket(PF_INET, SOCK_DGRAM, 0)) == -1) { p

世界地圖

圖片

UTF-8 的檔案, 用 SlickEdit 開啟會出現亂碼 ....

圖片
在options -> file options -> load標籤下,右側有一個Encoding,調整這裡...

vim 鍵盤配置

圖片

NAND flash的特性

圖片
NAND flash 的特性 以下是一個 NAND flash memory 的架構圖,以 Samsung K 9F 1G 08U0D 為例 上面兩圖,是相同的意思。 NAND flash 由很多層的 block 組成,而 block 是 erase 的最小單位。一個 Block 通常包含了 64 個 page ,而 page 是 read / write 的單位,一個 page 的大小為 2Kbytes(user space) + 64bytes(spare area) 。其中 user space 是用來存放一般的 data , spare area 是用來儲存一些 meta data 作為管理 file system 用。 1G ( 128MB ) 的 Flash    - Page size :  (2K + 64)Byte                                                 - Block size :  (128K + 4K)Byte 不同 size 有不同的組合。 Nand Flash  在出廠時會經過比較嚴格的測試,以便找出潛在的 bad block 。 出廠時, bad block 會被標記在 block 的 的 spare area 。  (Initial Invalid Block) 因為 spare area 也是 erasable ,所以要小心,不要將 shipping 時標記好的 bad block mark  刪掉。 ( 否則就找不回來了 ) 。 Nand Flash 這種便宜又 low end 的東西,即使不去理他,也有可以能會自己壞掉 ..@@

Heap 和 Stack

程式的記憶體分配 一個由 C/C++ 編譯的程式佔用的記憶體分為以下幾個部分 1 、 區( stack ) — 由編譯器自動分配釋放,存放函數的參數值,局部變數的值等。其操作方式類似於資料結構中的 。 2 、 區( heap ) — 一般由 Programmer 分配釋放,若 Programmer 不釋放,程式結束時可能由 OS 回收。注意它與資料結構中的 是兩回事,分配方式倒是類似於 link-list 。 3 、全局區(靜態區)( static ) — 總體變數和靜態變數的存儲是放在一塊的,初始化的總體變數和靜態變數在一塊區域,未初始化的總體變數和未初始化的靜態變數在相鄰的另一塊區域。程式結束後由系統來釋放。 4 、 constant — constant 字串就是放在這裏的。程式結束後由系統釋放。 5 、程式碼區 — 存放函數體的二進位碼。 二、例副程式 這是一個前輩寫的,非常詳細 //main.cpp int a = 0; 全局初始化區 char *p1; 全局未初始化區 main() { int b; char s[] = "abc"; char *p2; char *p3 = "123456"; 123456\0 在常量區, p3 在 上。 static int c =0 ; 全局(靜態)初始化區 p1 = (char *)malloc(10); p2 = (char *)malloc(20); 分配得來得 10 和 20 位元組的區域就在 區。 strcpy(p1, "123456"); 123456\0 放在常量區,編譯器可能會將它與 p3 所指向的 "123456" 優化成一個地方。 } 二、 和 的理論知識 2.1 申請方式 stack: 由系統自動分配。例如,聲明在函數中一個局部變數 int b ;系統自動在 中為 b 開闢空間。 heap:   需要 programmer 自己申請,並指明大小,在 c 中 malloc 函數。 如 p1 = (char *)malloc(10); 在 C++ 中用 new 運算符 如 p2 = (char *)malloc(10); 但是注意 p1 、 p2 本身是在 中的。 2.2 申請後系統的回應 :只要 的