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

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

ただいまの
回答率

88.61%

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

受付中

回答 7

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 3,674

karino_nao

score 15

 前提・実現したいこと

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 7

+3

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

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

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

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

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

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

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

以下、追記します。

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

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

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

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

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/23 23:28 編集

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

    キャンセル

  • 2018/10/23 23:40

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

    キャンセル

  • 2018/10/23 23:55

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

    キャンセル

+2

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

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

volatile unsigned int *sensorControlRegister = (unsigned int *)SENSOR_REG1;
volatile unsigned int *sensorValueRegister = (unsigned int *)SENSOR_REG2;
unsigned int sensorValue = 0;

*sensorControlRegister = 0x0001;       /* センサ起動 */
delaty(100);                           /* ディレイ */
sensorValue  = *sensorValueRegister;   /* センサ値をリード */

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

それで問題ありません。

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/22 23:31

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

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

    キャンセル

  • 2018/10/22 23:46

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

    キャンセル

  • 2018/10/22 23:48

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

    キャンセル

  • 2018/10/23 00:10

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

    キャンセル

+1

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

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

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


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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/23 00:12

    レジスタの種類が多くて驚きますorz

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

    キャンセル

  • 2018/10/23 00:20

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

    キャンセル

  • 2018/10/23 23:27

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

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-8

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/22 23:59

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

    キャンセル

  • 2018/10/23 00:08

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

    キャンセル

  • 2018/10/23 00:48 編集

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

    キャンセル

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

  • ただいまの回答率 88.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る