<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>組み込み</title><link>http://blogs.wankuma.com/andochin/category/756.aspx</link><description>組み込み系の与太話</description><managingEditor>あんどちん</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>あんどちん</dc:creator><title>わんくま名古屋#3アンケート結果</title><link>http://blogs.wankuma.com/andochin/archive/2008/08/01/151460.aspx</link><pubDate>Fri, 01 Aug 2008 21:36:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2008/08/01/151460.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/151460.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2008/08/01/151460.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/151460.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/151460.aspx</trackback:ping><description>&lt;p&gt;&lt;em&gt;Q1.セッションの内容は期待通りでしたか&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 166.7&lt;br&gt;Q2.セッションの内容は理解できましたか&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 88.9&lt;br&gt;Q3.このセッションを知り合いなどに伝えたいと思いますか&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 122.2&lt;br&gt;組み込みはなじみがないので理解しづらかった。&lt;br&gt;C++のサイズでテンプレが来るかと思いましたが、ウマイなーと思いました。&lt;br&gt;堪能しました。&lt;br&gt;組み込みへのC++活用の説得材料にしたいと思います。&lt;br&gt;全体的には雰囲気として面白いと思います。&lt;br&gt;C++使いには、非常に興味ひかれる内容で楽しめました。&lt;br&gt;早口が聞き取りにくかったです、&lt;br&gt;興味深い組み込みの話でためになりました。&lt;br&gt;ぜんぜん知らない世界の説明を聞くのは楽しいので、またお願いします。&lt;br&gt;とりあえずCASTLE？勉強してみます。&lt;br&gt;画面の文字が小さすぎて、類推することもできませんでした。&lt;br&gt;途中からついていけなくなっちゃいました。ちょっと早口だったので、もう少しゆっくり話して頂けると、全くの素人でもついて行けたかも。きっと１時間でおさまらないくらいのボリュームの内容を話していただけたんだと思いました。ビデオみて勉強します。なんか組み込みってカッコいいかも！！&lt;br&gt;スルーされていたことが色々わからなかった所もありましたが、面白かったです。後半の満面の笑顔が忘れられませんｗ&lt;br&gt;バッサリやりすぎ&lt;br&gt;ZoomItとか拡大鏡の利用を検討しましょう。&lt;br&gt;biacさんのコマにつづいて予想外。&lt;br&gt;ぶった切り感も良かった。&lt;br&gt;サイズ一緒すごい&lt;br&gt;オブジェクト指向とり入れたソースコードでもコンパイル後のサイズがほとんど変わらない件について驚きました。組み込みは未経験ですが覚えておきたいと思います。&lt;/em&gt; &lt;p&gt;&amp;nbsp; &lt;p&gt;色々反省させられる内容になってしまいましたが、スピーカーをやったのはよい経験になりました。&lt;/p&gt; &lt;p&gt;思いの外C++ネタが好評のようで、そっちにフォーカス絞って話をした方がよかったのかもしれませんね。そうすれば仮想関数を使った場合の話なんかも織り込めたし。&lt;/p&gt; &lt;p&gt;C/C++で同じサイズになった理由は&lt;a href="http://blogs.wankuma.com/andochin/archive/2008/07/29/150727.aspx"&gt;ここ&lt;/a&gt;に書いた通りです。今回は簡単な例で出しましたが、応用すればかなり使えるんじゃないかな？と思います。&lt;/p&gt; &lt;p&gt;因みにセッション後Nさんより「emacs使ってる変態」と言われ、T(C)さんからは「こんなキーボード(EeePC)でプログラムを書くなんてオカシイ」と突っ込まれましたw&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/151460.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あんどちん</dc:creator><title>初スピーカーを終えて　～わんくま名古屋勉強会 #3補足～</title><link>http://blogs.wankuma.com/andochin/archive/2008/07/29/150727.aspx</link><pubDate>Tue, 29 Jul 2008 00:54:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2008/07/29/150727.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/150727.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2008/07/29/150727.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/150727.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/150727.aspx</trackback:ping><description>&lt;p&gt;10分で終わるだろうと思っていたセッション内容も予想を反して1時間も喋ってしまい後片付けを急がせる結果になってしまい申し訳なかったです。&lt;/p&gt; &lt;p&gt;中々思う通りにはいきませんね。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;メインセッションで出したプログラムは&lt;a href="http://blogs.wankuma.com/andochin/archive/2008/01/07/116335.aspx"&gt;ここ&lt;/a&gt;と&lt;a href="http://blogs.wankuma.com/andochin/archive/2008/01/09/116510.aspx"&gt;ここ&lt;/a&gt;の内容をもっと簡略化したものです。&lt;/p&gt; &lt;p&gt;ただ、僕個人の意見としては&lt;/p&gt; &lt;p&gt;「CPUがどうやって動くの？&lt;/p&gt; &lt;p&gt;とか&lt;/p&gt; &lt;p&gt;「CPUはこんな命令があるんだ」&lt;/p&gt; &lt;p&gt;ということを知っていれば良くて、必要性が無ければアセンブラを覚える必要は無いと思ってます。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;そして、数名の方からご質問いただいた気持ち的なメインセッション。CとC++で同じサイズのコードが出た部分についての解説です。&lt;/p&gt; &lt;p&gt;以降使用しているコンパイラはgcc3.4.4でコンパイルオプションは-O2 -mh -mint32です。&lt;/p&gt; &lt;p&gt;前述とは裏腹にアセンブラのコードを出していますが、行数が多いってことは出力コードがデカくて遅い程度の認識で良いです。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;最初にCのプログラムです。&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="706" border="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="262"&gt; &lt;p align="center"&gt;C (元のプログラム)&lt;/p&gt;&lt;/td&gt; &lt;td valign="top" width="442"&gt; &lt;p align="center"&gt;アセンブラ&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="260"&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;typedef unsigned char&amp;nbsp;&amp;nbsp;&amp;nbsp; byte;&lt;br&gt;typedef unsigned short&amp;nbsp;&amp;nbsp;&amp;nbsp; word;&lt;br&gt;typedef unsigned long&amp;nbsp;&amp;nbsp;&amp;nbsp; dword; &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;#define PADDR 0xffffd1&lt;br&gt;#define PADR&amp;nbsp; 0xffffd3&lt;br&gt;#define PBDDR 0xffffd4&lt;br&gt;#define PBDR&amp;nbsp; 0xffffd6 &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;int main(void)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte data;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; volatile byte* paddr = (byte*) PADDR;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; volatile byte* padr = (byte*) PADR;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; volatile byte* pbddr = (byte*) PBDDR;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; volatile byte* pbdr = (byte*) PBDR; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *padr = 0x00;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *paddr = 0x00; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pbdr = 0x00;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pbddr = 0x0f; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(1) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pbdr = *padr;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br&gt;} &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign="top" width="442"&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .file&amp;nbsp;&amp;nbsp;&amp;nbsp; "main.c"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .h8300h&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .section .text&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .align 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .global _main&lt;br&gt;_main:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; er6,@-er7&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; er7,er6&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sub.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,r2l &lt;font color="#ff0000"&gt;&lt;strong&gt;// 0を作ってる&lt;/strong&gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@16777171:8 &lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;// *padr = 0x00;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@16777169:8 &lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;// *paddr=0x00;&lt;br&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@16777174:8 &lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;// *pbdr = 0x00;&lt;br&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; #15,r2l&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@16777172:8 &lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;// *pbddr = 0x0f;&lt;br&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;br&gt;.L2: &lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;// while(1) {&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; @16777171:8,r2l&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@16777174:8 &lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;// 上の行と合わせて*pbdr = *padr;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bra&amp;nbsp;&amp;nbsp;&amp;nbsp; .L2 &lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;// } &lt;br&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .end&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ident&amp;nbsp;&amp;nbsp;&amp;nbsp; "GCC: (GNU) 3.4.4"&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;これが元のCのプログラムです。元のソースが短いこともありいいコード出してくれてますね。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;素直にクラス化してみます。DDRは最初に設定したらその後の書き換えはする必要がないので、コンストラクタのパラメータにして、データレジスタへの書き込みは*オペレータをオーバーロードしてクラスオブジェクトがポートであるように扱えるようにしてみます。&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="616" border="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="396"&gt; &lt;p align="center"&gt;C++&lt;/p&gt;&lt;/td&gt; &lt;td valign="top" width="218"&gt; &lt;p align="center"&gt;アセンブラ&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="396"&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;// 型定義とマクロ割愛&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;class pio {&lt;br&gt;private:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; volatile byte* ddr;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; volatile byte* dr;&lt;br&gt;public:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pio(dword ddr_val, dword dr_val, byte dir, byte init = 0) :&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ddr(reinterpret_cast&amp;lt;volatile byte*&amp;gt;(ddr_val)),&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dr(reinterpret_cast&amp;lt;volatile byte*&amp;gt;(dr_val)) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *dr = init;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *ddr = dir;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; volatile byte&amp;amp; operator *() { return *dr; }&lt;br&gt;}; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;int main(void)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pio pa(PADDR, PADR, 0x00);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pio pb(PBDDR, PBDR, 0x0f); &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(1) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pb = *pa;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br&gt;} &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign="top" width="218"&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .file&amp;nbsp;&amp;nbsp;&amp;nbsp; "main.cpp"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .h8300h&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .section .text&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .align 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .global _main&lt;br&gt;_main:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; er6,@-er7&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; er7,er6&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; add.l&amp;nbsp;&amp;nbsp;&amp;nbsp; #-16,er7&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; er6,er0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; subs&amp;nbsp;&amp;nbsp;&amp;nbsp; #4,er0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; subs&amp;nbsp;&amp;nbsp;&amp;nbsp; #4,er0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sub.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r3l,r3l&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; #16777169,er2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; er2,@er0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adds&amp;nbsp;&amp;nbsp;&amp;nbsp; #2,er2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; er2,@(-4,er6)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r3l,@16777171:8&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; @er0,er2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r3l,@er2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; subs&amp;nbsp;&amp;nbsp;&amp;nbsp; #4,er0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; subs&amp;nbsp;&amp;nbsp;&amp;nbsp; #4,er0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; #16777172,er2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; er2,@er0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adds&amp;nbsp;&amp;nbsp;&amp;nbsp; #2,er2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; er2,@(-12,er6)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r3l,@16777174:8&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; @er0,er3&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; #15,r2l&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@er3&lt;br&gt;.L4:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; @(-4,er6),er2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; @er2,r3l&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; @(-12,er6),er2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r3l,@er2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bra&amp;nbsp;&amp;nbsp;&amp;nbsp; .L4&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .end&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ident&amp;nbsp;&amp;nbsp;&amp;nbsp; "GCC: (GNU) 3.4.4"&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;コンストラクタ・オペレータの部分がインライン展開されているところはいいのですが、DR/DDRのアドレスをクラスメンバで持っており、それらのオブジェクトの初期化コード、及びDRのアクセスをする際にクラスメンバであるアドレスを一旦er2に入れてからアクセスしていることで長いコードになっています。&lt;/p&gt; &lt;p&gt;但し、このコードの場合最適化によってはCと同等のコードを出す可能性はあります。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;テンプレートを使ってCと同等なコードを出すように細工してみました。&lt;/p&gt; &lt;p&gt;&lt;font color="#c0c0c0" size="1"&gt;&lt;strong&gt;(中さんから「何回書き直しました？」と聞かれたとき「鋭い！」と思った)&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="859" border="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="511"&gt; &lt;p align="center"&gt;C++&lt;/p&gt;&lt;/td&gt; &lt;td valign="top" width="346"&gt; &lt;p align="center"&gt;アセンブラ&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="511"&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;// 型定義とマクロ割愛&lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;struct input {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; enum { VAL = 0 };&lt;br&gt;}; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;struct output {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; enum { VAL = 1 };&lt;br&gt;}; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;template&amp;lt;dword DDR, dword DR,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; typename d0 = input, typename d1 = input,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; typename d2 = input, typename d3 = input,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; typename d4 = input, typename d5 = input,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; typename d6 = input, typename d7 = input&amp;gt;&lt;br&gt;class pio {&lt;br&gt;private:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; enum { DIR = d7::VAL &amp;lt;&amp;lt; 7 | d6::VAL &amp;lt;&amp;lt; 6 | d5::VAL &amp;lt;&amp;lt; 5 | d4::VAL &amp;lt;&amp;lt; 4 |&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d3::VAL &amp;lt;&amp;lt; 3 | d2::VAL &amp;lt;&amp;lt; 2 | d1::VAL &amp;lt;&amp;lt; 1 | d0::VAL };&lt;br&gt;public:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pio(byte init = 0) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *reinterpret_cast&amp;lt;volatile byte*&amp;gt;(DR)&amp;nbsp; = init;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *reinterpret_cast&amp;lt;volatile byte*&amp;gt;(DDR) = static_cast&amp;lt;byte&amp;gt;(DIR);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; volatile byte&amp;amp; operator *() { return *reinterpret_cast&amp;lt;volatile byte*&amp;gt;(DR); }&lt;br&gt;}; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;int main(void)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pio&amp;lt;PADDR, PADR&amp;gt; pa;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pio&amp;lt;PBDDR, PBDR, output, output, output, output&amp;gt; pb; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(1) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pb = *pa;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br&gt;} &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign="top" width="346"&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .file&amp;nbsp;&amp;nbsp;&amp;nbsp; "main.cpp"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .h8300h&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .section .text&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .align 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .global _main&lt;br&gt;_main:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; er6,@-er7&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; er7,er6&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sub.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,r2l&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@16777171:8&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@16777169:8&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@16777174:8&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; #15,r2l&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@16777172:8&lt;br&gt;.L4:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; @16777171:8,r2l&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@16777174:8&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bra&amp;nbsp;&amp;nbsp;&amp;nbsp; .L4&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .end&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ident&amp;nbsp;&amp;nbsp;&amp;nbsp; "GCC: (GNU) 3.4.4"&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;C++のコードは長くなってしまいましたが、利点はDDR初期設定値をinput/outputという型で指定できるので初期値がわかりやすくなること。&lt;/p&gt; &lt;p&gt;書いていて気付いたんですが、出力ビットのビット位置を指定するようにした方が良かったですね。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;普段C++でtemplateを使っている方なら既に気付かれることと思いますが、見ての通りマクロに毛が生えた程度のコードです。&lt;/p&gt; &lt;p&gt;例えば&lt;/p&gt; &lt;p&gt;*pb=*pa;&lt;/p&gt; &lt;p&gt;の部分は&lt;/p&gt; &lt;p&gt;*reinterpret_cast&amp;lt;volatile byte*&amp;gt;(PBDR) = *reinterpret_cast&amp;lt;volatile byte*&amp;gt;(PADR);&lt;/p&gt; &lt;p&gt;と同じです。&lt;/p&gt; &lt;p&gt;つまり、&lt;/p&gt; &lt;p&gt;*((volatile byte*) PBDR) = *((volatile byte*) PADR);&lt;/p&gt; &lt;p&gt;と同じですね。&lt;/p&gt; &lt;p&gt;さて、元となっているCのソースでは変数宣言&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; volatile byte* padr = (byte*) PADR;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; volatile byte* pbdr = (byte*) PBDR;  &lt;p&gt;をしているにも関わらず &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pbdr = *padr;&lt;br&gt;部分がレジスタやローカルフレームによる変数領域を使用せず&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; @16777171:8,r2l&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@16777174:8&lt;br&gt;&lt;/p&gt; &lt;p&gt;と最適化されて出力されています。これはCで書けば&lt;/p&gt; &lt;p&gt;*((byte*) PBDR) = *((byte*) PADR);&lt;/p&gt; &lt;p&gt;になるわけですね。これは先ほどテンプレートを展開したコードと同等です。&lt;/p&gt; &lt;p&gt;C++のtemplate版の方は上記のとおり、変数を使用せずアドレスを指す整数値をポインタへキャストしてアクセスしていますから。&lt;/p&gt; &lt;p&gt;このような理由でCとC++のコードのコンパイル結果が同じものになっています。&lt;/p&gt; &lt;p&gt;もし、Cのソースの方のコンパイル結果が&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="Tahoma" size="2"&gt;mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; #16777171,er2&lt;br&gt;&lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; #16777174,er3&lt;br&gt;.L2:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;mov.b&amp;nbsp;&amp;nbsp; @er2,@er3&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bra&amp;nbsp;&amp;nbsp; .L2&lt;/p&gt;&lt;/font&gt; &lt;p&gt;となっていたら同等な結果は得られなかったかもしれません。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;# templateにはtemplateなりの問題もありますが、少々姑息と思いながらも今までC++は遅くなる、大きくなるからダメと言われてずーっとC++を使えなかったから、そのはけ口として出してしまいました^^;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size="1"&gt;そして、どうしても言えなかったことですが、-O2付けないとtemplate版でもC++の方がデカくなりますw&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;そして、パワポ資料は&lt;a href="http://andochin.wankuma.com/benkyokai/wankuma_nagoya3.ppt"&gt;ここ&lt;/a&gt;&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/150727.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>スーパーあんどちん</dc:creator><title>それもバグとしてカウントするの？</title><link>http://blogs.wankuma.com/andochin/archive/2008/02/28/125290.aspx</link><pubDate>Thu, 28 Feb 2008 00:50:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2008/02/28/125290.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/125290.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2008/02/28/125290.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/125290.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/125290.aspx</trackback:ping><description>&lt;p&gt;僕らの業界って開発中はプロトタイプのハードを使うことが結構あるんですが、派生製品が複数ある場合、ある製品ではこの機能を追加とかある製品ではこの機能を削除とかあるわけですね。プロトタイプは大体最大公約数的なものな訳です。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;今日、以前の職場の人と話をしている中で、基板上のとあるチップの制御処理を組み込んだ時の話題が出た。&lt;/p&gt; &lt;p&gt;僕:「あの時の対応早かったでしょ？」&lt;/p&gt; &lt;p&gt;彼:「でもあそこにはバグがありました」&lt;/p&gt; &lt;p&gt;僕:（うわぁ又仕様の見落としでもしたのか…）「どんな？」&lt;/p&gt; &lt;p&gt;彼:「あのチップはある製品では実装されていないので、そのボードでは動かないです」&lt;/p&gt; &lt;p&gt;僕:「それもバグって言うの？」&lt;/p&gt; &lt;p&gt;（言っちゃえばそうなんだけどさぁ）&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;因みに僕はその製品のこと全く知りませんし、そのチップが無いボードが出ることは、僕がその作業をしている時には想定外でした。&lt;/p&gt; &lt;p&gt;幸い、その制御処理を外す事自体は大した手間ではないし、既に後任者が対応した事なので、笑って話をしていましたが…&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/125290.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>スーパーあんどちん</dc:creator><title>昨日のスタートアップ</title><link>http://blogs.wankuma.com/andochin/archive/2008/01/09/116510.aspx</link><pubDate>Wed, 09 Jan 2008 00:17:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2008/01/09/116510.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/116510.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2008/01/09/116510.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/116510.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/116510.aspx</trackback:ping><description>&lt;P&gt;昨日は喜びのあまりメインと実行結果写真だけでしたが、今日はメインに行くまでを。&lt;/P&gt;
&lt;P&gt;スタートアップとローダスクリプトは&lt;A href="http://akita-nct.jp/~yamamoto/comp/H8/C_linux/C_linux.php#start_up_routine"&gt;ここ&lt;/A&gt;を参考にさせていただきました。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;アセンブラのスタートアップ&lt;/P&gt;
&lt;TABLE cellSpacing=0 cellPadding=2 width=400 border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=400&gt;
&lt;P&gt;; H8/3052 Startup for GCC 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .h8300h 
&lt;P&gt;; ベクタ設定。割込は未使用なのでリセットのみ（手抜）&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .section .vector&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .data.l _start 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .section .text&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .global _start&lt;BR&gt;_start:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp; #__stack,sp 
&lt;P&gt;; 初期値付データをROMからRAMへコピー&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp; #___init_data_top,er0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp; #___data_top,er1&lt;BR&gt;1:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp; @er0,r2l&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp; r2l,@er1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adds&amp;nbsp;&amp;nbsp;&amp;nbsp; #1,er0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adds&amp;nbsp;&amp;nbsp;&amp;nbsp; #1,er1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp.l&amp;nbsp;&amp;nbsp; #___data_end,er1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; blo 1b 
&lt;P&gt;; 初期値なしデータ・BSSセクションを0でクリア。&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp; #0,er0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp; #___bss_top,er1&lt;BR&gt;1:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp; r0l,@er1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adds&amp;nbsp;&amp;nbsp;&amp;nbsp; #1,er1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp.l&amp;nbsp;&amp;nbsp; #___bss_end,er1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; blo 1b 
&lt;P&gt;; Cのmainへ&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; jsr @_main 
&lt;P&gt;1: 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bra 1b&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .section .stack&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .global __stack&lt;BR&gt;__stack:&lt;BR&gt;&amp;nbsp; &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;ローダスクリプト&lt;/P&gt;
&lt;TABLE cellSpacing=0 cellPadding=2 width=400 border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=400&gt;
&lt;P&gt;OUTPUT_FORMAT("coff-h8300")&lt;BR&gt;OUTPUT_ARCH(h8300h)&lt;BR&gt;ENTRY("_start") 
&lt;P&gt;MEMORY {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; vector(r):&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; o = 0x00000000, l = 0x00000100&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rom(rx):&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; o = 0x00000100, l = 0x0007ff00&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ram(rwx):&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; o = 0x00ffdf10, l = 0x00002000&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; exram(rwx):&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; o = 0x00220000, l = 0x00020000&lt;BR&gt;} 
&lt;P&gt;SECTIONS {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .vector : {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.vector)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &amp;gt; vector&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .text : {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.text)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.rodata)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___init_data_top = .;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &amp;gt; rom 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .data&amp;nbsp; : AT(___init_data_top) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___data_top = .;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.data)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___data_end = .;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &amp;gt; ram 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .bss&amp;nbsp; ALIGN(0x10) : {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___bss_top = .;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.bss)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(COMMON)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___bss_end = .;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &amp;gt; ram&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .stack 0x00ffff10 : {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.stack)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;簡単に説明すると、電源ONでCPUはベクタテーブルの先頭(0番地)からPCの値を読み込んで&lt;/P&gt;
&lt;P&gt;そこから実行を開始します。このスタートアップだと_startのところです。&lt;/P&gt;
&lt;P&gt;_startでは、スタックの設定をした後静的変数の初期化を行いCのmainを呼び出します。&lt;/P&gt;
&lt;P&gt;mainから返ってくることは想定していませんが、返ってきちゃったら永久ループです。&lt;/P&gt;
&lt;P&gt;尚、スタートアップ・ローダスクリプトともに極力短く書くようにしました。正直なところスタート&lt;/P&gt;
&lt;P&gt;アップの静的変数初期化はいらないだろうと思ったんですが、mainに来るまでにはこんなこと&lt;/P&gt;
&lt;P&gt;が行われてますよってのがわかるのもいいかなと。&lt;/P&gt;
&lt;P&gt;でも、このスタートアップではライブラリの初期化を行っていないのでCの標準ライブラリは&lt;/P&gt;
&lt;P&gt;使えません（初期化が必要ないものは利用可能と思われますが）。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/116510.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>スーパーあんどちん</dc:creator><title>点けてみた</title><link>http://blogs.wankuma.com/andochin/archive/2008/01/07/116335.aspx</link><pubDate>Mon, 07 Jan 2008 23:41:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2008/01/07/116335.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/116335.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2008/01/07/116335.aspx#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/116335.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/116335.aspx</trackback:ping><description>&lt;P&gt;この間資料を買ってきたおかげでプログラムが組めそうになったので、AKI-H8-USBで簡単なプログラムを組んでみた。&lt;/P&gt;
&lt;P&gt;PA0-PA3がSW0-SW3に接続されていてPB0-PB3がLED0-LED3に接続されているので、PAの入力をPBに出力すればボタンに対応するLEDが光りそう。&lt;/P&gt;
&lt;P&gt;で、お試しプログラム。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE cellSpacing=0 cellPadding=2 width=400 border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=400&gt;
&lt;P&gt;#define PADDR *((volatile unsigned char*) 0xffffd1)&lt;BR&gt;#define PADR *((volatile unsigned char*) 0xffffd3)&lt;BR&gt;#define PBDDR *((volatile unsigned char*) 0xffffd4)&lt;BR&gt;#define PBDR *((volatile unsigned char*) 0xffffd6) 
&lt;P&gt;const int ga = 1;&lt;BR&gt;int gb = 2;&lt;BR&gt;int gc; 
&lt;P&gt;int main(void)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; unsigned char a; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;PADDR = 0xｆ0; /* ポートAを入力に設定 */&lt;BR&gt;&amp;nbsp;&amp;nbsp;PBDDR = 0xff; /* ポートBを出力に設定 */ 
&lt;P&gt;&amp;nbsp;&amp;nbsp;while(1) {&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;a = PADR; /* ポートA読み出し */&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;PBDR = a; /* ポートBに出力 */&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;return 0;&lt;BR&gt;} &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;&lt;STRIKE&gt;ポートAをすべて入力にしているのは良くない気がするけど、多分大丈夫だろう。&lt;/STRIKE&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://andochin.wankuma.com/images/200801/52e8ce4976bb_14D25/H8_LED.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=184 alt=H8_LED src="http://andochin.wankuma.com/images/200801/52e8ce4976bb_14D25/H8_LED_thumb.jpg" width=244 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;わーい。&lt;/P&gt;
&lt;P&gt;使わないグローバル変数が定義されているのはどのセクションに配置されるか見たかったからで意味は無いです。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/116335.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>スーパーあんどちん</dc:creator><title>フラッシュROMのアクシデント</title><link>http://blogs.wankuma.com/andochin/archive/2007/11/29/110976.aspx</link><pubDate>Thu, 29 Nov 2007 23:39:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2007/11/29/110976.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/110976.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2007/11/29/110976.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/110976.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/110976.aspx</trackback:ping><description>&lt;P&gt;前の内容と関連しますが、これまた大分昔の話。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;その案件ではフラッシュROMへ書き込みを行う必要があった。しかし、プログラムは間違っていない&lt;/P&gt;
&lt;P&gt;はずなのに消去・書き込み共に失敗。&lt;/P&gt;
&lt;P&gt;原因はプログラム実行でアドレスバスとデータバスにフラッシュアクセス以外の信号が出てしまってい&lt;/P&gt;
&lt;P&gt;るからではないか？との疑問から、CPU内部にある数KBのメモリにフラッシュ書き込みプログラムを&lt;/P&gt;
&lt;P&gt;転送して行うことにした。案の定無事に書き込みはできたけど、そこにいたるまでには問題もあった&lt;/P&gt;
&lt;P&gt;わけで。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;まず、CPUのマニュアルが無かったのでアセンブラのニーモニックがわからなかった。仕方なくコンパイラ&lt;/P&gt;
&lt;P&gt;の出すアセンブラソースを見て「こんな感じ？」ってアセンブラでリロケータブルなフラッシュアクセスルー&lt;/P&gt;
&lt;P&gt;チンをこしらえてCPUのRAMに転送。&lt;/P&gt;
&lt;P&gt;更に、当時は開発費の関係上使用していたICEはROMICE。CPUICEならデバッグできたんだろうけど、CPU&lt;/P&gt;
&lt;P&gt;内部のRAMに処理が移ったとたんステップ実行不可。当然そこにはブレークも張れない。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;製品の開発だったら不具合対応とかを考えるとゾっとするけど、試作品の開発だったからか、その後は特に&lt;/P&gt;
&lt;P&gt;トラブルも無かった。&lt;/P&gt;
&lt;P&gt;# そのフラッシュアクセスルーチンだけは他の人が使い回ししていたようだけど&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/110976.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>スーパーあんどちん</dc:creator><title>忌まわしいハード</title><link>http://blogs.wankuma.com/andochin/archive/2007/11/21/109690.aspx</link><pubDate>Wed, 21 Nov 2007 23:41:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2007/11/21/109690.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/109690.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2007/11/21/109690.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/109690.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/109690.aspx</trackback:ping><description>&lt;P&gt;昔のことを思い出すと、未だに忘れられないハードがいくつかある。&lt;/P&gt;
&lt;P&gt;今日はそのうちの１つのことを。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;LCD付きのハードの制御プログラムを作ったときのこと。LCDはキャラクタベースの表示で、キャラクタは任意に作成可能なハードだった。&lt;/P&gt;
&lt;P&gt;# 古い人にはX1やMZシリーズのPCGと思ってもらえれば良いかな？&lt;/P&gt;
&lt;P&gt;当時はPC-9801+MS-DOSでの開発が全盛。キャラクタエディタまで作ってノリノリだったのに、いざ表示しようとすると絵が1文字ずつしか出ない。&lt;/P&gt;
&lt;P&gt;ABCDEF&lt;/P&gt;
&lt;P&gt;と表示しようとすると、&lt;/P&gt;
&lt;P&gt;A B C D E F&lt;/P&gt;
&lt;P&gt;となるのだ。&lt;/P&gt;
&lt;P&gt;ソフトを疑われて（最初のうちは仕方が無いが）納得できずに回路図を見ると、何とLCDのV-RAM(のようなもの)とCPUのアドレスバスの配線が１本ずれていたのだ。結果、表示は１キャラクタ毎に空白が出る羽目に。&lt;/P&gt;
&lt;P&gt;このトラブルは未だに忘れられない。&lt;/P&gt;
&lt;P&gt;因みにこのハードROMの信号処理にも問題があって、CPUがバスマルチプレクスだったこともあり、ROMにアクセスに行くと必ずアドレス下位8bitと同じ値が読み出されるというトラブルもあった。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;当時の上司がこのハードの会社に文句を言ったら、&lt;/P&gt;
&lt;P&gt;「１発で動くソフトが作れますか？」&lt;/P&gt;
&lt;P&gt;と言われたそうだ。確かに無理です。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/109690.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>スーパーあんどちん</dc:creator><title>MISRA</title><link>http://blogs.wankuma.com/andochin/archive/2007/11/20/109531.aspx</link><pubDate>Tue, 20 Nov 2007 23:50:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2007/11/20/109531.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/109531.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2007/11/20/109531.aspx#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/109531.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/109531.aspx</trackback:ping><description>&lt;P&gt;正しい読み方は「みずら」か「みすら」のどっちなんだろう？&lt;/P&gt;
&lt;P&gt;僕は「みずら」派だけど。&lt;/P&gt;
&lt;P&gt;流石に「まいずら」ではないだろうな。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;関係ないけど「山崎」の「ミズナラ樽」は好きだ。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/109531.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>スーパーあんどちん</dc:creator><title>光れ！</title><link>http://blogs.wankuma.com/andochin/archive/2007/11/09/107094.aspx</link><pubDate>Fri, 09 Nov 2007 00:05:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2007/11/09/107094.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/107094.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2007/11/09/107094.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/107094.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/107094.aspx</trackback:ping><description>最近ドキュメントを見ることばかりだったので、気分転換に基板をいじってみた。

サンプルプログラムをビルドして転送してデバッガで動作確認。

ブレークポイントを張って実行するとちゃんと停止する。

「動いてそうだ」

しかしなんか寂しい。

説明書を見て基板上にLEDを発見。

方向レジスタを出力にしてLEDオン！

やったー。光った！


組み込み暦十ウン年。未だこの程度のことで喜べる自分はたぶん幸せ。
&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/107094.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>スーパーあんどちん</dc:creator><title>４月全然書いてない！</title><link>http://blogs.wankuma.com/andochin/archive/2007/04/30/75008.aspx</link><pubDate>Mon, 30 Apr 2007 03:20:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2007/04/30/75008.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/75008.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2007/04/30/75008.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/75008.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/75008.aspx</trackback:ping><description>&lt;P&gt;まぁ仕事でテンパってたり、月末はドイツに行っていたりで、書けなかったわけですが。&lt;/P&gt;
&lt;P&gt;初めて仕事で海外に行ったのですが、仕事の仕方とかやっぱり違いますねぇ。&lt;/P&gt;
&lt;P&gt;ゴールデンウィークまでには帰れるからという甘い言葉に乗って渋々行った出張です。タダで海外旅行できるから良いとも思えるのですが、実は&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;乗り物酔いが酷い&lt;/STRONG&gt;&lt;/FONT&gt;&lt;FONT color=#000000&gt;ので、&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;出張とかはとにかくダメ&lt;/FONT&gt;&lt;/STRONG&gt;なんですよねぇ（新幹線の限度は名古屋→東京位）。&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;ま、呼ばれた理由が、「僕の担当しているモジュールが無駄にCPU時間を消費していたから」なので仕方が無いのですが・・・。&lt;/P&gt;
&lt;P&gt;CPU時間を消費していた原因は「割り込みで待てばよいところをポーリングしていたから」だったので、対応はすぐ済んだのですが、この程度のことなら、現象を言ってくれれば日本で直せたよなぁ。&lt;/P&gt;
&lt;P&gt;その上、帰る直前になり&lt;/P&gt;
&lt;P&gt;「お前だけあと１～２日居ろ！」&lt;/P&gt;
&lt;P&gt;みたいな事を言われ、理由を聞くと「政治的な理由(political reasons)」って、親会社への体裁で残らされてたまるか！&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/75008.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>