Tag Archives: Embedded

[雜談] 行銷真的很重要……

在 Digg 看到 World’s First BitTorrent Microprocessor
點進去一看, 才發現原文章的標題是
IAdea/Star Semi Jointly Develop the First BitTorrent-Optimized Microprocessor
Read more »

mmap Sample Code

在 Embedded System 的世界內, 常常要讀寫 Memory 做一些測試, 這時侯 mmap 就很好用了
mmap 可以讓 user space access physical memory.
雖然是很簡單的小動作, 但是對 debug 和驗證 hardware 非常的好用.

網路上應該有不少 mmap sample code, 應該寫得更好.
我只是拿來驗證一下我們的 Platform 有沒有問題.

我這一段是設定 Static Memory 以後, 再直接設定 Philip SC16C2552 到 Baud rate 38400
再印出 “This is test string" 這個字串.
當然中間有個 Bug, 不過我懶得修 XD

這時請記得, 這時候 UART 還沒有啟動 FIFO , 所以只能送出一個字, 加個 delay 再送出第二個字
要不然會看不到

不過 mmap 並不適合需要高速或是反應快的 Device
比較適合 Initial hardware 或是查詢 memory 內的值.
主要還是 mmap 是 User space , Data 要送到 kernel mode. 這一段要花一段時間, 而且 memcopy 非常耗時.

ref.
mmap Sample Code

Philips SC16C2552 爛了

真的是工作上的鳥事.

因為某個 Project 的的關係, 需要用我們 CPU 上的 Static Memory Interface 連到 Philips SC16C2552 這一顆 Parallel 轉 Serial 的 Dual UART IC .

其實以硬體來說, 如果線都拉好, Static Memory Interface 設好, 應該就能夠正常的讀取.
不過這一顆 IC 卻花了我好多時間.

第一天
這一天做的事情很簡單, 就是設定環境, 將特別寫的一支 Serial Driver 換成 Linux 標準的 Serial Driver .
啟動 Static Memory Interface .
結果 Driver 上上去, 連個鳥都讀不到.

然後在 ARMBoot 下直接對該記憶位置下指令,
結果讀回來的都是 0xFF .
這時候當然就是拿 LA 出來量訊號, 結果發現到 CS 亂發, 沒有動也發, 這樣 IC 會動才有鬼

第二天
找 Hardware 修好線路, 也驗證 Register 也可以正常讀寫.
拿回去仔細修 Bug . 最後發現, TX/RX 半個鳥也沒有.
這時候我就覺得奇怪了, 怎麼會發生這麼奇怪的事情.
在檢查了 Register 都沒有問題的狀況下, 只好又請出 LA, 看 Address , 看 CS , 看 Read/Write 訊號
怎麼看程式都是對的, 但是 TX/RX 連個鳥都沒有…..

第三天
Hardware 剛好有一個新的板子回來, 一掛上去馬上可以用. 也有訊號輸出.
那我之前做的事情不就是很白爛,
搞了好幾天原來是 IC 爛掉… 更更更更更!!
浪費我的時間.

最後整理一下 Linux 下的 Serail Driver, 發現輸出非常慢(每 5 秒輸出 1 or 16 個字元)…..
最後找呀找, 又發現原來講好叫 Hardware 拉 GPIO 到 Philips SC16C2552 的 INTA . 結果 Hardware
都沒有做, 最後還是拿 GPIO 做 Interrupt 之後才正常.

很久沒有這樣被一顆爛 IC 搞到快瘋掉. 寫一篇 Blog 發洩一下… 更更更更!

Wireless 的 Aggregation

電腦的世界內, 很多概念都是相同的, 有時候看看這些技術, 其實還很好玩的呢~

Aggregation 是一種概念, 我最近接觸到這個名詞是在 PreN 的 driver 上看到的, 主要的技術背景
就是將多個封包合而為一, 一起傳送出去. 主要還是減少大量封包傳輸時, 減少 Control Packet 的 Overhead.

其中主要的實作有以下幾種

  • Block ACK
  • Reducing Inter Frame Spacing (RIFS)
  • Frame Packing At MAC Layer (AMPDU)
  • Aggregating PPDU (APPDU)
  • 這些都是作用在底層的協定(Layer 2), 在實務上, 你用 Sniffer 並不會看到這些技術出現.

    首先來看 Block ACK 的機制, 這個機制就是希望在傳送的過程中, 不要再傳送 ACK
    而 Block ACK 又分成 immediate 和 delayed, immediate 是直接在 aggregation packet 傳送結束後,
    馬上傳回 ACK, 而 delayed 是等下一次傳送後再送出 ACK (心中 OS : 這種 Schema 有人用嗎…..?)
    一般來說, 大量資料傳送都會使用 Block ACK .
    而個人認為 Block ACK 也很像是 Scaling Window 的機制, 只是比較簡單, 不需要去判斷 Bandwidth.
    其實 ACK Packet 也是要耗用 Resource 去處理的, 如果這個 ACK 是用 hardware 處理也還好,
    不過如果這個 ACK Packet 是要用 CPU 去處理, 那就值得用 Block ACK 去減少 ACK 的耗用量
    畢竟一個 ACK 也是要耗用和一般 Packet 差不多的時間去處理(當然 Memory Copy 的時間少很多).

    RIFS 就比較容易理解了, 就是在 Frame 和 Frame 中間並沒有一些 Delay 或是空白的機制.
    以增加單位時間內可以傳輸的資料量.

    AMPDU
    AMPDU 圖示
    從這一張圖表可以很清楚的看到, AMPDU 就是將數個相同目地的資料, 集合成一次送出, 以減少底層 Hand Shaking 的時間, 同時也可以減少 Header 的重覆傳送, 以達到快速傳送的目地.

    APPDU
    和 AMPDU 不同的地方在於, APPDU 是 Physical Layer Header 集合在一起.

    一般來說, Aggregation 對於 Bulk Data Transfer 的效用並不大, 將 Header 減少的效用剛好在處理 Aggregation 這一段時間就補回來了, 但是 Aggregation 對於小封包就很有用了, 這時 Header 佔小封消耗的時間就比較多了.

    曾經看過 Aggregation 這樣處理的

    這樣的處理如果在 x86 內, 一點問題也沒有, 畢竟 x86 速度快, Memory Bandwidth 也大, 所以程式寫爛一點也沒有關係. 但是在 Embedded Linux 下, 畢竟資源有限.
    我們看到這個圖, 總共有幾次的 Memory Copy 呢? 答案是 3 次, 比起一般的收封包, 多了二次, 也就是三倍的 Memory 頻寬耗用量, 這還不包含 CPU 處理的時間.
    所以 Driver 這樣寫, 真是大方呀, 據我所知, 大概只有那家將文書編輯軟體內放模擬飛行的公司可以比而己…..

    這只是一個很簡單的例子, 在 Embedded Linux 下寫 Code 要特別小心, 並不是每次都有什麼 IXP420 266Mhz or 400MHZ+ 甚至是 C7 這樣高階的 CPU. 常常的狀況都是比較低階的 CPU .

    所以各位看倌可以發現, Aggregation 並沒有什麼了不起, 只是以前的概念拿來修修改改.
    在 802.11n 這些技術也己經很普遍了.

    Ref. 主要的參考文件
    Performance Analysis of Data Aggregation Techniques for Wireless LAN

    Voodoo Programming

    Voodoo Programming 中文又稱巫毒編程, 我在一個偶然的機會下看到這個名詞

    原意是講, 不知道程式怎麼運作, 結果就下去寫程式, 然後就不會動了, 或是得到一個可以動,
    但是不知道為什麼會動的結果… 後來也有引申 compile 第一次不過, compile 第二次就過的意思..

    不過我比較喜歡這個解釋

    當遇到程式一直跑不出來又找不到原因, 感覺很鬱卒時就隨意改些程式的變數之類, 期望程式可以正常跑.

    搞 Embedded Linux 時, 常常碰到一些靈異狀況, 很多莫名奇妙的情形, 看 Code 也不見得能夠了解為什麼,
    甚至常常程式改寫之後, 某一個功能就爛了.
    這時候就會自己開始亂改程式, 期望他能夠出現我要的結果, 或是前後亂動, 甚至是這種指令都出來了
    “# mv .config .. ; make mrproper ; mv ../.config . ; make dep ; make zImage"
    我想 Linux 在修改程式後, 期望大家都要 make clean 再重編一次, 有時候或許就是這種 Voodoo Programming 發生功效了吧.

    有時碰到看起來程式都對, 只是就是會發生問題的東西, 心中真的是有一股咒怨, 連寫出來的 code 都帶有怨氣, 例如:

    int fuckvar;
    char *shitstr;
    char damearray[SHITNUM]; …….
    int *asshole(…..)

    整個程式就是一種詛咒, 這時候的 Programmer 己經變成了 Voodoo Programmer XD

    能不能預防這種事情發生呢? 以我做 Embedded 的經驗來說, 還算是很難, 畢竟 Embedded Linux 常常碰到一些奇怪的狀況,
    有可能是 IC 發生問題, 像是電壓輸出的問題
    有可能是 IC 內的某一個 IP 出問題
    或是有可能是版上的某些線路, 例如 PCI 的線路拉出來都是一樣的, 為什麼 A 會, B 不會.
    甚至是 Code 一樣, Performance 都不一樣.

    這時候就是靠非常有經驗的 Programmer 去解決這樣奇怪的問題, 或是抽絲剝繭, 一步一步查出問題
    雖然是苦功夫, 卻是解決問題的好方法.

    數款 11n Wireless Device 評比.

    Tom’s Networking日前發表了一篇Draft 802.11n Revealed: Part 1 – The Real Story on Throughput vs. Range

    其中評比了三家 Wireless Modules , 分別是
    Broadcom’s Intensi-fi
    Marvell’s TopDog
    Airgo
    其中 Wireless 大廠
    Atheros’ xspaN 鳥掉了, 所以來不及搭上這一班列車…..

    以上四家內, Airgo 的 11n 標準和其他家是不一樣的, 所以並不能相容
    由這一張圖來看

    Airgo 在傳輸距離和效能比, 比 Marvell 和 boardcom 好.

    而 0 db 衰減下, 都可以有 100Mbps 上下的表現(其實這個表現差強人意啦, 不過我想各家都應該正在改 Driver 和 Hardware )

    文未還是叫大家不要買, 反正現在 11n 貴的要死, 而且不相容(例如: 1Client < -> AP , Client < -> Client,
    互連 Marvell/Broadcom/Althros)的問題層出不窮.
    除非你是有很有錢的, 否則還是省起來吧.

    最近在玩 11n 的機器, 也沒有他講的那麼差啦. 在 ship 時, 廠商還是不斷的修正 hardware/software 的 Issue, 使其更穩更好. 至少我看到的測試數據都比 Toms Hardware 好(當然只是測試數據)
    個人目前的建議同上, 除非你不想插網路線, 又想要有比 11g+ (108M) 更快的速度, 否則沒有必要目前切入, 當廠商的白老鼠.

    不過目前 11n 最大的意義應該不止是 Wireless performance 比以往更高, 11n 要求有 100Mbits 以上的傳輸速率, 這代表著 Home Gateway 己經正式邁進 Gigabit 化. 不管你要不要, 我想 Gigabit 的時代己經來臨.

    或許有人會說, 100M 己經夠快了, 我為什麼要 Giga ?
    這句話我很久以前也聽過類似的, “我 10M 都用不完了, 為什麼要升級 100M 的…."
    我很早就用 Gigabit 的網路, 比 100M 的大概快上二倍, 100M 約 90Mbips (實際值),
    Gigabit 大概介於 280Mbps (實際值)上下.
    更不要說現在每個人的 Notebook/Desktop 都是 Giga, 而這一年 Giga 的 Home Gateway 的成本
    也降一半有了…. 再不久 Giga 就會蟑螂化了

    Linux Device Driver Kit

    Greg K-H 公佈了 Linux Device Driver Kit
    包含了以下的 Document

    The Linux Kernel API
    Unreliable Guide To Hacking The Linux Kernel
    Unreliable Guide To Locking
    Bus-Independent Device Accesses
    The Linux-USB Host Side API
    USB Gadget API for Linux
    The Linux Journalling API
    libATA Developer’s Guide
    Reed-Solomon Library Programming Interface
    Linux Security Modules: General Security Hooks for Linux
    MCA Driver Programming Interface
    MTD NAND Driver Programming Interface
    Linux Kernel Procfs Guide
    RapidIO Subsystem Guide
    Video4Linux Programming
    Synchronous PPP and Cisco HDLC Programming Guide

    再加上 Linux kernel 2.6.16.18 Source code 和 Linux Device Drivers 3rd

    這分收集的文件非常的棒, 尤其像是我們是做 SoC 的, 幾乎各種 Device 都碰得到, 非常值得收集在 HDD 的 🙂
    如果是初學 Device Driver 的人, 更是不可少呀.

    Embedded System 的 SSL Library .

    前二天看到 jserv 的 blog “Embedded SSL Libraries
    現在在做 Embedded Linux , 雖然還用不到, 不過有備無患.
    先備份一下

    另外 LinuxEmbedded. 也有一篇文章 Embedded SSL library supports TLS

    OpenCores Project

    OpenSource 的 Power 無遠弗界, 最近看到 OpenCores 這個網站, 這是提供 OpenSource 的 IP. 也就是說, 使用者可以拿這些 IP 組合出自己想要的 IC, 不過仍需 Follow GPL/BSD License 的規範.

    看起來 IP 還不少, SoC 的 Core, USB , UART , 10/100 MAC. USB 1.1 PHY 等等都有在內, 如果不是要做先進的 IC, 這邊的 IP 其實還算很夠用, 要做出自己的玩具應該也沒有問題.

    不過 IC Design 麻煩的事並不在 IP 呀, IC 驗證/後段製程/軟體才是重要的問題.

    arm gcc 的幾個 flag.

    arm gcc 早期的版本和目前的版本(3.4.2), 在參數上有幾個小差異
    Read more »