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

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

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

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

解決済

2回答

869閲覧

構造体のメンバに数値の代入ができない

taga

総合スコア8

C

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

0クリップ

投稿2020/07/05 06:30

編集2020/07/05 06:56

構造体のメンバに数値を代入しようしたのですが、
エラー(Invalid memory reference)が出てしまします。
なぜでしょうか?

c言語

1#include <iostream> 2#include <stdint.h> 3 4using namespace std; 5 int main(void){ 6 // Your code here! 7 #define __IO volatile /*!< Defines 'read / write' permissions */ 8 9 typedef struct 10 { 11 __IO uint32_t CR ; /*!< RCC clock control register, Address offset: 0x00 */ 12 __IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x04 */ 13 __IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x08 */ 14 __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x0C */ 15 __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x10 */ 16 __IO uint32_t AHBENR; /*!< RCC AHB peripheral clock register, Address offset: 0x14 */ 17 __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x18 */ 18 __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x1C */ 19 __IO uint32_t BDCR; /*!< RCC Backup domain control register, Address offset: 0x20 */ 20 __IO uint32_t CSR; /*!< RCC clock control & status register, Address offset: 0x24 */ 21 __IO uint32_t AHBRSTR; /*!< RCC AHB peripheral reset register, Address offset: 0x28 */ 22 __IO uint32_t CFGR2; /*!< RCC clock configuration register 2, Address offset: 0x2C */ 23 __IO uint32_t CFGR3; /*!< RCC clock configuration register 3, Address offset: 0x30 */ 24 __IO uint32_t CR2; /*!< RCC clock control register 2, Address offset: 0x34 */ 25 } RCC_TypeDef; 26 27 #define PI (uint32_t)0x40000000 28 #define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */ 29 #define AHBPERIPH_BASE (PERIPH_BASE + 0x00020000) 30 #define RCC_BASE (AHBPERIPH_BASE + 0x00001000) 31 32 #define RCC ((RCC_TypeDef *) RCC_BASE) 33 34 RCC->CR = (uint32_t)0x0C; <--エラー発生(Invalid memory reference) 35}

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

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

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

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

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

y_waiwai

2020/07/05 06:35

このままではコードが読めません。質問を編集し、<code>ボタンを押し、出てきた’’’の枠の中にコードを貼り付けてください
taga

2020/07/05 06:38

承知いたしました。ご指摘いただきありがとうございます。
Daregada

2020/07/05 07:05

C言語でプログラムを書いているマシンのOSと実行対象となる機器、実行したそのはそのマシンそのものなのか実行対象となる機器なのか、あたりを補足してください。
SHOMI

2020/07/05 07:09

PCではなく、stm32の実機で実行していますか?
taga

2020/07/05 07:21

OSはWindows、実行環境としてはマイコンに書き込むのではなく、コードのテスト用としてPCのブラウザで行っております。
SHOMI

2020/07/05 07:25

ブラウザで実行とはpaiza.ioやwandboxのようなサイトですか?であれば動くわけがないですが…
taga

2020/07/05 07:29

そうですpaiza.ioを使用していました。 そうでしたか、コードの勉強で挙動を一つずつ確認していたのですが...
Daregada

2020/07/05 07:38 編集

ええと、実機ならともかく、いまどきのPCでは直接メモリアドレスを指定して中身を書き替えるようなプログラムは動作しません。実際にアクセスして書き替える代わりに画面にアドレスや書き替える値を表示するとかなら動きますけどね。
taga

2020/07/05 08:01

そうでしたか。メモリアドレス周りの知識がなかったので、勉強になりました。 お教えいただきありがとうございます。
guest

回答2

0

ベストアンサー

paiza.ioを使用していました。

STM32以外の環境で割り当てられていないアドレス0x40021000に勝手に書き込もうとしたらSIGSEGVになるでしょう。
STM32のメモリマップドレジスタを操作するプログラムをSTM32以外の環境で動かそうとしても意味がありません。
どうしても別環境で実行してみたいならRCC_TypeDef型のグローバル変数で確保しておき、RCCはその変数へのポインタとする等しておきましょう。
当然、メモリマップドレジスタとしては動作しませんが…

C

1#include <stdint.h> 2#define __IO volatile /*!< Defines 'read / write' permissions */ 3 4typedef struct 5 { 6 __IO uint32_t CR ; /*!< RCC clock control register, Address offset: 0x00 */ 7 __IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x04 */ 8 __IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x08 */ 9 __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x0C */ 10 __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x10 */ 11 __IO uint32_t AHBENR; /*!< RCC AHB peripheral clock register, Address offset: 0x14 */ 12 __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x18 */ 13 __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x1C */ 14 __IO uint32_t BDCR; /*!< RCC Backup domain control register, Address offset: 0x20 */ 15 __IO uint32_t CSR; /*!< RCC clock control & status register, Address offset: 0x24 */ 16 __IO uint32_t AHBRSTR; /*!< RCC AHB peripheral reset register, Address offset: 0x28 */ 17 __IO uint32_t CFGR2; /*!< RCC clock configuration register 2, Address offset: 0x2C */ 18 __IO uint32_t CFGR3; /*!< RCC clock configuration register 3, Address offset: 0x30 */ 19 __IO uint32_t CR2; /*!< RCC clock control register 2, Address offset: 0x34 */ 20 } RCC_TypeDef; 21 22RCC_TypeDef gRCC; 23#define RCC (&gRCC) 24 25int main() 26{ 27 RCC->CR = 0x0C; 28}

投稿2020/07/05 07:45

編集2020/07/05 08:36
SHOMI

総合スコア4079

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

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

taga

2020/07/05 08:02

コードを提示していただきありがとうございます。 質問なのですが、 PC上で割り当てられていないアドレス0x40021000を RCC_TypeDefに割り当てて、出力してもエラーが出ないのはなぜでしょうか? アドレスの割り当てはできるが、中に書き込みはできないという意味なのでしょうか?? #define RCC ((RCC_TypeDef *) RCC_BASE) cout <<RCC; //0x40021000
SHOMI

2020/07/05 08:17 編集

そのコードは0x40021000というポインタ値を表示しているだけで、そのポインタが指す先の領域にはアクセスしていません。 読み出しであってもアクセスすればエラーになります。 #define RCC ((RCC_TypeDef *) RCC_BASE) cout << RCC->CR << endl;
taga

2020/07/05 08:21

ご丁寧に説明していただきありがとうございます、理解いたしました。 ポインタについてもう一度復習してみたいと思います。
guest

0

コードの先頭に、
#include <stdint.h>
いれてみる

投稿2020/07/05 06:42

y_waiwai

総合スコア88042

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

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

taga

2020/07/05 06:55

回答頂きありがとうございます。 アドバイスの通りコードを修正しましたが、変化はありませんでした。
y_waiwai

2020/07/05 07:05

その対象のマイコンのコンパイラでビルドして、その対象のマイコンで実行させてますか? アドレスを決め打ちでやってるコードなんで、対象のマイコン以外では、実行時エラーが、当然のことながら出ます
taga

2020/07/05 07:21

コードのテストとしてPCのブラウザ上で実行しておりました。 アドレスの決め打ちというのはどういうことでしょうか??
SHOMI

2020/07/05 07:30 編集

前回質問でもあった #define RCC ((RCC_TypeDef *) RCC_BASE) ですよ。 STM32以外の環境で割り当てられていないアドレス0x40021000に勝手に書き込もうとしたらSIGSEGVになるでしょう。
y_waiwai

2020/07/05 07:33

そのマイコン専用のコードとなるので、そいつ以外では実行できません。
taga

2020/07/05 08:02

SHOMIさん、y_waiwaiさん、 お教え頂きありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問