組み込みの埋まってるとこ

システム寄りの組み込みCプログラミングBLOG

組み込みでも使えるオープンソース ~アプリケーション編~

オープンソースと言えばLinuxやWindows用が多いのですが、 本日は非力なマイコンでも実用的に使えるお気に入りのオープンソースをピックアップしてみたいと思います。 あなたはいくつご存じでしょうか? libpng ~画像コーデックライブラリ~ zlib ~データ圧…

ベクタライズされる基本的なプログラム例

Cコンパイラの最適化でベクタライズされるプログラムの基本的な条件を実験しながら確認してみました。 ベクタライズされるプログラムとされないプログラム 変数が配列になっているときはベクタライズ可能 変数が構造体になっているときベクタライズされる条…

undefined reference to になるGCC特有の原因

undefined reference to エラーはリンク時に定義されていないシンボルがあるときに発生しますが、 GCCではリンクに関する意外なルールが原因で発生することもあります。 GCCでのシンボル検索とundefined referenceになる原因 GCCではリンクするとき起動時に…

arm-none-eabi-gccとは何か?

arm-none-eabi-gccとは何か? arm-none-eabi-gccとはGCCのクロスコンパイラです。 クロスコンパイラとはプログラムを実行するターゲットとは異なるホストコンピュータで コンパイルすることができるコンパイラのことです。 arm-none-eabiの意味 gccの手前にハ…

SDLとMinGWによるOpenGL入門環境

SDLによるOpenGLの実行例 Windowsとグラフィックスボード無しのPCでOpenGL入門用の環境を構築してみました。 ANGLEによりDirectX上でOpenGL ESをエミュレートしましたので実行速度も高速です。 動作環境 Windows10 Intel UHD Graphics 630 (Core i5) DirectX…

GCCによる割り込みハンドラのプログラミング

割り込みハンドラはOSが存在している場合はその流儀に従ってプログラミングすればよいのですが、 OSが存在しないベアメタルの場合にはCPUアーキテクチャや割り込み処理内で許可する動作を踏まえた専門的なプログラムが必要になります。 Arm用GCCでは関数にin…

SDL2でCPU描画した画像を高速に表示する

ちょっとした実験用にCPUで描画した結果を素早くウインドウで表示できる環境があると便利です。 そこでSDL2を使い、フレームバッファに見立てた配列を画像としてウインドウに表示する簡単なプログラムを作成した例を紹介します。 SDL2でのプログラム例 まず…

組み込みでlongjmp/setjmpは使えるか?

構造化言語でなくなる、よく分からない等の理由でなんとなく嫌われ者のlongjmp/setjmpですが、 その気になれば例外処理やスレッドも実装できる知る人ぞ知る便利な関数でもあります。 そんなlongjmp/setjmpが組み込みでも使用できるのかを調べてみました。 lo…

Premultiplied Alphaというカラーフォーマットについて

OpenVGやWin2D等、グラフィックスライブラリのAPIでたまにプリマルマルチプライドαというカラーフォーマットが使われているのを見かけることがあります。 これはどんなカラーフォーマットで何のために使われるのでしょう。 αブレンド 乗算の演算コストを下げ…

arm-none-eabi-gccでundefined referenceエラーになる原因

組み込みでのコンパイルは見たこともない難しいエラーに直面することがよくあります。 Arm用のクロスコンパイラであるarm-none-eabi-gccでコンパイルしていると 次のような未定義シンボルエラーの嵐に見舞われることがありますが、この原因はなんでしょう? …

Arm用GCCでのコンパイルオプションの選び方

組み込みで使用するARM用クロスコンパイラであるarm-none-eabi-gccを使用する際に必要となる ARM固有のオプションについて紹介します。 Downloads | GNU Arm Embedded Toolchain Downloads – Arm Developer コンパイラオプションがとる引数の詳細はGCCの公式…

100と99.999…は等しいか否か? ~組み込みの場合~

数学では100と99.999…は等しい数になるそうです。 厳密な証明は私には難しいのですが次のように理解できます。 3分の1してから3倍すると元の数と等しい数になる。だとすれば、 3分の1したときに少数で書き直したものを3倍した数も元の数と等しい。 ところが…

undefined reference to `_exit' の原因

組み込みでソフトウェアを開発していると身に覚えがない関数が無くてリンクできないことがあります。 その関数はいったいどこで何のために必要とされているのでしょうか? undefined reference to `_exit' _exitを必要とするのは誰なのか 何故_exitが残ってい…

OpenVGで画像を狙いどおり表示する方法

OpenVGで画像を表示するとき単に座標だけを指定して表示しているときは問題ないのですが、拡大や回転を加えると思いどおり表示されなくなることがよくあります。 その原因をOpenVGの内部的な計算方法から探り、最終的に画像を意図どおり自由自在に表示できる…

printfで何も表示されない原因と対応方法

printfで何も出力されないときに考えられる原因とその対処方法を一般的なことから少し専門的な分野までまとめてみます。 Windows環境でprintfが出力されない バッファにたまっていて出力されない 改行文字で出力させる 強制的にフラッシュする バッファを無…

ドント方式で選挙の当選者を決定するプログラム

令和7年度大学入学共通テストからの出題教科・科目である情報のサンプル問題を題材に、 ドント方式で当選政党を決定する選挙の当選者決定プログラムをつくってみました。 C言語で書かれていますが基本的なプログラムなのでJavaやPython等他の言語でも参考に…