タグ付けされた質問 「microcontroller」

13
日常の機械はどのようにプログラムされていますか?
日常の機械(電化製品やデジタル時計など、コンピューターやモバイルデバイスではない)はどのようにプログラミングされていますか?コカコーラの自動販売機のプログラミングにはどのようなコードが含まれますか?私のコーヒーメーカーは、事前にプログラムされた時間をどのように受け入れ、その時間が到着した後、コーヒーのポットの醸造をどのように開始しますか? これらの種類のマシンは内部にオペレーティングシステムを持っていますか、それとももっと基本的なものですか?彼らはアセンブリ、C、または他の言語で書かれていますか? そして、これらのオペレーティングシステムまたは基になるコードシステムをリストするリソースを見つけたいと思います。できれば、ソースコードを使用することもできます。誰かがそのようなリソースを知っている場合(検索しても何も得られなかった)、それは素晴らしいことです。

5
ビット演算は予期しない変数サイズになります
環境 PICマイクロコントローラー用の8ビットCコンパイラーを使用して最初にコンパイルされたCコードを移植しています。符号なしグローバル変数(たとえば、エラーカウンター)がゼロにロールオーバーしないようにするために使用された一般的なイディオムは次のとおりです。 if(~counter) counter++; ここでのビット演算子はすべてのビットを反転し、ステートメントが真であるのcounterは、最大値よりも小さい場合のみです。重要なことに、これは変数のサイズに関係なく機能します。 問題 現在、GCCを使用する32ビットARMプロセッサをターゲットにしています。同じコードが異なる結果を生成することに気づきました。私たちが知る限りでは、ビットごとの補数演算は予想とは異なるサイズの値を返すようです。これを再現するには、GCCでコンパイルします。 uint8_t i = 0; int sz; sz = sizeof(i); printf("Size of variable: %d\n", sz); // Size of variable: 1 sz = sizeof(~i); printf("Size of result: %d\n", sz); // Size of result: 4 出力の最初の行で、期待どおりの結果が得られますi。1バイトです。ただし、のビット単位の補数iは実際には4バイトであり、これとの比較では期待される結果が得られないため、問題が発生します。たとえば、次の場合(i適切に初期化されたはどこですかuint8_t): if(~i) i++; i0xFFから0x00までの「折り返し」が表示されます。この動作は、以前のコンパイラと8ビットPICマイクロコントローラーで意図したとおりに機能していた場合と比較して、GCCで異なります。 次のようにキャストすることでこれを解決できることを認識しています。 if((uint8_t)~i) i++; または、 if(i < 0xFF) …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.