「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ
CALENDAR
2011年2月
日
月
火
水
木
金
土
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
前月
翌月
Entry Archive
2024年08月
2024年07月
2024年06月
2024年05月
2024年04月
2024年03月
2024年02月
2024年01月
2023年12月
2023年11月
2023年10月
2023年09月
2023年08月
2023年07月
2023年06月
2023年05月
2023年04月
2023年03月
2023年02月
2023年01月
2022年12月
2022年11月
2022年10月
2022年09月
2022年08月
2022年07月
2022年06月
2022年05月
2022年04月
2022年03月
2022年02月
2022年01月
2021年12月
2021年11月
2021年10月
2021年09月
2021年08月
2021年07月
2021年06月
2021年05月
2021年04月
2021年03月
2021年02月
2021年01月
2020年12月
2020年11月
2020年10月
2020年09月
2020年08月
2020年07月
2020年06月
2020年05月
2020年04月
2020年03月
2020年02月
2020年01月
2019年12月
2019年11月
2019年10月
2019年09月
2019年08月
2019年07月
2019年06月
2019年05月
2019年04月
2019年03月
2019年02月
2019年01月
2018年12月
2018年11月
2018年10月
2018年09月
2018年08月
2018年07月
2018年06月
2018年05月
2018年04月
2018年03月
2018年02月
2018年01月
2017年12月
2017年11月
2017年10月
2017年09月
2017年08月
2017年07月
2017年06月
2017年05月
2017年04月
2017年03月
2017年02月
2017年01月
2016年12月
2016年11月
2016年10月
2016年09月
2016年08月
2016年07月
2016年06月
2016年05月
2016年04月
2016年03月
2016年02月
2016年01月
2015年12月
2015年11月
2015年10月
2015年09月
2015年08月
2015年07月
2015年06月
2015年05月
2015年04月
2015年03月
2015年02月
2015年01月
2014年12月
2014年11月
2014年10月
2014年09月
2014年08月
2014年07月
2014年06月
2014年05月
2014年04月
2014年03月
2014年02月
2014年01月
2013年12月
2013年11月
2013年10月
2013年09月
2013年08月
2013年07月
2013年06月
2013年05月
2013年04月
2013年03月
2013年02月
2013年01月
2012年12月
2012年11月
2012年10月
2012年09月
2012年08月
2012年07月
2012年06月
2012年05月
2012年04月
2012年03月
2012年02月
2012年01月
2011年12月
2011年11月
2011年10月
2011年09月
2011年08月
2011年07月
2011年06月
2011年05月
2011年04月
2011年03月
2011年02月
2011年01月
2010年12月
2010年11月
2010年10月
2010年09月
2010年08月
2010年07月
2010年06月
2010年05月
2010年04月
2010年03月
2010年02月
2010年01月
2009年12月
2009年11月
2009年10月
2009年09月
2009年08月
2009年07月
2009年06月
2009年05月
2009年04月
2009年03月
2009年02月
2009年01月
2008年12月
2008年11月
2008年10月
2008年09月
2008年08月
2008年07月
2008年06月
2008年05月
2008年04月
2008年03月
2008年02月
2008年01月
2007年12月
2007年11月
Recent Entry
こないだのロボット
潮来に行ってきた
ロボット行ってきた
88の日
帰って来た
こないだのロボットと、Windows11セットアップ
ロボット行ってきた
PC買い足した
ネオクラシックカー
TkEasyGUI
Recent Comment
nekosan/
JYRUSSやってきたメモ
フルタニアン/
JYRUSSやってきたメモ
nekosan/
JYRUSSやってきたメモ
フルタニアン/
JYRUSSやってきたメモ
nekosan/
こないだのロボット
フルタニアン/
こないだのロボット
nekosan/
こないだのロボット
フルタニアン/
こないだのロボット
nekosan0/
レジ袋ホルダーを考える
フルタニアン/
レジ袋ホルダーを考える
Category
ノンジャンル
(2840)
PIC
(47)
AVR
(341)
Arduino
(446)
Raspberry Pi
(193)
mbed
(41)
ARM
(30)
ESP32
(15)
Android
(10)
OPアンプ
(125)
VHDL
(57)
PSoC
(4)
アナログ回路
(110)
クルマ
(126)
rails
(51)
本
(42)
導電塗料
(3)
Fritzing
(41)
Edison
(2)
FFT
(34)
写真
(157)
MIDI
(24)
その他日記
(11)
Python
(57)
3Dプリンタ
(124)
Bookmark
最初はgoo
goo blogトップ
スタッフブログ
My Profile
ブログID
nekosan0
自己紹介
Search
このブログ内で
ウェブ全て
一応動作するように
AVR
/
2011年02月02日
昨日の続き。
http://brown.ap.teacup.com/nekosan0/1222.html
ようやく思ったように動いてくれた…。
WINAVRでインラインアセンブラ使って、ある程度正確な
遅延時間を作る処理のこと。
なぜ遅延時間が不正確なのか。
シミュレータのディスアセリストを眺めながら1ステップ
1ステップ追っていってみたら、16ビット変数(uint16_t型)
をアセンブラに渡すところで上位下位の8ビットが逆に渡ってた。
そりゃ無茶苦茶ですがな。
直してみてからあらためてシミュレーション。
微妙に遅延時間が長い…
遅延時間が伸びてる最大の理由は、シミュレータ画面上で
追ってみたら判明。1マイクロ秒単位の引数を、関数の先頭で
10マイクロ秒単位に丸める処理(単に10で割るという整数除算)
で300クロックほど要していることが原因みたい10マイクロ秒
単位の精度が欲しいのに、300クロック=30マイクロ秒
(@10Mhz)の誤差はでかすぎ。
仕様変更することにして、引数を10マイクロ秒単位で指定
することに。
それでも関数の引数(定数)内で10で割る処理を明記して
おけば、コードの可読性自体は悪化しないだろう、と。
定数式はコンパイル時に最適化されて引数は1/10単位の値で
展開されていることは確認済み。
これなら300クロックほどの遅延が無くなり、最低限で済む
のでとりあえずok。
いい感じになってきたので、きちんと一通り全部のロジック
をシミュレータ通して確認してみる。
…部分的におかしい。なんだこりゃ?
あらためてディスアセのリストを1ステップずつ追ってみると、
引数を1/10させてた時と違って、時間稼ぎ処理のサブルーチン
(今回インラインアセンブラ使った部分)が意図しない
インライン展開されちゃってる。
呼び出し箇所のすべてでインライン展開されちゃってるなぁ…。
まぁ、コードサイズ的にはそれでも800バイト程度程度だから
充分小さいんだけど、問題はその一つ一つ展開されたロジック
が変な状態ってこと。
具体的には、引数がきちんと渡されているところと、まともに
渡されてないところがあって、渡されていないところは
引数ゼロで処理しちゃって、ループを一気に抜けちゃう。
うーん。何だコリャ?
同じ関数を複数個所にインライン展開してるだけなんだけど、
複数個所ゆえにレジスタ割り当ての管理で支障をきたして
いるのかな?だったらインライン展開してくれるなよぅ…。
コンパイラ君…。
ロジック自体には間違えがなさそうなので、かくなる上は
コンパイルオプションの最適化引数を弄ってみる。
Os → O1に変更してみたら、サブルーチンがきちんとサブ
ルーチンとして独立して生成され、想定どおりの動きになった。
ヨシヨシ。
一方、O0もO2もO3もOsも全部だめ。一部は実行コードサイズが
馬鹿でかく(3KB超え)なっちゃうし、一部は上述のとおり
不完全なインライン展開で引数が渡ってくれない…。
とりあえずコンパイルオプションをO1にしたところで動いた
ので、これでよしとしてしまおうと思うんだけど、
こういう綱渡りって、コンパイラのバージョンアップが
致命傷になったりするから嫌いなんだよねぇ…。
(だからこの手のタイミングクリティカルなプログラムは
いつもアセンブラで組んじゃうんだよな)
あとはアレかな。インラインアセンブルじゃなくて、
アセンブリ言語で書いたサブルーチンをC言語サブルーチン
として繋ぐってやつ。
http://avrwiki.jpn.ph/wiki.cgi?page=avrgcc%A4%C7%A5%A2%A5%BB%A5%F3%A5%D6%A5%E9%A4%F2%BB%C8%A4%A6
avrwikiでも解説されてるこれ。
コードの可読性って意味ではこっちの方がスマートな
気もするんだけど、これだと必ず関数のカタチにしないと
いけない(必ずサブルーチンコールのカタチとなり
オーバーヘッドが生じる)っていう点と、makeファイル
弄らないといけないっていう面倒くささがあるんだよな。
なんにしても、今回書いたコード。まだCとアセンブラの
引数周りについて少し心配なところがあるといえばあるん
だよな。100%理解できたのか?と言われたら、Noって
レベルだからなぁ。所詮付け焼刃なのだ。
まぁ今回は「想定どおりのhexファイル」ができたって
ことで、あとは実機に流し込んでリモコンが動作するか
どうかが確認出来たら凍結ってことにしよう…
winavrって、関数をインライン展開させないための
プリプロセッサってあったりするのかな?それがあれば
コンパイルオプション弄る必要が無いんだけどな…
http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Inline.html
これか?いや、これの逆だな。
コメント (
0
)
goo ブログ
ブログの作成・編集
gooおすすめリンク
おすすめブログ
【コメント募集中】スタッフの気になったニュース
@goo_blog
【お知らせ】
ブログを読むだけ。毎月の訪問日数に応じてポイント進呈
【コメント募集中】goo blogスタッフの気になったニュース
gooブロガーの今日のひとこと
訪問者数に応じてdポイント最大1,000pt当たる!