7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Cプログラムを異なるマイコンで動作させる際のエンディアンとビットフィールドの取り扱い

Last updated at Posted at 2017-06-17

エンディアンについて

例えばH8用のCプログラムの一部をWindowsで動作させたいとする。

H8はビッグエンディアン、Intel CPUはリトルエンディアンなので
外部のバイナリファイルを読み込むときなどに問題になる。

sample1.c
UB	ReadFile[100];	//外部のバイナリファイルを読んで1バイトずつ格納するための配列

typedef struct test{
	UH	Code;		// コード(2byte)
	UB	yobi[14];	// 予備
}TEST;

TEST	*file_ptr;

//(中略:ReadFileに外部のバイナリファイルを1バイトずつ格納する処理)
	
	file_ptr = (TEST*)&ReadFile[0];


ReadFileの値が以下であったとする。

ReadFile[0]=0x01
ReadFile[1]=0x02

このとき、**"file_ptr->Code"**の値は以下のようになる。

H8 Intel
0x0102 0x0201

 
 

sample2.c
UH	code;	//2バイト
UB	*ptr;

ptr = (UB*)&code;
*ptr = 0x01;
ptr++;
*ptr = 0x02;

このときも、**"code"**の値は以下のようになる。

H8 Intel
0x0102 0x0201

ビットフィールド

実は共用体のビット定義も逆になっている。

sample3.c
typedef union {
	UH	data; //2バイト
	struct {
		UH	bf1:7;
		UH	bf2:5;
		UH	bf3:4;
	} bit;
} BIT_TEST1;

sample3.cはCPUによって先頭メンバのビットフィールドが逆順になる。

H8
bf1 :7bit bf2 :5bit bf3 :4bit
bit15~9 bit8~4 bit3~0
Intel
bf3 :4bit bf2 :5bit bf1 :7bit
bit15~12 bit11~7 bit6~0

 

ただし先頭メンバが配列のときは、配列の要素ごとにビットフィールドが逆になる。

sample4.c
typedef union {
	UB	data[2]; //1byte×2の配列
	struct {
		UB	bf1:4;
		UB	bf2:4;

		UB	bf3:4;
		UB	bf4:4;
	} bit;
} BIT_TEST2;


H8
data[0] data[1]
bf1 :4bit bf2 :4bit bf3 :4bit bf4 :4bit
bit7~4 bit3~0 bit7~4 bit3~0
Intel
data[0] data[1]
bf2 :4bit bf1 :4bit bf4 :4bit bf3 :4bit
bit7~4 bit3~0 bit7~4 bit3~0
7
7
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?