« USB OTG | トップページ | 冬休みの工作 »

2021年1月 5日 (火)

コンパイル結果の処理の順番

っていうか、これはちょっと...

volatileとかは分かってても、
このコードのまずさに、だれも気づかないのか....

これはまだ、一見で分かるからいいけど
こんなレベルの仕込まれてるかも、と思うと
とってもじゃないけど、もうこれ以降の
コード読み続けられない。


やっぱり、組み込み系って、ちょっとソフト書ける
くらいの人にとっても、本質的に難しいのかなあ。

身近な所での、指導の方向性について考えてしまうなあ....

| |

« USB OTG | トップページ | 冬休みの工作 »

コメント

まずさというのは、書き込むタイミングの方ですか?
そもそも8 bit アクセスを前提にしているのに、別々のポートに割り振っているという。
重い割り込みとか入って来ない&出力タイミングがシビアでない
なら問題ないと思いますが、1個目のポート書き込んだタイミングで重い割り込みが来ると死にますね。

投稿: ぶらざー | 2021年1月 6日 (水) 09時58分

本来のプログラム動作の部分ではないですね。
気になるのは、C言語でリードモデファイライトやってる部分です。

ここの部分だけでは如何ということは無いですが、こう書いてある、
ってことはマスクしているビットを他で操作している、ってことを示していそうです。

レジスタをリードしたタイミングで、割り込みが入り、ハンドラ内で
レジスタのデータを書き換えると、割り込みを抜けて元の処理に復帰したときに、
ハンドラ内の変更が上書きされますね。
うっかり、難しい系の異常動作に入りそうに見えるので、
ちょっとこのままにしておけないですね。


こういうことをやるために、組み込みを標榜するCPUでは、
専用ニモニックとか(旧PICとか78k0とか)、
専用ハードレジスタ(stm32など)がちゃんと用意されているので、
Cで書こうとせず、そっちを使ってほしい所です。


自分も良く忘れていますが、そもそもビット操作みたいな
組み込み系の記述をすることが、
C言語の使用想定から外れている気もします。


本来の書き込みタイミングを揃える話ですが、
ハードの設計もありますが、(そもそも論で)
ソフトでやるにしても、こういうのではなく、
もっと別のアプローチをした方が、筋が良いと思いますね。

投稿: w谷 | 2021年1月 6日 (水) 21時34分

コメントを書く



(ウェブ上には掲載しません)




« USB OTG | トップページ | 冬休みの工作 »