Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
gdb+Pythonの自作テストハーネスに関数コールの機能を入れた話
Search
ken551
December 09, 2023
86
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
gdb+Pythonの自作テストハーネスに関数コールの機能を入れた話
at 2023/12/9 合同勉強会 in 大都会岡山 2023 Winter
ken551
December 09, 2023
More Decks by ken551
See All by ken551
簡易ラズピコオシロを改造して簡易フリスクオシロを作った話
ken551
0
770
RL78向けテストハーネスをGDBスクリプトで作ろうとした話
ken551
0
150
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
310
It's Worth the Effort
3n
188
29k
The Curse of the Amulet
leimatthew05
3
16k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
560
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
2
950
YesSQL, Process and Tooling at Scale
rocio
174
15k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
The Language of Interfaces
destraynor
162
27k
Amusing Abliteration
ianozsvald
1
350
A Modern Web Designer's Workflow
chriscoyier
699
190k
BBQ
matthewcrist
90
10k
Transcript
gdb+Pythonの自作テストハーネスに 関数コールの機能を入れた話 2023/12/9 @ 合同勉強会 in 大都会岡山 2023 Winter 祐源
英俊 1
自己紹介 祐源 英俊(ゆうげん ひでとし) • 1995年生まれ(28歳) • 学生時代は組込みシステムを中心に勉強 • 電子部品事業部で組込みソフト開発
(組込みエンジニアとしては3年目) • 趣味:車、音楽、電子工作 X: @Ke_N_551 Github: ken551 2
この発表は? 組込み開発でも高頻度な 自動テストがしたい! ・・・ので、テストハーネスを自作しているという話です 3
こんなものを作ってます 4
こんなものを作ってます テスト対象 コード テスト スクリプト テスト 実施結果 5
テスト失敗の場合→NG結果を報告 ビルド・テスト実施 6
本LTの範囲 関数コール テストケース(Pythonで記述) 7
関数コールについて 8
RL78の関数コールについて • 関数呼び出し時は以下の処理を呼び出し側が行う • スタックにスタックフレームを作成する • リターンアドレスの保存 • 受け渡す引数を確保 •
汎用レジスタに受け渡す引数を格納する ※レジスタ値の退避も呼び出し側の責任 • 関数からのリターン時は以下の処理を呼び出され側が行う • 戻り値の汎用レジスタへの格納 9
RL78 関数コール時の引数受け渡し • 基本的には汎用レジスタで引数を受け渡す • 所定の優先度に従って格納する • 入りきらない場合→スタックに格納する A X
C B … (uint8_t a, uint8_t b) a b A X C B … (uint8_t a, uint16_t b) a b (LSB) b(MSB) 引数 レジスタ 引数 レジスタ 10
関数コールの実装① ①関数の引数型に応じ、汎用レジスタへ値を格納 11
関数コールの実装② ②スタックフレームの作成 (=returnアドレスとしてmain関数のアドレスを格納) 12
関数コールの実装③ ③関数コールの実施 (=プログラムカウンタにコールする関数のアドレスをセット) 事前に設置したmain関数のブレークポイント到達まで、 呼び出した関数が実行される 13
関数コールの実装④ ④return後(=main関数にブレーク後)に、 汎用レジスタから返値を取り出す 14
発表まとめと今後 • GDBとPythonを使って作る自作テストハーネスで、 関数コールの機能が実現できた • 汎用レジスタへの引数セットとフレーム作成で 関数呼び出しを疑似的に実施 • ある程度実用的に使えるが、課題は多くできることはまだ少な い
• 対応する引数/返値の型が少ない • よくわからない動作をする(これは致命的) →ゆっくり課題をつぶしていきたい 15
参考 • 『テスト駆動開発による組み込みプログラミング』 James W. Grenning 著、オライリージャパン • GDBデバッガ マニュアル
英語版: https://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_toc.html 日本語版: https://flex.phys.tohoku.ac.jp/texi/gdb-j/gdb-j_toc.html • Renesas CC-RLコンパイラ ユーザーズマニュアル 9. 関数呼び出し仕様 https://tool-support.renesas.com/autoupdate/support/onlinehelp/ja- JP/csp/V8.07.00/CS+.chm/Compiler-CCRL.chm/Output/ccrl09c0000y.html • Renesas RL78/G14 ユーザー図マニュアル ハードウェア編 ( R01UH0186JJ0350 Rev. 3.50) 16
あぺ 17
苦労した点 • 引数・返値が全く扱えない!! • gdbのcall機能だと関数の実行がまともに扱えない • 引数が渡せない(引数に応じた振る舞いの変化がない) • 返値が返ってこない(意味不明な値が結果として返る) •
スタック領域が全く変化しない(関数呼び出しでスタック積むのでは?) • そもそも裏で何やってんの? 引数・返値なしの関数しか使えないのはさすがに困る
苦労した点 • おそらく、call実施時にgdbがダミーフレームを使うのでは? • なんかそれっぽい解説あり(確信はなし) ax bc … pc 実際のフレーム
実際のフレーム ダミーフレーム Call実施 実際のフレーム (変更なし) ダミーフレーム (削除) Call終了 コピー こっちをさわる