No.4ベストアンサー
- 回答日時:
組み込み系とのことですので、printf系関数のフルスペックの機能が必要とは思えません。
実際のところ、どれだけの機能がいるのでしょうか?
機能を制約すればするほど、スタックの消費量もプログラムサイズも少なくて済みます。影響の大きそうな機能を挙げると、
1. ワイド文字およびロケール対応
2. 浮動小数点数の書式化
3. 最小フィールド幅と精度
といった感じです。
1.と2.はすぐに思いつくでしょうが、3.が盲点になりがちです。特に最小フィールド幅は、値そのものが必要とする文字数を調べないと処理できませんので、いったんバッファに値そのものを整形した文字列を格納してから、出力している場合があります。
もちろん、機能の制約版を使うには、自分でそれを実装する必要があります。
回答ありがとうございます。そうですね、フルスペックのprintfは必要ありません。マイコンからPCに文字列を送る目的は
(1)エラーコードを表示するため
(2)センサで計測した値を確認するため
(3)ログをはかせるため
ですので、とりあえずは最大でも10進4桁と16進4桁も表示できれば十分だと思います。自作atoiもどきとputsでカバーして行こうと思います。
No.3
- 回答日時:
printfの実装を確認してないので推測ですけど。
sprintfは利用側で書き出しバッファを用意して渡しますよね。
printfの場合はこの書き出しバッファを関数内で確保して書式化処理(sprintfと同様の処理)をした上でバッファの内容を標準出力に吐き出しているはずです。
問題はこのバッファをどこに確保しているかです。
可能性として3つ。
(1) mallocで確保、後でfree
(2) 自動変数で(スタックに)確保
(3) 関数内で静的に確保
printfがスタックを1KBも使うなら(2)の方法を取っている可能性が高いですね。この場合はsprintfを使ってバッファを別に確保すればスタック消費量は減らせるでしょう。
回答ありがとうございます。コンパイラ(Yellow Soft YCH8)は買い物なので、ソースを見ることができません。
(1) はヒープ領域を使うことになりますが、ヒープ領域を確保しなくてもprintfが使えるところ見るとこれはなさそうです。
1KB、と書いたのはRTOS(NORTi 3 for YC)のマニュアルに"printfを使う場合は最低でも1024byteは必要です。"という説明があったからで、実際どれだけ消費するのかは計測しておりません。
No.2
- 回答日時:
組み込みのプログラムで使うということであれば、フルスペックのものはひつようないかもしれませんね。
これのprintfの実装は見たことがないのですが、ライブラリ全体の大きさが小さいことで知られている
uclibc というライブラリがあります。
参考になるかもしれません。
参考URL:http://www.uclibc.org/
再度、回答ありがとうございます。
示していただいた参考URLからprintfの実装を追いかけてみましたが、だんだん深いところに入るにつれて私の理解を超えてきてしまいました。とりあえずは最大でも10進4桁と16進4桁も表示できれば十分なので、自作atoiもどきとputsでカバーして行こうと思います。
No.1
- 回答日時:
いろいろな実装はありますが、printf/sprintf/vfprtinf/vfsprintf等々で
共通の下請けルーチンを使っていて、そこでメインの書式化処理を
していたりするので、その比較はあまり意味がないと思います。
少なくとも、GNU/LinxuのglibcとかFreeBSDのlibcで使われている
printf等は上記のような実装をしていました。
回答ありがとうございます。
そうですよね、同じ書式処理を持つ関数が複数あるなら、ルーチンをくくりだして共通化しますよね。
RAMの制約が厳しい組み込み系のプログラムを作っており、printfを使用するにはスタックを1024バイト程度用意する必要があるため、スタックを減らす方法を模索しています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 冷蔵庫・炊飯器 炊飯器の省エネについて 3 2023/06/26 10:27
- 経済学 政治家の価値は如何にエネルギーを大量消費させるかで決まる 1 2022/11/11 22:54
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- 生物学 【生命科学】ヒトが1日に消費するATP量?(精度を変えて再計算) 3 2022/10/07 18:48
- 消費税 消費税引き上げ議論すべき、、、え?ですが。 5 2022/10/26 18:07
- 経済学 答えが二つ出て曖昧なので誰か時給教えていただけると幸いです。 ある財の市場における需要関数と供給関数 3 2022/11/15 23:10
- 工学 計器用変成器(PT/CT)を用いた電力測定方法について 2 2022/08/16 11:09
- 照明・ライト 照明消費電力について 3 2022/06/16 14:24
- 倫理・人権 性的消費や性的搾取という言葉がありますが、それぞれどういう意味なのかイマイチわかっていません。 言葉 1 2022/04/28 23:00
- 消費税 消費税還付を受けるための輸出免税の会計処理(仕訳)を教えてください 4 2022/07/14 12:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.netでDLLを読み込んで実行す...
-
スタックフレームの消滅
-
エラー?メッセージ
-
printf / sprintf のスタック消...
-
ハードウェアでスタック構造を...
-
プログラムの規模を表す単位「k...
-
ubuntuで デイスク/deb/loopと...
-
パソコンでインターネット接続...
-
パソコン初心者がキーボードを...
-
エクセルのHLOOKUP関数の検索範...
-
ブラインドタッチ、苦手なんで...
-
hdmiはパラレル?シリアル?
-
Macと iPadの違いについて 今現...
-
ネットワークアイコンが黄色三...
-
ライン数とステップ数の違いに...
-
昔したタイピングソフトが思い...
-
タイピングの癖
-
RS-FF回路について
-
ネットワークアドレスとブロー...
-
命令口調について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.netでDLLを読み込んで実行す...
-
最大スタックサイズを大きくす...
-
エラー?メッセージ
-
Ethernetヘッダの取得 NDIS
-
GCCで関数の引数が渡らない
-
printf / sprintf のスタック消...
-
スタックフレームの消滅
-
H8マイコン スタック領域に...
-
pthreadのスタックサイズ設定取...
-
_CRTIMPの意味は?
-
スタックを用いて整数配列を入...
-
再帰処理を非再帰処理に書き換...
-
VC++でプログラムから現在のス...
-
cloneのスタック管理
-
マス目上の移動のアルゴリズム
-
gccでスタックサイズを変更する...
-
OCXからのコールバックを繰り返...
-
コンパイラオプション
-
VC++6.0 Stack Overflow !!
-
スタック領域変更
おすすめ情報