TLC NAND 小註解

TLC 是 Triple Level Cell 的縮寫, 和 SLC, MLC 所代表的 Single / Multiple Level Cell 都是類似的東西.

從 SLC, MLC, 到 TLC; 在成本上, 愈來愈低, 因此在容量上也愈來愈大. 所謂的容量變大,  是指單一 cell 可以表示更多 bits.

SLC 用 1 cell 表示  1 bit.

MLC 用 1 cell 表示 2 bit. 以 4 個電壓表示  (0,0), (0,1), (1,0), (1,1).

TLC 用  1 cell 表示 3 bit. 以 8 個電壓表示  (000, 001, 010, 011, 100, 101, 110, and 111).

所以在相同的 cell 容量之下, MLC 的容量變成 SLC 的 2 倍, TLC 的容量是 SLC 的 3 倍.

雖然容量提昇, 但是 TLC 的速度和穩定性都比  MLC 更下降了. 即便如此, 從  MLC 成功取代 SLC 的先例來看, 未來的固態硬碟, 有可能是 TLC 的天下. 畢竟一顆超大的硬碟, 過了兩年可能就變成 "好小一顆", 誰還管它耐不耐用呢?

[ref]

1. 全面了解TLC NAND技术以及市场现状

ARM ACP 小註解

ARM 的 CPU 有個機制叫做 ACP (Accelerator Coherence Port), 它是啥呢?

以 MIPS 系統為例, 如果我用 DMA 搬了一塊 memory, 而 CPU 不知情 –  因為不是透過它搬的, 那麼 CPU 就不能用 cache memory 來存取這塊記憶體, 以免發生預期以外的狀況. 既然不能 cache, 那麼 CPU 就不能自由自在地操作它了.

一般來說, 部分的 DMA 還是透過 CPU 填寫 register, 故 CPU 可以等 DMA done, 然後再進行一般的操作. 不過在多工的情況下, 使用起來就會更加地麻煩.

ARM 的 ACP 就是解決這個問題, 假如一個 device 被掛在 ACP 上, 那麼即使用 DMA 對這個 device 做動作, 其內容也會被同步到 cache memory 裡面, 包括 L1 和  L2 cache. 雖然 ACP 只支援 3 個 bit 的 AXI device ID – 8 個 device, 還是可以用 bridge 的方式加以擴充.

ACP 上的 device 在 read 的時候, 依序在 L1, L2 cache 和 external memory 讀資料.

ACP 上的 device 在 write 的時候, 會優先灌入 L1 cache, invalid 舊資料, 當然也就 update 了 L2 cache.

從行為上來看, 如果一個 device  有很多 DMA, 又有很多 CPU 動作, 那麼 ACP 將可以帶來不少的好處. 包括快速, 省電等等.

Android Thread Safe / Lock Free / Atomic 小註解

Atomic (原子) 通常是指一個指令不會被打斷, 例如一道組合語言的指令, 在沒有執行完之前, 就是 ISR (interrupt service routine) 也無法干擾其結果. 同樣的概念如果放到 function 上, 就很難說這個 function 從來都沒有打斷過了. 我們頂多說這個 function 的結果是如預期的.

怎麼樣保證如預期呢?在 Android 當中的 atomic.c 採用暴力的方法進行, 例如要做一個 write.

void android_atomic_write(int32_t value, volatile int32_t* addr) 顧名思義想把 value 寫到這個 addr,  而它裡面的內容就是:

{

int32_t oldValue;

do {

oldValue = *addr;

} while (android_atomic_cmpxchg(oldValue, value, addr);

只要 OldValue 沒有 value, 這個 loop 就不善罷休. 所以一定可以寫成功. 只要成功了, 就準備離開. 大家可以發現, 如果此時別的 thread 也來寫同樣的位置, 那就出事了. 

為了避免後者的狀況發生, 我們最好不允許這個在有效期間之內又被改掉. 解決之道是 lock 此一變數, 直到 unlock 之前, 都不讓別人改寫. 不過 Android 的 atomic 是 lock-free 的, 所以不需要用 lock. 相對地, 它讓其他的 thread 不會影響到當前的 thread, 也就是確保 thread safe.

怎麼做到 lock free, thread safe 呢, 簡單地說就是避免使用全域變數 (global variable), 只用區域變數 (local variable 或 auto variable). 此時每個 thread 都只針對自己的記憶體空間操作, 就不會影響到別人了.

此外, 我們可以指定哪些變數必須是 automic 的, 例如宣告成:AtomicBoolean, AutomicInteger, AutomicLong, AutomicIntegerFieldUpdate<T> …等等就有保護作用. 這些描述在 java.util.concurrent,automic.

當然, Android 還是有 lock, class 是 java.util.concurrent.locks.

[ref]

1. Android SDK

2. Lock-free atomic operations in Android

3. Thread-Safe的理解與分析

LTE 4G 頻段表

這次去韓國, 看到滿街都在賣 4G 手機. 從 2011年 7 月起佈建的 LTE 網路, 據說到 2013 年才能正式完工. 雖然現在沒有那麼完整的覆蓋率, 但是導遊都對他手上的 4G 手機深具信心, 號稱比 3G (3.75G 吧!) 快 5 倍. 我想民族自信心就是這樣來的吧! 雖然咱們導遊是拿台灣護照的, 他對 Samsung 可是讚不絕口.

反觀台灣這個 “科技島", 要到 2015 年才開始建設 4G, 估計要到 2017 年才能把 LTE 或 LTE-A 搞好, 感覺真是不可思議. 一來疑似圖利 WiMax 業者, 二來主要電信業者也過於怠惰. 如果電信業者自命為穩定獲利股, 恐怕真的不想花錢建基地台吧? 

[釜山市 LTE 充斥圖]

SONY DSC

雖然我們已經可以買到 4G 手機了, 但買到的 LTE 手機究竟能不能互通呢? 很抱歉! 看下表就知道基本上很難互通. 目前世界各國主流採用的頻段, 台灣都已經用掉了. 換言之, NCC 若不強制回收現有頻段, LTE 是不可能提早開工的! 更不用說我們的 4G 手機 (非 WiMax) 要買哪個規格都沒辦法預知. 

[世界各國 LTE 頻段表]

下表的 V 代表使用這個頻段,  X 代表這個頻段已經有人用了.

 MHz  700   800  900  1800 1900  2100  2300  2500  2600
 ITU
 北美  V  V
 西歐  V  V
 東歐  V  V  V  V
 亞太  V  V
 中東 / 非洲  V  V
 其他地區或國家  V  V
 預估主流  V  V  V  V
 香港  V  V  V
 日本  V
 韓國  SKT/LG  KT
 中國 (TD-LTE)  V  V
 台灣  X  X  X  X  X  X  X

修復 WordPress 上下標問題

先前就發現了, 即使在編輯器中修改好的上下標字形, 在部落格裡面就硬是爛的. 前陣子寫的幾篇剛好又用到不少上下標, 只好認真去解這個 bug. 

根據 3 年前 moshu 所寫的文章, 這個病因來自於 style sheet.

html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-size: 100%;
vertical-align: baseline;
background: transparent;
}

用來表示上下標的 sub (superscript), 包括 <sub></sub>, 以及表示下標的 sub (subscript), 包括 <sup></sup> 都被 style sheet reset 掉了. 因為單獨寫個測試 html 也是好的, 只不過被 wordpress 的主題給改壞掉.

這個要怎麼改呢?

在 "控制台" 選 "外觀" 的 "佈景主題", 找到 /* reset */, 把那兩個 keyword delete 掉, 再更新檔案就好了.