質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

7回答

11026閲覧

レジスタとは結局なんなのか

karino_nao

総合スコア17

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

2クリップ

投稿2018/10/22 13:55

編集2018/10/22 14:00

前提・実現したいこと

レジスタとは、結局何なのでしょうか?

私は、電子回路のペリフェラル(周辺機器)をC言語で制御する、というプログラムをかけるよう勉強している初心者です。
勉強していく中で、レジスタに値を設定することで、入出力ピンや、割り込み、タイマーなどの設定ができるとありました。
が、そもそもレジスタとは演算制御装置の1つであって、演算制御を行うために使用される記憶保持の総称、と理解していました。
レジスタを設定することで入出力ピンが特定・設定できる、がどうしてできるのか、と考えたとき、わからなくなりました。
(メモリの中にどの入出力ピンかわかる対応表みたいのがあれば別かもしれませんが…確証が持てず)

レジスタとは、結局なんなのでしょうか。
また、なぜ電子回路の制御に、レジスタを使用するのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答7

0

基本、言葉の意味が問題ならばwikipediaでも読んでみるのがよろしい。
レジスタ (コンピュータ)

このページを見てわかるように、レジスタという言葉は計算機の中で、何種類かの使われ方をしています。いずれにしても「コンピュータのプロセッサなどが内蔵する記憶回路」のことです。

レジスタとは演算制御装置の1つ

CPUの中の小容量で高速な記憶回路をレジスタと呼び、この使い方が一番多いかもしれませんが、「レジスタ」と呼ばれるモノは、それだけではありません。

レジスタを設定することで入出力ピンが特定・設定できる

この場合のレジスタは、周辺装置(ペリフェラル、peripheral)の動作・設定のための記憶回路を指します。
ペリフェラルデバイスのレジスタ

maisumakunさんがお書きになった通り、特定のレジスタにある値を書き込めば、その周辺装置は特定の動作をする、ように作られています。また、周辺装置の状態を読み取るための「周辺レジスタ」もあります。

以下、追記します。

なぜ電子回路の制御に、レジスタを使用するのでしょうか。

「入出力ピン、割込み、タイマーなど」の回路をざっくりと周辺回路・周辺機器と呼びます。

計算機の中心は何と言ってもCPUとメモリです。でもそれだけでは計算機は使い物になりません。なんらかの入出力機器等がつながって実用的になります。CPUとメモリの「周辺」に外部機器の制御のための回路がある、とイメージすれば良いでしょう。パソコンもキーボード、マウス、モニタ画面、補助記憶装置(ディスク等)、通信機能(ネットワーク等)などが無かったら使いにくいのは明らか。これらは全て周辺機器としてCPUにつながっています。

「入出力ピン、割込み、タイマーなど」に戻りますと、これらの回路は幅広い使い方ができるように作られています。幅広い使い方の中から、実際に使う時点で、用途に合った特定の使い方を選び取って利用します。

例えば、入出力ピンは入力にも出力にも使えるように作ってあります。しかし実際に使うには、入力に使うか、出力に使うか、使う人(ソフトウェア)が選択して、どれかひとつの機能を利用します(同時に入力も出力もするということはありえない)。そこで、ソフトウェアで入力にするか出力にするか、信号が流れる方向を選択するために「レジスタ」を設けたのです。

入力か出力か、方向を指定する、例えば出力に指定したとします。入出力ピンにつながっている電子回路は、
「レジスタ」の値に従って回路の働き方が変化するように作られていますので、その後は出力ピンとして動作を続ける、という次第です。

ある程度、電子回路を理解できるなら、入力か出力かを切り替える回路がどうなっているか、少なくとも原理的なところは理解できるはずです。適切な教材があるとか身近にこうしたことを質問できる人がいれば良いですね。各種マイコンのハードウェアマニュアルには周辺回路の大まかな構造が示されてもいます。
もし電子回路など見たくも知りたくもないということなら、そういうものだと頭から覚えこむしかないでしょうし、そんな人が何を詮索するのか?という疑問も感じますが(笑)。

割込みを使う場合も説明しましょう。
割込みはとても有益な仕組みではありますが、電源が入った(リセットした)時点からいきなり割込みがかかるのは非常に具合が悪く、使いにくいものです。そこで、ソフトウェアの方が準備できたところで、その時点から割込みがかかるように、ある「レジスタ」に値を書込みます。これもソフトウェアで周辺回路を制御できるようになっていればこそ、そのための「レジスタ」があってこそ、です。

結論的には、ソフトウェアが機能を制御できる(=プログラムできる)ように周辺回路は作られており、その設定をするため・周辺機器の状態を読むため、様々な「レジスタ」が用意されています。

投稿2018/10/22 14:49

編集2018/10/23 02:07
rubato6809

総合スコア1380

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

karino_nao

2018/10/22 15:15

周辺レジスタとは、ペリフェラルデバイスのレジスタとはまた異なるのでしょうか…? レジスタの種類が広がっていくorz
rubato6809

2018/10/22 15:24 編集

周辺とペリフェラルは同じものです。なのでペリフェラルレジスタも周辺レジスタも同じ。
karino_nao

2018/10/23 14:32 編集

勉強していてなんですが、 ペリフェラル=周辺、が、いまだ私の中でイコールになっていないですorz 英語難しい…。
karino_nao

2018/10/23 14:40

レジスタを理解するのに、電子回路(論理回路)の知識がどうしてもかかわってくる、 という理解をしました。 またレジスタは、電子回路(論理回路)を直接指定するのが特徴であり、 周辺機器(ペリフェラル)は、レジスタによる変更が前提として作られている、 逆を言えば、レジスタ以外で周辺機器へ変更しようとすることは、ソフトウェア上ではない、という理解をしました。 CPUとメモリ、周辺機器とレジスタの関係がみえないと、 割とドツボにはまりそう、とも思いました。
karino_nao

2018/10/23 14:55

電子回路系で、適切な教材とかは心当たりがないです…。 質問は、なるべくしていきたいと思っています。
guest

0

ペリフェラル制御に用いるレジスタについては、CPUが周辺機器のI/Oにアクセスするためのインターフェースだと考えていいと思います。
周辺機器が持っている機能ごとに専用のレジスタが用意(または自作)されており、レジスタはCPUのメモリ空間やIOポートにマッピングされます。
CPUがこれらのレジスタの値を読み書きすることで周辺機器の制御を行います。
例えば、何かしらのセンサの値を読む場合だと、
(1)センサを起動するレジスタにライトして、センサを起動する。
(2)センサの読み取り値が格納されているレジスタをリードしてセンサの値を取得する。

C言語だと、レジスタのアドレスが格納されているポインタ変数をリードライトすることになります。
適当なコードですが、

c

1volatile unsigned int *sensorControlRegister = (unsigned int *)SENSOR_REG1; 2volatile unsigned int *sensorValueRegister = (unsigned int *)SENSOR_REG2; 3unsigned int sensorValue = 0; 4 5*sensorControlRegister = 0x0001; /* センサ起動 */ 6delaty(100); /* ディレイ */ 7sensorValue = *sensorValueRegister; /* センサ値をリード */

投稿2018/10/22 15:36

TaroToyotomi

総合スコア1430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

他の方も書かれていますが、CPUのレジスタと周辺デバイス用のレジスタは別物と考えた方が良いと思います。

周辺デバイス用レジスタは、周辺デバイスの動作を設定し、動作させるもの。
実体は、SRAMだったりする事もあるとは思いますが、デバイス設計に依存するので、他にもあると思います。
以前は、書込みと読出しで意味が違うものもあったりしました。まあ、最近だと周辺デバイスも内部にCPUを持っていたりするので、構造はシンプルかな、と思いますが、内部事情は分かりません。
まあ、他の方の書かれているように、ブラックボックスとして扱うのが一番かと思います。(多分、設計者、時代によっても実装は異なると思う)

投稿2018/10/23 11:32

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まず確認。ペリフェラル機器ということなので、たぶんこの「レジスタ」ですよね。

レジスタ (コンピュータ) - Wikipedia

(項目にリンクを貼ったので飛んで確認してください)


まあ、レジスタそのものは基本的にはフリップフロップというかSRAMでしょう。要するにCPUに内蔵されたメモリみたいなもの(ただし主記憶ではない)。

ソフトから使うために適当なアドレス空間に割り当てておく訳ですが。

そこに値を書き込むと、たとえば入出力切り替えなら、レジスタに保持されている値に従ってマルチプレクサなり何なりを制御する……というイメージで良いんじゃないでしょうか。

投稿2018/10/22 14:45

編集2018/10/22 14:47
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

karino_nao

2018/10/22 15:12

レジスタの種類が多くて驚きますorz ただ私が気にしていたレジスタは、ペリフェラルデバイスのレジスタのようです。 ペリフェラルデバイスのレジスタの場合、電子回路よりの知識が必要と理解したのですがあっているのでしょうか? (アドレス空間はマルチプレクサは、電子回路より…?と思ったもので)
hayataka2049

2018/10/22 15:20

「ブラックボックスとして使う」のであれば知識はいりません。データシート通りに使ってください。 理解したいのであれば、電子回路というか論理回路系の知識が要ると思います(知識があれば理解できるような、適当な規模で中身が公開されているようなものがあるかはまた別)。
karino_nao

2018/10/23 14:27

できれば理解したいというのが本音ですが、 そこまで手が回るかは…orz 論理回路系の知識がざっくりわかればよいのですが…。 もう少し暇を見つけて勉強してみます。
guest

0

レジスタとは演算制御装置の1つであって、演算制御を行うために使用される記憶保持の総称、と理解していました。

それで問題ありません。

レジスタを設定することで入出力ピンが特定・設定できる、がどうしてできるのか、と考えたとき、わからなくなりました。

単に、「特定のレジスタにある値を書き込めば、特定の動作をする」というように作ってある、というだけの話です。何が疑問なのか逆にわかりません。

(メモリの中にどの入出力ピンかわかる対応表みたいのがあれば別かもしれませんが…確証が持てず)

データシートを見れば、レジスタの昨日についても明記してあるはずです。

投稿2018/10/22 14:12

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

karino_nao

2018/10/22 14:31

>単に、「特定のレジスタにある値を書き込めば、特定の動作をする」というように作ってある、というだけの話です。何が疑問なのか逆にわかりません。 特定のレジスタに値を書き込んでから、実際に特定の動作をするまでの「流れ」が頭の中でイメージできていないので、疑問に感じています。 概要はわかっても、じゃあ実際どうなの?と言われたら答えられないです…。
maisumakun

2018/10/22 14:46

自分でチップから作るのでなければ、「チップがそう設計してあるから」で考えを止めちゃったほうがいいと思います。
maisumakun

2018/10/22 14:48

データシートにフロー図などが付いている例もあるので、そういうのを参考にしてもいいかもしれません。
karino_nao

2018/10/22 15:10

勉強している段階なので自分でチップを作るということはないです。 でも、やれると面白そうですね。 フロー図を読むと頭の中に入ってこないのですが…もう少し頑張って読み込んでみます。
guest

0

ものすごく雑に電子回路的にどうなっているか説明すると

レジスタも当然電気信号で動いています。
レジスタが値を記憶しているというのは、レジスタの出力が(過去の入力によって)HレベルかLレベルになっているということです。
(Dフリップフロップがわかるならそれと思って構いません。)

なので、そのレジスタの出力を外部ピンに繋げばレジスタの値を外部に電圧として出力できます。

投稿2018/10/22 23:42

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

OSの設定を格納しているデータベースです
それ以上でもそれ以下でもありません。

それが必要と思えるならそれを使うだけです。

投稿2018/10/22 14:01

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

karino_nao

2018/10/22 14:06

DBだとシステムカタログ(システムテーブル)といった ユーザーが作ったテーブルとは別に DBそのものの状態を参照したり変更したりするテーブル群があると思います。 レジスタとは OSでのシステムカタログ(システムテーブル)と考えていいのでしょうか?
hayataka2049

2018/10/22 14:45 編集

それはレジストリですっ。この質問はフリップフロップとかSRAMなんかのほうかと
karino_nao

2018/10/22 14:35 編集

フリップフロップとは、電子回路で使われる、0か1の値(電圧?)を保持する回路、という認識です。 …レジストリもレジスタも、よくわからないので恐縮ですが、 回路的にいうならフリップフロップが近い…? というか、レジストリもレジスタも名前が似ていて紛らわしいorz
rubato6809

2018/10/22 14:59

フリップフロップは記憶回路の一種、それで結構です。 レジストリ(registry)もレジスタ(register)も、元は同じ言葉なんでしょうね。登録とか登記とか、元の意味はそんなこと。そこから記録、記憶といったことにも使われるんでしょう、きっと。名前が似ているのはあたりまえ。
karino_nao

2018/10/22 15:08

眠くて申し訳ない…。 似たような名前で似たような動作だけど別物とか…。 たまに本を投げ出したくなります。 そんなものと思ったほうがよさそうですね…。
y_waiwai

2018/10/22 15:50 編集

レジストリじゃなくてレジスタ、というのであれば、CPUがつかうワーク用の記憶域のことですねー
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問