2014/05/20

[C/C++] 幾個容易搞混的指標pointer用法整理

1.pointer integer
int i, *pi;
i = 10;
pi = &i;
int *pi; --> 表示pi代表一個記憶體位址,*pi會取出這個記憶體位址所儲存之值
int i; &i --> 表示取出i所在的記憶體位址

2.pointer array
int list[5] = {0, 1, 2, 3, 4};
list代表list[0]所在的記憶體位址,所以透過指標*(list+i)就可以相當於取list[i]之值

[Linux] Build Linux i2c-gpio module 標準Linux i2c interface[bit-banging]

I2C是在IC之間,常被使用的data bus,而在目前的MCU之中,很多時候都會用GPIO來做模擬,也稱作bit-banging,而且Linux kernel也有support這個部分的driver,以下為研究的小心得:

詳細的I2C protocol可以參考

這次的I2C detail information:
7 bits address / not open-drain / 100kHz

2014/05/11

[Linux] 使用getnameinfo()來get local IPv6 address及用mask比較subnet

IPv6會是未來使用IP address的趨勢,所以嘗試使用getnameinfo來拿到本機的IPv6位址,並且跟其他的IPv6位址(fe80::19fb:8e1d:e1c:947e)比較,看使否在同一個子網域之下。比較的方式採用IPv6的位址與mask做完AND運算,得到Network ID後與另外一個IPv6的Network ID位址比較,因為無法一次比較128bytes,所以依次8個bytes一組,總共比較16次,16的結果都相同,就判定在同一個subnet之下。

IPv6為長度128 bytes的位址,表示的方式會以每16個bytes以符號分號":"隔開的方式來表示,譬如例子的"fe80:0000:0000:0000:19fb:8e1d:e1c:947e",總個128bytes,然後連續0的地方可以用連續兩個分號"::"來表示,所以就變成"fe80::19fb:8e1d:e1c:947e"。