2014年8月29日 星期五

free_irq
request_irq

2014年7月29日 星期二

3gpp supplementary service 閱讀順序

分享一下最近看 3gpp spec的心得(最主要是閱讀的順序)
一句話: top-down。



以supplementary service中的 communication waiting (TS24.615)為例:

1 先看最後面的signaling flow。 先了解全貌,top-down。例如下圖2a,你才會知道AS會做的事是:  『查看approaching NDUB,然後用猜的大概是: 『看看這通call會不會被擋,而進入call waiting狀態(例如: callee正在講電話)』。
再例如 6a. 你會知道有插播進來的時候,可能會做的事,e.g., 按下保留(HOLD),要不就是掛掉目前這通電話,然後接插播的這一通。
『approaching NDUB』這個暫時不知道怎麼做沒關系,再往下查就好。
 


2 整個整個全貌之後,再往前對應,像是下面這個case,是在說『接到插播時該怎麼辦』
   2a stop timer → 話機不需要一直叫…
   2b 停掉CW indication → 話機不需要一直叫…
   2c  看你怎麼處置插播。










2014年7月20日 星期日

IMS, 3GPP, VoLTE 徵友



-----------
最近在搞的東西關鍵字如下: IMS, VoLTE,3GPP、precondition、sip forking process、IMS supplementary service。

PO此文的一個目的有一個是想找可以一起討論的同好(或是同樣陷入spec地獄的人 哈)
如果你看到此文,有興趣可以聯絡我。







明天計劃: 搞定 SIP precondition。最後四天就有一個大報告囉,東西真的很多呢…
以為綽綽有餘,結果居然有點吃緊…,沒有再最一開始就弄清整個份量,真是一個失誤。

2014年6月26日 星期四

paper sharing


1 這是很好的conference喔
2 motivation: ECC要花點時間,他發現如果SSD是cache,好像可以不用每次都用那麼強的ECC (越強越慢),因為就算要讀的page整個壞,也可以去下一層拿 (i.e., primary storage)
3 solution:  "有時候" 用 弱ECC




FlexECC: Partially Relaxing ECC of MLC SSD for Better Cache Performance
https://www.usenix.org/system/files/conference/atc14/atc14-paper-huang.pdf

2014年6月22日 星期日

Adaptive Paired Page Prebackup Scheme for MLC NAND Flash Memory

IEEE TRANSACTIONS ON COMPUTER-AIDED DESIGN OF INTEGRATED CIRCUITS AND SYSTEMS, VOL. 33, NO. 7, JULY 2014


problem: 有時寫 MSB page會弄壞 LSB page (同cell)
proposed: backup LSB page



2014年5月16日 星期五

C程式 面試題目整理

面試考題

1 explain #error


   ref1
   ref2
 
   簡單地說:  compiler看到 它 就會停掉啦~
   為什麼要停掉?  ref3


   2. explain "struct" and "union"



   struct → 所佔記憶體空間為 member 相加
   union → 所佔記憶體空間由最大size member決定

   note: 所以union的member同一時間只會最多出現一個
 
   example:

  3. 修飾字 (const, volatile, static......)

explain "volatile" and "const".  can we use "volatile" and "const" in the same variable ? can we use "volatile" in a pointer?
最能幫我理解的就是舉 status register來當例子,如下:

"const volatile is used for defining Hardware Read-only Registers.example CPU status registers.
the value of these registers are read-only but the 
value of these registers may change depend on the processor status.  
Thus const volatile variable can't be altered by the programmer but by the Hardware
" ref

中文版:
  "volatile變數代表其所儲存的內容會不定時地被改變,宣告volatile變數用來告訴編譯器 (Compiler) 不要對該變數做任何最佳化操作,凡牽涉讀取該volatile變數的操作,保證會到該變數的實體位址讀取,而不會讀取CPU暫存器的內容 (提升效能) 。舉個例子,某一硬體狀態暫存器 (Status Register)就必須宣告volatile關鍵字,因為該狀態暫存器會隨時改變,宣告volatile便可確保每次讀取的內容都是最新的"  cited from ref1

--------------------------------------------------


→ 何時可以用const?
      1 co-work一個function時,有時會用傳參考的方式,但傳參考有點風險(別人可以不懂,就直接改了某個不該改的變數) ,要避免的 你可以給這種 prototype:

             int foo(const int &bar)

------------------------------------------------------------



  幾個用法: (規則 * 和 & 左邊形容指向的值,右邊是本身),for example

  1. const int a=100;  // 沒有*和&,所以簡單: const和int通通是形容a
  2. int const b=100; // 同上
  3. const int *a=&b; // 套規則: * 左邊的const和int是指向的值,所以a指標指向的值不能改,*右邊的是本身,所以a可以改(沒有const和int修飾到它)
  4. int const *a=&b; //同上
  5.  int * const a = &b; //套規則: * 左邊的int是修飾a指向的值,所以,值可以改(因為沒const嘛),*右邊的是本身,已被const修飾到了,所以a不能改
  6. const int * const a = &b; // 也不用套三小規則了啦,都出現兩個const,就通通都不能改了啊!
  7. const int &a=100; ///套規則: & 左邊的int是修飾a指向的值,值可以改(因為沒const嘛),&右邊的是本身所以a可以改(沒有const修飾到它)
    note: 因為被const修飾到的東西未來都不能改了,所以宣告時要初始…不然就沒什用途了…(除非你希望該值是0?)

4. bit operation

example1:

可能是這樣解啦:
1 第四行和第五行 好像可以"約分"一下
→ 第5行會變成: v = (v1&(~v2)) |v2
再變成→ (V1|V2) & ((~V2) | v2)
→ &的右邊是1,所以V 就是V1|V2






example 2
a) #define set_bit(x, nth_bit) x|(1<<nth_bit)
b) #define clear_bit(x, nth_bit) x|(1<<nth_bit)
REF





? 難道要先展開成二進位? 再慢慢算?


5. ??


要考你 a+1 和 &a+1。
第一種的+1一次是跳一個int的大小(i.e., 4bytes in 32-bits cpu)
第二種的+1一次是跳一整個array的大小 (i.e., 4*5=20 bytes)

更清楚的說明在 (see also this), 可以看到: a和&a值雖相同,但type不同。
所以 +1 時,要加的是 type的大小

所以*(a+1)是2,(*p-1)是garbage (unknown value)



答案: typedef void(*pf)(char *);

第一行那坨,眼睛只要看著 void (*)(char *)就好
它是一個function pointer的type

只要記得,function pointer的typedef 是把new type的name塞在第一個*後面

不要像我一開始還寫成:

typedef void(*)(char *) pf




先說:  我還看過規定 + - * /都不能用的。

解法1: 可以利用3的倍數的特性:  每個位數相加起來依舊是3的倍數。
例如: 369是3的倍數,那3+6+9=18也一定是3的倍數。
『每個位數相加』的動作一直做到只剩個位數為止,如上例 18還不是只剩個位數,所以繼續,1+8=9。最後的結果只要是3或6或9 那該數就是3的倍數。




 

    9. explain lvalue and rvalue
















 

2014年5月8日 星期四

how to add a new parameter into .parv file in disksim






1  add your parameter in ssdmodel/modules/ssd.modspec as below:




2 declare a new variable to take the value of the parameter


3 make
   note: this will generate ssdmodel_ssd_param.c
                                     ssdmodel_ssd_param.h
                                     ssdmodel_ssd_param.tex
                                     modules.h





-----------------
contributed by Wade in oslab of CSIE in NCKU