在〈初等概念〉一文, Jserv 說道:
在我看來,C Programming Language 本來就是用來寫作業系統,所以相關的基礎知識也要有一定的理解,至少也需要對硬體有認知,這樣才有機會徹底理解 C 語言,而 C++ 就更不說了,不僅 ISO C++ spec 複雜難懂,又得遷就於 C++ compiler 許多不合標準但陳窠已久的特性,又得將其 OOPL 的理念貫徹於專案開發,這使得沒有對特定 domain knowledge 有足夠掌握者,難以透過 C++ 將其發揮得淋漓盡致。
由〈初等概念〉文末附的 links,我尋線逛到 Dan Saks 在 Embedded.com 發表的專欄,並發現許多精緻優雅的 C 程式片段,堪稱為程式中的小品文,值得好好駐足欣賞:
- Symbolic constants
- Enumerations as Counters
- Well-Behaved Enumerations
- Enumerations Q & A
- Introduction to fixed-width integers
- Mapping memory
- Mapping memory efficiently
- More ways to map memory
- Place volatile accurately
- ...
在〈Enumerations Q & A〉中,我看到 enumeration 的精彩用法:
1: enum currency
2: {
3: currency_before = -1,
4: CAD, CHR, EUR, GBP, JPY, SFR, USD,
5: currency_after,
6: currency_min = currency_before+1,
7: currency_max = currency_after-1,
8: };
在〈More ways to map memory〉欣賞到漂亮的 special_register 使用方式:
1: typedef unsigned int volatile special_register;
2:
3: typedef struct dual_timers dual_timers;
4: struct dual_timers
5: {
6: special_register TMOD;
7: special_register TDATA0;
8: special_register TDATA1;
9: special_register TCNT0;
10: special_register TCNT1;
11: };
12:
13: enum { TE0 = 0x01, TE1 = 0x08 };
14:
15: #define timers ((dual_timers *)0x03FF6000)
16:
17: int main()
18: {
19: timers->TMOD &= ~(TE0 | TE1);
20: timers->TDATA0 = 50000;
21: return 0;
22: }
在〈Place volatile accurately〉,意外發現 shadow register 的用法:
1: typedef uint32_t shadow_register;
2: typedef shadow_register volatile
3: special_register;
...
此外,Jserv 在〈C99 的 offsetof macro〉引介的〈Learn a new trick with the offsetof() macro〉也很讓人激賞。
0 comments:
Post a Comment