PICマイコンの人力マルチタスク

備忘録。20年以上前にPICマイコンでやってたこと。当時はC言語なんて使わずに、アセンブラニーモニックごりごり。

PICマイコンって命令フェッチは1命令/clockなんだけど、1命令を処理するのに4クロックかかるという仕様なんです。

んで、前の命令が終わる前に、次の命令で同じレジスタを操作しに行くようなプログラムが実際に書けてしまい、そうするとレジスタの中身がぶっ壊れます。上記の例だと、Axの演算結果を期待してBxを実行すると、Axはまだ処理中なので出鱈目な結果になっちゃう。

普通は前の命令の結果を持って次の命令が必要な場合は、以下のようにNOPを入れるんです。

でもそうすると、NOPの間がムダです。じゃぁどうするかと言うと、命令と命令の間に、レジスタを共有しない別の処理を突っ込みます。こんな感じで。

はい、これで処理能力が2倍になりました。ばんざーい。可読性なにそれ?って感じです。理論上は4倍まで上げられそうですが、実際のところレジスタが足りなかったり、必ずしもNOPいらない場合が多かったり。

今時コンパイラが高性能になったんで、知ってても役立つことのない知識だと思うんですが供養がてら。

カテゴリー: 未分類 タグ: パーマリンク

PICマイコンの人力マルチタスク への4件のフィードバック

  1. のコメント:

    いまちょうどスレッド間排他処理をゴリゴリしているところなんですが、ある意味タイムリーなお話しに感じてしまいました(ぉ
    ちょっくらmutex作業してきますλ…

    • 棉乃木 のコメント:

      お疲れ様です。(‘A`)
      なんか排他制御もクソもなくてすみません😅

      • のコメント:

        排他処理してると思ってたらしていなかったレジストリ破壊NOP野郎ですみません(‘A`)
        というところが実はオレオレタイムリーでしてw

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です