bloggerads

2013年12月28日 星期六

C++ : virtual function

參考以下的範例,若想統一用base class pointer指向base class object以及 derived class object, 但base class 和 derived class 又有相同的函式, 那麼就必須將這種相同的函式宣告成virtual function 才能達到

#include <iostream>

class c1{
  public:
     virtual void vfunc(){ std::cout << "Calling c1\n";}
};
class c2: public c1{
  public:
     virtual void vfunc(){ std::cout << "Calling c2\n";}
};
int main()
{
  class c1 *c;
  class c1 c1_obj;
  class c2 c2_obj;
  
  c = &c1_obj;
  c->vfunc();
  
  c = &c2_obj;
  c->vfunc();
  
  return 0;
}

___________OUTPUT____________
Calling c1
Calling c2

2013年12月26日 星期四

C++ : template

function template (樣板函式):

C++提供template, 用來免去重複撰寫類似的函式(僅變數型態不同的函式)

template<class T> 
// template<typename T> //class or typename
T min (T x, T y) { 
  return (x < y) ? x : y; 
}

同樣的東西, 在C則是使用Macro來達成


#define min(x, y) (((x) < (y)) ? (x) : (y))

2013年12月25日 星期三

C++ Class 小記

這裡示範一個 Class 的 sample:

//--------------------------------------------------------------------------
//  In Tui.hpp file
//--------------------------------------------------------------------------
class CTui
{
// 沒有public的部分即為private members
public:
        CTui();  //Constructor
        ~CTui(); // De-Constructor

        void print(char *p);      

};


//--------------------------------------------------------------------------
// In Tui.cpp file
//--------------------------------------------------------------------------

#include "Tui.hpp"

//
//class members of CTui
//
CTui::CTui() 
{
  // new 記憶體, initial 參數...
}
CTui::~CTui() 
{
  // delete 記憶體
}

void CTui::print(char *p) 
{

}


2013年12月23日 星期一

Differential signaling, 差分/動信號

電磁學有一章節專門討論傳輸線,有一種傳輸線叫做雙線式傳輸線目前廣泛用在電子信號傳輸,如SATA的TX/RX, PCIe的DQS, clock, USB...等等

這種差分信號的好處是可以抗雜訊,但是設計上就較複雜因為晶片要有能力把信號載到射頻上。

因為是射頻的信號,因此要提到特徵阻抗(Characteristic impedance)這個東西,特徵阻抗是電場和磁場的一個比值,單位是歐姆,他和傳輸線的材質/尺寸相關。若不是高頻使用的傳輸線,則傳輸線上的每一點特徵阻抗都會有差異,造成信號的反射(衰減)。

以SATA為例(下圖),SATA傳輸線的特徵阻抗為100Ohm+/-10%,如果信號不好通常就是調整眼圖(Eye Pattern)的參數Emphasis (pre-emphasis / de-emphasis)和Amplitude。
  • Emphasis是信號high, low互相轉換時的斜率
  • Amplitude是信號的振幅
下圖介紹眼圖裡面SNR, Jitter等名詞
圖片出處 (Eye Diagram Basics: Reading and applying eye diagrams)

2013年12月8日 星期日

C++ : class內部宣告static member

以下討論在class裡宣告static member 

static member代表他只與class相關,而不與物件相關 (故無法用this指static member)
static member有static function & static function兩種

static function 只能呼叫static variable & static function, 不可呼叫物件層級的function 和 variable。但物件層級的 function 則可同時呼叫static與非static member

請參考以下範例:


#include <stdio.h>
class cTest
{
public:
 static int Num;
 static void Func() {
  //static function 只能呼叫static variable & static function, 不可呼叫物件相關的function 和 variable member
  printf("%d", Num);
 }
};

int cTest::Num = 9; // static variable的初始值必須寫在global area. 

int main()
{
 cTest::Num = 10;
 cTest::Func();
 return 0;
}

2013年12月4日 星期三

NAND flash 與 NOR flash

EEPROM翻成中文叫電子可抹除唯讀記憶體(非常繞舌),最早發明時其構造為NOR結構,所以有人就直接將其稱為NOR flash, 後來因應大規模儲存記憶體的需求,因此再研發了以NAND為結構的EEPROM,很多人就直接稱NAND結構的EEPROM為NAND flash

所以我們有兩種flash, 一種是NAND一種是NOR

NOR的特點是可IC內執行程式(XIP, eXecute In Place),這樣應用程序可以直接在flash內執行,不必再把程式讀到系統的RAM中,實務上主機板的BIOS就是放在NOR(SPI ROM)裡

NAND實務上則是用來放資料用,如USB/EMMC/SSD這些都是使用Nand當存儲結構。

NAND flash的結構單元尺較NOR來的小很多,這幾年NAND的技術突飛猛進,從SLC->MLC->TLC,閘極通道尺寸也從24nm->19nm->15nm,甚至到了3D NAND,主要的Vendor是Toshiba, Micron, Hynix & Samsung