組み込み系C言語の学習法

このQ&Aのポイント
  • 組み込み系C言語の学習法について、経験のない方にアドバイスをお願いします。
  • 組み込みソフトを長年経験してきたが、C言語の知識が足りない部分があります。
  • 特にポインタや構造体や配列についてアセンブラとの関係について知りたいです。
回答を見る
  • ベストアンサー

組み込み系C言語の学習法

私は組み込みソフトを8年やってきました。 規模としては、白物家電をイメージしてもらうと良いです。 但し、電子レンジなど表示機能がない製品が近いかもしれません。 近いものでは、洗濯機や冷蔵庫といった感じでしょうか。 マイコンは、旧三菱の740ファミリのM38000系です。 ただソフト経験(アセンブラ)はあるものの、C言語の経験は皆無なのです。 ただし、if-else, switch-case, for, while, break, continue は充分理解できます。 何故かというと、旧三菱系のマイコンには構造化アセンブラと言って、 C言語もどきの記述ができるのです。上記文のみ特別に設けられていたのです。 それを使ってソフトを作っていたので上記分は理解できるのです。 しかし、ややこしいのがポインタや構造体や共有体や配列です。 同じことをアセンブラでもやっているはずなのです。 ポインタや構造体や共有体をアセンブラで書くとどうなるかが知りたいのです。 ここの部分が書いてある書籍がないのです。 例えば、ポインタや配列は、旧三菱系で言うとXレジスタやYレジスタを 使って行っていた作業と似てるのかなと推測できます。 同じ境遇の方で克服された方がいらっしゃいましたらアドバイスをお願いします。 また、アマゾンで下記の本を見つけました。 参考になるのでしょうか? よろしくお願いします。  ""組込み現場の「C」プログラミング基礎からわかる徹底入門""

noname#175419
noname#175419

質問者が選んだベストアンサー

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.17

質問者さんはCに関しては初心者なので、本当は経験に基づいたありがたい知識なのかもしれませんよ。 早急に結論を出さずに、理解に努めてみたらどうでしょうか? こちらに書いてあるようなことを「確かにね」と思えるようになるまでがんばってみてください。 「プログラミングの禁じ手Web版 C言語編(InternetArchiveよりサルベージ) - Akio’s Log」 http://d.hatena.ne.jp/elwoodblues/20090206/1233878763 「Cプログラミング診断室」 http://www.pro.or.jp/~fuji/mybooks/cdiag/index.html#mokuji ちなみにアセンブラでも個性はありますし、嫌な書き方もさんざん見て来ました。テクニックに走りすぎでレジスタを訳分からん使い方しているのも見ました。 逆に綺麗なコードもあります。そういうのはアリゴリズムの選択やらレジスタの使い方がエレガントなんです。 アセンブラで、ちゃんとモジュールの構造化しているとかでも差がでますからね。

その他の回答 (16)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.16

Visarさん、wormholeさん、その等号条件の定数問題は平行線を辿るのでこの位で良いのではないでしょうか? 好き嫌いのレベルだと思います。

noname#175419
質問者

補足

確かに、"好き嫌い"は、個人の性格ですよね。 私が言いたいのがこれなんですよ。 他人の書いたコードを見て、「スマートじゃない」とか 「私だったらこうするとあーするとか」 ゴチャゴチャ言うのです。 正直、付き合いきれないのです。 アセンブラの場合は、書き方に自由度が無いため、 個人の性格は反映されにくいので、職場は円満でした。 今の職場は数名いますが、性格が2つに分かれます。 凝性な人とそうでない人です。 私は後者です。 凝性な人は、職人さん気質なので妥協しないのです。 C言語の話が職場の話になってしまいましたね。すいません。

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.15

>比較演算子で定数を左にもってくるコーディングは、理由があってしています。 (以下略) その理由は知っています。 ですが左辺、右辺両方とも変数だったらどうするんですかね。 片方が定数の時はコンパイラがエラーにしてくれるかもしれませんが、共に変数だった場合には役に立ちません。 そんな事なら「常に比較演算子を使うようなときには気をつける」そういう癖をつける方がよっぽどいいと私は思います。

  • Visar
  • ベストアンサー率19% (17/87)
回答No.14

こんばんは。 >比較演算子で定数を左にもってくるコーディングを推進してるのや >NULLと0を混同してるようなのはうんざりしますけど読めないわけじゃないですし。 NULLと0の混同は問題外ですが、 比較演算子で定数を左にもってくるコーディングは、理由があってしています。 '80年代前半のCコンパイラはとっても賢くて、 '=='と'='を打ち間違えても、ワーニングとか出してくれませんでした。 例 if( a == 0 ) {  なんたら } を if( a = 0 ) {  なんたら } とかした場合です。 しかし、定数を左辺に持っていくコーディングをすると、 '=='と'='を打ち間違えたら if( 0 = a ) {  なんたら } いくら超賢い'80年代のCコンパイラでも、さすがに 0にaは代入できないのでコンパイルエラーとなります。 化石プログラマーの転ばぬ先の杖的な発想です。 P.S. もうひとつ、理由があって、当時のディスプレーは、 80桁×25桁の表示能力しか無くて、比較演算子の定数を右側に書くと、 ソースを縦スクロールして眺めるときに、ソースが横に長すぎると、 演算子の定数を見るのに横スクロールも必要になるので面倒で 見づらいからです。 過去の遺物かな。 失礼しました。

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.13

>やたらとdefineで文字化してるし、型の取り方が自分と違うし正直まいってます。 「やたらdefine」というのは文字列化ではなく定数化かと。 数値に名前を付けることで可読性を上げるのと数値の変更に柔軟に対応できるようにしてるんだと思います。 数値を直接ソース上に書いた場合、その数値の意味はコメントに書かなければわかりませんし、その数値が多数の箇所で使われているような場合、その数値を探し出して変更していかなければなりません。また同値で意味が異なるものがあるような場合はさらに面倒なことになります。 アセンブラでもシンボルに値を設定するとかすることあると思いますけど使ったことありませんか?

noname#175419
質問者

補足

使ったことはあります。 多数の箇所で使われているような場合は納得できるし、 後で数値が変更になる場所とかね。 人によって、一箇所の場所でも定数化(名前化)するのです。 それもあまり変更するような個所でも。 だからソフトって人の性格なんですよね。 上手い下手というより個性だと私は思うのです。 気が合う人とは友達や恋人になりますが、 そうでない人とはそうはなりません。 みなさんはどう思われますか?

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.12

>この辺はみなさんどのように感じて仕事されてますか? 職場ではコーディングスタイルの統一などあってますが私自身はよほど変な書き方でも無い限り別段気になりません。 比較演算子で定数を左にもってくるコーディングを推進してるのやNULLと0を混同してるようなのはうんざりしますけど読めないわけじゃないですし。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.11

>私は質問にも書きましたが、アセンブラ(構造化アセンブラ)経験者です。 >要するに、凝りに凝ったC言語風の書き方は出来ないです。 >アセンブラ風のC言語みたいな感じです。 時代の流れとしてC言語が必要になったのであれば受け入れるしか無いでしょうね。 組み込み現場によってはC++やJavaが使われている所もありますので、いきなりオブジェクト指向言語に成らないだけでも高級アセンブラと呼ばれるC言語でよかったな思うべきでしょう。 書き方に関しては共同作業を前提として統一コーディング・スタイルを決めるている職場は結構あります。作業に支障がありますから。 ただ、個別作業の多い現場では各人が個性的に書いている所もあるってのが現状で、そういう職場なのだと思います。 慣れてくれば大抵は読めるようになりますが、それでも読みたくないコードはあります。今の状態が嫌ならコーディング・スタイルの統一を働きかけてみたら良いでしょう。

  • Visar
  • ベストアンサー率19% (17/87)
回答No.10

こんにちは。 >例えば、サーミスタで温度を測定し、ファンモータの速度を可変するとかです。 >もっと具体的言うと、サーミスタからの入力電圧をAD変換して、 >その値を"AD値対温度の表"から温度に変換し、 >DAポートからアナログ出力してファンモータの速度指令電圧を可変する。こういう例題を望んでいるのです。 そのなので良いのなら、工業高校生が部活でやってますよ。 ルネサス主催のMCR、「マイコン・カー・ラリー」のサイトの 技術情報ダウンロードサイトが参考になるのではありませんか。 ※MCR:何とか・コントロール・◎◎◎ウェアてな感じじゃないです。 彼らは、H8マイコン(H8/3048F-ONE、H8/3687F)やR8Cマイコンで AD/DA、EEPROM、PWM、UART、SPIやエンコーダを使いこなしてますよ。

参考URL:
http://www.mcr.gr.jp/tech/download/main01.html
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.9

あっ書き忘れました。 残念ながらM38000(MELPS740)の日本語の書籍は私は一度も見た事はありませんので、他のもっとアマチュアにも知名度があるマイコンを学習用には選択すべきだと思います。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.8

完全に無視されている気もしますが私の書いた 「Amazon.co.jp: C言語による H8マイコン プログラミング入門: 横山 直隆: 本」 http://www.amazon.co.jp/dp/4774118036 ではダメなのでしょうか? ダメな理由をお聞かせください。 旧日立系という条件はクリアしていると思いますが、これがダメなら具体的にOKなマイコン名を羅列して頂かないと的確に答えられる人は少ないと思います。

noname#175419
質問者

補足

返事遅くなってすいません。 ネット上では全部の中身は見れないですが、駄目ではないです。 また、ルネサスのセミナーのテキストもあるので、合わせてみてみるのもいいかもしれません。 話が反れるかもしれませんが、もうひとつ相談に乗ってもらえませんか? 私は質問にも書きましたが、アセンブラ(構造化アセンブラ)経験者です。 要するに、凝りに凝ったC言語風の書き方は出来ないです。 アセンブラ風のC言語みたいな感じです。 もちろん関数の引数や返し値は使います。 C言語って個人の性格が反映されがちで個性がでます。 性格が似た人同士ならソフトを見ても理解できますが、 性格が違う人のを見るとうんざりします。 やたらとdefineで文字化してるし、型の取り方が自分と違うし 正直まいってます。 この辺はみなさんどのように感じて仕事されてますか? 宜しくお願いします

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.7

>例えば、サーミスタで温度を測定し、ファンモータの速度を可変するとかです。 >もっと具体的言うと、サーミスタからの入力電圧をAD変換して、 >その値を"AD値対温度の表"から温度に変換し、 >DAポートからアナログ出力してファンモータの速度指令電圧を可変する。こういう例題を望んでいるのです。 さすがにピンポイント過ぎますし限定されたハードウェアでの話になりそうなのでC入門書としてはないと思います。出版しても売れないでしょうし・・・ でもそういうのをアセンブラで組める方ならアセンブラでひとまず書いて人力で逆コンパイルしてCソースにするとかできそうな気がしますけど。

関連するQ&A

  • 組込みでのC言語勉強法

    はじめまして。 最近、組込みのC言語を勉強しています。 処理速度の面や、可読性の良いプログラム、効率のよいプログラムを書けるようになりたいと思っています。 引数の数はレジスタで処理できる範囲におさめる事や、 構造体を使用するときにはポインタで渡すなど、 コードを書く際に気をつけるポイントがまとまってる書籍やHPなどを知りませんか? もしくは参考にすべき、サンプルコードなど知っていましたら、情報をいただけるとありがたいです。 よろしくお願いします。

  • C言語のGOTO文(組み込み系)

    私は組み込みでソフト開発を行っているものです。 (アセンブラでの経験は長いが、Cは短い) 基本的な質問になってしまいますがご了承ください。 C言語で"goto文は使うな、スパゲティプログラムになりやすい。 使うなら多重ループからの脱出のみ" ということを良く聞きます。 本当ににそうでしょうか?・・・ 例えば、下記サイトの図6をC言語で書いてみました。 もちろんgotoを使いました。 gotoを使わないで、誰でもわかりやすく書くことなどできるのでしょうか? よろしくお願いします。 http://techon.nikkeibp.co.jp/article/NEWS/20071119/142670/?ST=lsi&P=2 /* 開始 */ KAISHI: p74 = High; if(p70 == High){ register = 1; } if(p71 == High){ register = register + 1; if(register != 1){ goto KAISHI; } if(p72 == High){

  • C、C++、Peal、PHPその他「高級言語」といわれる言語について

    僕はPICマイコン(16シリーズ)を趣味で使っており 言語はアセンブラを使っています。 で、質問なんですが最近ホームページを作りたくなり LINUXの勉強も含め自宅サーバーを立ち上げCGIをやってみようと思いました。 で、CGIといえばPealだろと思っていたので、その手の入門書や ネットの情報を見ると冒頭には大抵「大して難しくない」的な事が 書いてありました。 実際にやってみたんですがチンプンカンプンでした。 イメージとしては下記のような感じなんだと思うんですが マイコンのアセンブラと比べたらよっぽど低級言語な気がしてなりません。 アセンブラ=低級言語=人間にわかり難い C、C++等=高級言語=人間に解り易い アセンブラもはじめはチンプンカンプンでしたが、ある程度理解してしまえばそれなりに使いこなせるようになりました。 マイコンのアセンブラは命令数も少ないしイエスかノーだけで「もしも~」とかないので単純といえば単純なんですが・・・ 質問1 高級言語の「人間に判りやすい」っていうのは具体的にどういうことなんでしょうか? 質問2 最近やたらとPHPが流行ってる気がします。 もうPealは廃れてしまったんでしょうか?

    • ベストアンサー
    • Perl
  • C言語が学びやすいおススメの問題集を教えてください。

    C言語を問題を解きながら実践形式で覚えたいと思っています。 今の僕のレベルは、基本的な参考書を1冊読んだ程度で、 基本的な部分や簡単な配列などがどうにかできるくらい。ポインタや構造体などは一応読みましたが きちんと理解して使いこなせるかは疑問・・・といった程度です。 自分で探して目をつけた本としては、柴田望洋の「解きながら学ぶC言語」があります。 この本はどうでしょうか? その他におススメの本はないでしょうか? ぜひ教えてください。

  • C言語

    今、独学でC言語を勉強しているんですが。 大きく、 条件処理、繰り返し処理、配列、関数、2次元配列、文字列、構造体、ファイル処理、乱数、検索、バブル・ソート、ポインタ まではやったんですが(参考書で勉強)。 その次になにを勉強したらよく分からないので、 何を勉強するべきか教えてください。 将来的にこれっと言った作りたいものは決めていません。 お願いします。

  • C言語 よく使うのは?

    C言語の参考書で、例えば1章~8章まであるとすると、 1章~前半くらいは、printfや変数や、演算など出てきると思うんですが、後半にかけて、配列やポインタや関数など出てくると思います。 実際に仕事で、よく使うのを挙げるとどんなのですか?(例えば、ポインタはよく使うや配列もよく使うや) もちろん、変数や演算などが出来ないと条件分岐や配列もポインタも何も出来ないと思うんですが、 上手く言えないんですが、for文はよく使うから、ちゃんと理解していないとダメとか、仕事ではポインタがしょっちゅう使うとか、ありますか? 本屋さんで見ると、ポインタ専用の本や、関数専用の本があるので、よく使うのかなと思いました。 それか、難しく理解が難しいから、より詳しく書かれているんでしょうか? 上手く説明が出来ていないですが、よろしくお願いします。

  • C言語でプログラムを作りたい

    現在、C言語を学習中でして、入出力・制御文・配列・演算子・ポインタ・自作関数・構造体・共用体・ファイル入出力くらいはなんとか使えるくらいになったと思うのですが、そこで、一つ自分でプログラムを作ってみたいと考えています。 しかしながら、これまで学習してきたことを駆使して作れるプログラムが思いつきません。 ですので、なにかいいお題があれば教えていただきたいです。 これまで学習してきたことをしっかりと定着させたいと考えています。 宜しくお願いします。

  • [C言語]変数のアドレスを直接指定する構文

    C言語でのマイコン開発環境に付属しているヘッダーファイルにはレジスタを共用体と構造体でアクセスできるようにしてあります。 アドレスを割り付ける部分の記述は一行ですが、意味を考えた時に構文が複雑すぎて躓いてしまいました。 #define PD (*(volatile struct st_pd *)0xFFFF83A0) /* PD Address*/ 後ろの"*"はst_pdのポインタ型だとして前の"*"はどういう効果になっているのでしょうか? また、複数行に分解して同じ効果を書くこと(例えば変数unsigned long valにアドレス0xFFFF83A0を割り付け)は出来るのでしょうか? 理解を助けるためにお願いします。

  • 組み込みプログラマ

    制御系(マイコン)のプログラマに就職が決まった大学生です。 現在、アセンブラの勉強をしています。 今まで、Z80、PICの経験があります。 しかし、C言語で組み込み系のプログラムを書いたことはありません。 そこで、実際に組み込み系で働いておられる方に質問があります。 1.現在のマイコンではC言語が主流ですか? 2.アセンブラだけでは食っていけませんか? 3.組み込み系は寿命が長いと聞いたことがあるのですが、   本当でしょうか?

  • C言語でゲーム

    今、独学でC言語を勉強しているんですが。 大きく、 条件処理、繰り返し処理、配列、関数、2次元配列、文字列、構造体、ファイル処理、乱数、検索、バブル・ソート、ポインタ を勉強したんですが。 もしも、ゲームを作るとしたら・・ もし、ボンバーマンみたいなのを作るとなるとどういう勉強をすればいいんでしょうか? もうひとつはHALOみたいなxbox関係などはどの様な勉強をすればいいんでしょうか? 質問が多いですが、よろしくお願いします。

専門家に質問してみよう