コンパイル結果の処理の順番
っていうか、これはちょっと...
volatileとかは分かってても、
このコードのまずさに、だれも気づかないのか....
これはまだ、一見で分かるからいいけど
こんなレベルの仕込まれてるかも、と思うと
とってもじゃないけど、もうこれ以降の
コード読み続けられない。
やっぱり、組み込み系って、ちょっとソフト書ける
くらいの人にとっても、本質的に難しいのかなあ。
身近な所での、指導の方向性について考えてしまうなあ....
| 固定リンク | 0
っていうか、これはちょっと...
volatileとかは分かってても、
このコードのまずさに、だれも気づかないのか....
これはまだ、一見で分かるからいいけど
こんなレベルの仕込まれてるかも、と思うと
とってもじゃないけど、もうこれ以降の
コード読み続けられない。
やっぱり、組み込み系って、ちょっとソフト書ける
くらいの人にとっても、本質的に難しいのかなあ。
身近な所での、指導の方向性について考えてしまうなあ....
| 固定リンク | 0
コメント
まずさというのは、書き込むタイミングの方ですか?
そもそも8 bit アクセスを前提にしているのに、別々のポートに割り振っているという。
重い割り込みとか入って来ない&出力タイミングがシビアでない
なら問題ないと思いますが、1個目のポート書き込んだタイミングで重い割り込みが来ると死にますね。
投稿: ぶらざー | 2021年1月 6日 (水) 09時58分
本来のプログラム動作の部分ではないですね。
気になるのは、C言語でリードモデファイライトやってる部分です。
ここの部分だけでは如何ということは無いですが、こう書いてある、
ってことはマスクしているビットを他で操作している、ってことを示していそうです。
レジスタをリードしたタイミングで、割り込みが入り、ハンドラ内で
レジスタのデータを書き換えると、割り込みを抜けて元の処理に復帰したときに、
ハンドラ内の変更が上書きされますね。
うっかり、難しい系の異常動作に入りそうに見えるので、
ちょっとこのままにしておけないですね。
こういうことをやるために、組み込みを標榜するCPUでは、
専用ニモニックとか(旧PICとか78k0とか)、
専用ハードレジスタ(stm32など)がちゃんと用意されているので、
Cで書こうとせず、そっちを使ってほしい所です。
自分も良く忘れていますが、そもそもビット操作みたいな
組み込み系の記述をすることが、
C言語の使用想定から外れている気もします。
本来の書き込みタイミングを揃える話ですが、
ハードの設計もありますが、(そもそも論で)
ソフトでやるにしても、こういうのではなく、
もっと別のアプローチをした方が、筋が良いと思いますね。
投稿: w谷 | 2021年1月 6日 (水) 21時34分