目次

C

プログラミング言語C++GCCも参照

ググったときのメモとか
【C言語】ポインタが分からない人のためのポインタ講座。
Visual Studio独特のこととか多い

Visual C++ サンプルコード | 即戦力ソース集
時間取得関係
time
localtime_s, asctime_s 覚書(Visual Studio 2013)

atan2

文字列から整数の取得

atoiよりもstrtolのほうがエラー処理しっかりしている
strtol 文字列をlong値に変換(エラー検出、基数指定あり)
INT06-C. 文字列トークンを整数に変換するには strtol() 系の関数を使う

weak

GCCの属性の一種 weakがついていない同名の関数があるとそちらが優先される.
weakシンボル
リンクされているライブラリによってプログラムの動作を変える

指示付き初期化子

designated initializer
構造体のメンバ変数を初期化する際に,メンバ変数の前にドット(.)をつける.
代入の際にメンバ変数が一緒に見れるので分かりやすい.
C99で定義.C++20でも定義されたが,振る舞いがいくつか異なる点があることに注意しよう.

C++ではメンバ変数の宣言順序に代入しないとコンパイルエラーになる.

指示初期化子による初期化
Designated Initialization @ C++
C++20 指示付き初期化子

関数内で宣言した変数はreturnしてはいけない

関数内で積まれたスタックがリターン時に開放されてしまう.確かに定義されていた変数も開放されてしまう.
意識したことなかったけど言われてみればそうか
関数内で宣言した配列変数をreturnしてはいけない

組み込み

Embedded C Coding Standard
Qfplib
ARM Cortex-M0にチューニングされた浮動小数点ライブラリ,非常に小容量(1kbyte以下)
GPLバージョン2ライセンス

コンパイラ依存マクロ

__CC_ARM # ARMコンパイラ
__ICCARM__ #IAR EWARMコンパイラ
__GNUC__  # GCC

What do the __CC_ARM, __ICCARM__, __GNUC__ and __TASKING__ macros mean?
C言語で定義済みマクロによるコンパイラ及びOS判定

アラインメントの抑止

__packed __attribute__((__packed__))


構造体でアラインによる詰め物が働かないようにする. stm32の場合DMAで転送するデータの開始アドレスは4Byte協会にする必要がある.
どうやらUSBライブラリ周りはアラインメント処理が入らないようにしている.
これは送信するデータの区切り,扱いによって安全性,速度どれを優先するかによって変わるということか?

5. パディング
ハードウェアを意識したプログラミングの基礎(後編)

MISRA-C

もとは自動車業界で品質を高めるために書かれたコーディング規約
組み込みにフォーカスしたものが書かれているが,時代によって少し微妙な部分もある.
MISRA-C:2012 ルール一覧

浮動小数点出力

浮動小数点

%fが使えるようにアレコレする
gccならリンカに-u_printfオプションを追加する.
組み込み用途ならxprintfもおすすめ,2020年末に浮動小数点出力にも対応した.

ターミナルソフトなどでASCIIとして表示するなら,整数部と小数分けて,小数部も整数として表示するという手法もある. 以下の方法を使えば%fを使う必要はないけど余剰は使うの処理がめちゃくちゃ軽くできるかと言われるとどうだろう. ここは完全に実装するアーキテクチャに依存するかな

float fdata = 12.34;
 
int data1;  //整数部
int data2;  //小数部
 
data1 = fdata;  //小数点以下は切り捨てられるので12が入る.
data2 = (ftada * 100) % 100;
/*
 12.34 * 100 = 1234
 1234 % 100 = 34  //余剰
 data2には34が入る.
*/
 
printf("%2d.%d\n", data1, data2)

Using floats with sprintf() in embedded C

めも

a = b[i++];

動作の順番
aにb[i]を代入
iにi+1したものを代入

Tips

printfはデフォルトで2進数を表示できないので,独自に実装してやるほうがよい
【C言語】2進数 8進数 16進数 形式で出力する方法【printf】