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

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

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

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

2684閲覧

C言語の組み込みプログラムについて

silas10p

総合スコア13

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/09/07 05:57

編集2016/09/07 12:12

C言語の組み込みプログラムについて質問があります。
解析しているプログラムで下記の様な記述がありました。ここで
st_m->u1_ol_signal = st_m->u1_v_pattern_ol[st_m->u1_direction][st_m->u1_v_pattern_num];
の記述が何をやっているのか良く分かりません。これは配列なのでしょうか?
御教授お願いします。

typedef struct
{
volatile unsigned char u1_v_pattern_num; /* selecting pattern number for openloop drive /
volatile unsigned char u1_direction; /
rotational direction (0:CW ,1:CCW) /
volatile unsigned char u1_v_pattern_ol[2][7]; /
array of voltage pattern for openloop drive /
volatile unsigned char u1_ol_signal; /
pattern of BEMF */ ・


} MTR_ST_LESS_120;

MTR_ST_LESS_120 st_g;

void mtr_ol_signal_set(MTR_ST_LESS_120 *st_m)
{
st_m->u1_v_pattern_num++;
if (st_m->u1_v_pattern_num > 6)

{ st_m->u1_v_pattern_num = 1; } st_m->u1_ol_signal = st_m->u1_v_pattern_ol[st_m->u1_direction][st_m->u1_v_pattern_num];

}

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

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

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

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

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

k1000

2016/09/07 10:04

たぶんこちら https://teratail.com/questions/47115 で質問したいことが書かれているのでしょうけど、どうしたものですかね。リンクを貼って「この方法で解決した」にするのが妥当でしょうか。
guest

回答3

0

ベストアンサー

この構造体にはvolatileが付いていますが、どういった値を最適化から防ぐ目的があるのでしょうか?

たとえば:

int value; for (;;) { /* 無限ループ */ if ( value != 0 ) break; /* value が0でなくなったら脱出する */ sleep(100); /* 100ms ベタ待ち */ }

なんてのがあって、ここでvalueはハードウェア割り込みかなんかで(実行中に)コロコロ変化するとしましょう。

このときコンパイラは「このvalueはloop内で書き換えられていないから一回だけ読めばえぇやろ」ってな最適化を行うことがあります。そんな最適化されちゃうとloopから抜けらんなくなる。

なんてとき volatile int value としておけば、最適化せずに毎回律儀にvalueの値を読んでくれます。

投稿2016/09/08 07:02

episteme

総合スコア16614

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

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

silas10p

2016/09/10 12:42

大変分かり易く教えて頂き有難うございました。
guest

0

質問の意図ですが、C言語の配列、構造体、構造体のポインタの使い方が分からないという事なのでしょうか?
それとも、volatile 宣言しているので、あるデバイスへの操作が分からないという事なのでしょうか?

なんとなく、後者である様な気がします。

さらに、コメントを読む限り、モータ制御のフェードバックに関する部分と見受けれらますが、

投稿2016/09/07 14:56

ShinyaAnan

総合スコア241

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

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

silas10p

2016/09/08 06:36

早速に御回答頂きありがとう御座います。この構造体にはvolatileが付いていますが、どういった値を最適化から防ぐ目的があるのでしょうか?御教授お願いします。
ShinyaAnan

2016/09/08 12:30

ターゲットの詳細が分からないので、想像でしかないのですが、 おそらく、サーボモータのフェードバック制御を行っている部分だと思います。 そのフェードバック制御をモータのコントロールIC等ので行っている場合、 そのコントロールICのレジスタを構造体で書く場合は、volatile宣言する事で、 ソフトからの命令を正確に伝える事が出来ます。 というか、volatileとしておかないと、該当レジスタへの書きこみが、 最適化され、無くなってしまう可能性があります。 もう一つの可能性としては、既にepistemeさんが書いている様に、割り込み処理や、 他のタスク等で書き換えが行われている場合に、その内容が正確に反映されるように するために、volatile宣言しているのかもしれません。
silas10p

2016/09/10 12:41

ご解答頂き有難うございました。
guest

0

内容を書きましょう。

投稿2016/09/07 06:13

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ttyp03

2016/09/07 06:54

他の質問にも見られるのですが、実質的な回答でないなら、「情報の追加・修正の依頼をする」に書くべきです。 点数稼ぎと思われても仕方ないですよ。
退会済みユーザー

退会済みユーザー

2016/09/07 07:08

こういった系統の質問の場合、こちらに書いたほうが見るかなと思ってこちらに書いていたのですが、そういう風に捉えられる可能性は考えていませんでした…。 今後は修正依頼の方に書くようにします。
silas10p

2016/09/07 12:14

御迷惑を掛けています。投稿した時に本文が何故か反映されませんでした。質問自体を削除したいのですが、やり方が分かりません。御教授頂ければ幸いです。宜しくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問