1バイトをビット扱いする方法は、
unionun_p1dr {
unsigned char one_byte ;
struct {
unsigned char b7:1 ;
unsigned char b6:1 ;
unsigned char b5:1 ;
unsigned char b4:1 ;
unsigned char b3:1 ;
unsigned char b2:1 ;
unsigned char b1:1 ;
unsigned char b0:1 ;
} bit ;
} ;
#definept_da_p1dr(*(volatile union un_p1dr *)0xffffd0)
と宣言すれば、pt_da_p1dr.bit.b7 = 1 ;の様にビット扱いが出来ます。
この反対を行える宣言方法は、あるでしょうか?
つまり、任意の1ビットを8ビット集め、プログラムでバイトにてアクセスしたいのですが・・・・
ARMなどは、ビットの扱いが容易に可能です。しかし、CPUの周辺関係事情より、バイトでのアクセスが
可能なように、ハード割り当てが出来ません。
従って、現在は、プログラムにて、ビットを集め、バイトにして、アクセスしています。
なにか良い宣言方法があれば、ご伝授していただけないでしょうか?
宜しくお願いいたします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
「任意の1ビットを8ビット集め、バイトにてアクセス」っていうのは、例の中のb7は0x1000番地の3ビット目に対応、b6は0x1020番地の5ビット目、…みたいに指定して、one_byteに値を代入すると指定した各番地のビットが書き換わるみたいな仕組みが欲しいということでしょうか。
C言語の標準にはそういうものはないので、安心してこれまで通りのやり方を続けてください。
No.1
- 回答日時:
普通は、
#define pt_da_p1dr(*(volatile union un_p1dr *)0xffffd0)
のあとに、たとえば、
#define aPort pt_da_p1dr.bit.b7
と定義するだけですが。
「プログラムにて、ビットを集め、バイトにして、アクセスしています」の具体的なコードでもあれば、何かわかるかもしれませんが。
ただ、Cのレベルで、ビットアクセスできても、CPUがビット単位でアクセスしているかどうかは、また、別の話ではあります。
この回答への補足
すいません。解りづらいので、補足させて頂きます。
ARMの場合、下記の通りポートAの0ビット宣言は、
#define PORTA_0 *((volatile unsigned int*)(0x42668080UL))
と宣言されています。
この様なポートを8ビットにまとめたいのですが・・・
出力プログラムを組むと下記の様に成ります。
void bit_byte(char data)
{
if( data & 0x01 )
PORTA_0 = 1 ; //ポートAの0ビットに出力
else
PORTA_0 = 0 ;
if( data & 0x02 )
PORTC_5 = 1 ; //ポートCの5ビットに出力
else
PORTC_5 = 0 ;
if( data & 0x04 )
PORTD_1 = 1 ; //ポートDの1ビットに出力
else
PORTD_1 = 0 ;
.
.(3~6ビットは、省略)
.
if( data & 0x80 )
PORTA_7 = 1 ; //ポートAの7ビットに出力
else
PORTD_7 = 0 ;
}
void main(void)
{
bit_byte(0x26) ; //0x26を出力する
}
このbit_byte関数を、宣言でバイトに各任意のビット指定をし、
下記の様に組めないでしょうか?
abc = 0x26 ;
bit_byteの関数は、一見で解かる様に書いたので、
この関数の組み方での指摘は、しないでください。
ご存知でしたら、是非、教えて頂きたいと思います。
宜しくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語について コマンドラインで >変数 12.00 (char型) と、小数点付きの値を共用体に渡 1 2022/04/22 16:56
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Integer変数をカラにしたいので...
-
VBAのプログラムで、DIAG = 1# ...
-
C言語 構造体の中に共用体を定...
-
「#undef」と「#define」の使い...
-
構造体のデータを丸ごとコピー...
-
VBAで符号無し整数
-
C++ 構造体の一括初期化 {0}
-
winsockのsendtoで送れるデータ型
-
VB6変数の宣言dim j,k,p,m,n as...
-
値が代入されてない時
-
OpenCV「cv::bitwise_and」につ...
-
VBAの変数のデータ型を変更する...
-
10進数の変換方法
-
VBAにてcolorindexを変数に格納...
-
ヘッダファイルと構造体
-
日付チェック関数について
-
構造体の初期化方法について
-
コンストラクタ内での動的メモ...
-
VB.NETのStructureというのはど...
-
long型のデータをバイト型の配...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
C++ 構造体の一括初期化 {0}
-
構造体のデータを丸ごとコピー...
-
C言語 構造体の中に共用体を定...
-
「#undef」と「#define」の使い...
-
VBAにてcolorindexを変数に格納...
-
long型のデータをバイト型の配...
-
値が代入されてない時
-
異なる構造体のデータのコピー
-
構造体のポインタにNULLが入らない
-
VBAの変数のデータ型を変更する...
-
変数の初期化について
-
構造体の初期化方法について
-
ユーザー定義型変数の一括初期化
-
FILE構造体がどのように定...
-
charとucharの違い
-
typedefをプログラム中で解除す...
-
整数から16進数への変換 現在c...
-
VB.NETのStructureというのはど...
おすすめ情報