[H8-ML(3250)] Re:割込みによるシリアル通信について(ビットフィールド話)
From: Shigeru Makino <mac@xxxxxxxxxxxxxx>
Date: 2003年05月25日(日)13時08分03秒
macです。

hamayan <hamayan@xxxxxxxxxxxxxxxx> wrote: 
> "Shouji> (まったく別のコンパイラに移植するときは怪しそうなところ(ビットフィールドの展
> "Shouji> 開位置、構造体のPackの仕方・・・)は注意しますが、同一メーカー、同一CPU向けでコ
> "Shouji> ンパイラをバージョンアップしただけだったのに・・・シクシク)
> 
> 不思議なのですが、ビットフィールド否定派の人は、何故コンパイラの
> 問題をビットフィールドの是非に話をすり替えるのだろうか?ですね。
> 
> なんで?
> コンパイラの問題なら、他にも有るし、それはコンパイラメーカーに直
> してもらえば良いだけの話では?

「直してもらう」といっても、仕様が統一されていないんだから、
なおしようがないんじゃないでしょうか?
bit fieldをMSBから振ろうと、LSBから振ろうと別に、
コンパイラの欠陥でも、バグでもないですよ。

「コンパイラの問題をビットフィールドの是非に話をすり替え」
しているわけでなく、互換性、移植性を問題にしているのです。

ただ、それがもっとも顕著に表れるのが、たまたま、
bit field, struct, unionになってしまうだけです。

> 逆に、HEXで書く方がミスし易いと思いますが。

HEXで書くわけじゃなくって、

//  Serial Mode Register (SCI_SMR)

#define CM              0x80            // communication mode
#define CHR             0x40            // character length
#define PE              0x20            // parity enable
#define PM              0x10            // parity mode
#define STOP            0x08            // stop bit length
#define MP              0x40            // Multi Prossesor
#define CKS1            0x02            // clock select 1
#define CKS0            0x01            // clock select 0

#define ASYNC           (!CM)           // asynchronous mode
#define CLKSYNC         ( CM)           // clock synchronous mode
#define CHRLEN8         (!CHR)          // character length 8 bit
#define CHRLEN7         ( CHR)          // character length 7 bit
#define NONEPRTY        (!PE|!PM)       // none patity
#define EVENPRTY        ( PE|!PM)       // even parity
#define ODDPRTY         ( PE| PM)       // odd parity
#define STOPLEN1        (!STOP)         // stop bit length 1 bit
#define STOPLEN2        ( STOP)         // stop bit length 2 bit
#define CLKDIV1         (!CKS1|!CKS0)   // clock select (divider) 1/1
#define CLKDIV4         (!CKS1| CKS0)   // clock select (divider) 1/4
#define CLKDIV16        ( CKS1|!CKS0)   // clock select (divider) 1/16
#define CLKDIV64        ( CKS1| CKS0)   // clock select (divider) 1/64

というような、ヘッダーを作っておき、

SMR0 = (ASYNC | CHRLEN8 | NONEPRTY | STOPLEN1 | !MP | CLKDIV1);

と書くんです。
これをbit fieldで書くのとどっちが分かりやすいでしょうか (^o^)

-- mac

スレッド概略
[3245(R)](起点)
 └[3248(U)]
   └[表示中]
     └[3253(1)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]