RL78マイコン|volatile変数アクセスの衝突防止(結局はDI/EIですが) (2)
3つ前のエントリでvolatile変数アクセスの衝突防止の為のアセンブラコードを書いてみたのですが、2つ前の
エントリでアセンブラコードを書かなくてもC言語記述だけでも出来ることに気付きました。今回、どちらが
小さなコードになるか比較してみました。といっても、やったことは単純で、以下の(1)と(2)の記述に対して
3つ前のエントリで作成したmain()関数のサイズをそれぞれ調べただけです。その結果、アセンブラコードを
使った場合の方がコードが大きくなることが分かりました。(アセンブラコードは、お蔵入りとなりました。)
(1) 3つ前のエントリのアセンブラコードを使った場合
#define BEGIN_NOINTERRUPTS(a) *(a) = begin_noInterrupts()
#define END_NOINTERRUPTS(a) end_noInterrupts(a)
→ main()関数のサイズ = 96バイト
(2) 2つ前のエントリのC言語記述を使った場合
#define PSW (*(volatile uint8_t *)0xffffa)
#define BEGIN_NOINTERRUPTS(a) {*(a) = PSW; DI();}
#define END_NOINTERRUPTS(a) {PSW = (a);}
→ main()関数のサイズ = 92バイト
コンパイラが生成したリスティングファイルを見て分かったのは、アセンブラコードを使った場合には関数
呼び出しの形になるので、その分コードが増えてしまうということでした。
(1)の場合のリストファイル
; line 79 : BEGIN_NOINTERRUPTS( &psw_i );
$DGL 0,12
00021 RFC000000 call !!_begin_noInterrupts ;[INF] 4, 3
00025 62 mov a,c ;[INF] 1, 1
00026 9C05 mov [hl+5],a ; psw_i ;[INF] 2, 1
; line 80 : tick = V_timer_tick;
$DGL 0,13
00028 RDB0200 movw bc,!_V_timer_tick+2 ;[INF] 3, 1
0002B RAF0000 movw ax,!_V_timer_tick ;[INF] 3, 1
0002E BB movw [hl],ax ; tick ;[INF] 1, 1
0002F 33 xchw ax,bc ;[INF] 1, 1
00030 BC02 movw [hl+2],ax ; tick ;[INF] 2, 1
; line 81 : END_NOINTERRUPTS( psw_i );
$DGL 0,14
00032 8C05 mov a,[hl+5] ; psw_i ;[INF] 2, 1
00034 318F sarw ax,8 ;[INF] 2, 1
00036 RFC000000 call !!_end_noInterrupts ;[INF] 4, 3
0003A
(2)の場合のリストファイル
; line 79 : BEGIN_NOINTERRUPTS( &psw_i );
$DGL 0,12
00021 ??bb01_main:
00021 8EFA mov a,0FFFFAH ;[INF] 2, 1
00023 9C05 mov [hl+5],a ; psw_i ;[INF] 2, 1
00025 717BFA di ;[INF] 3, 4
00028 ??eb01_main:
; line 80 : tick = V_timer_tick;
$DGL 0,13
00028 RDB0200 movw bc,!_V_timer_tick+2 ;[INF] 3, 1
0002B RAF0000 movw ax,!_V_timer_tick ;[INF] 3, 1
0002E BB movw [hl],ax ; tick ;[INF] 1, 1
0002F 33 xchw ax,bc ;[INF] 1, 1
00030 BC02 movw [hl+2],ax ; tick ;[INF] 2, 1
; line 81 : END_NOINTERRUPTS( psw_i );
$DGL 0,14
00032 8C05 mov a,[hl+5] ; psw_i ;[INF] 2, 1
00034 9EFA mov 0FFFFAH,a ;[INF] 2, 1
00036
ということで、3つ前のエントリで書いたvolatile変数アクセスの衝突防止の為のアセンブラコードは、結局、
お蔵入りとなりました。
エントリでアセンブラコードを書かなくてもC言語記述だけでも出来ることに気付きました。今回、どちらが
小さなコードになるか比較してみました。といっても、やったことは単純で、以下の(1)と(2)の記述に対して
3つ前のエントリで作成したmain()関数のサイズをそれぞれ調べただけです。その結果、アセンブラコードを
使った場合の方がコードが大きくなることが分かりました。(アセンブラコードは、お蔵入りとなりました。)
(1) 3つ前のエントリのアセンブラコードを使った場合
#define BEGIN_NOINTERRUPTS(a) *(a) = begin_noInterrupts()
#define END_NOINTERRUPTS(a) end_noInterrupts(a)
→ main()関数のサイズ = 96バイト
(2) 2つ前のエントリのC言語記述を使った場合
#define PSW (*(volatile uint8_t *)0xffffa)
#define BEGIN_NOINTERRUPTS(a) {*(a) = PSW; DI();}
#define END_NOINTERRUPTS(a) {PSW = (a);}
→ main()関数のサイズ = 92バイト
コンパイラが生成したリスティングファイルを見て分かったのは、アセンブラコードを使った場合には関数
呼び出しの形になるので、その分コードが増えてしまうということでした。
(1)の場合のリストファイル
; line 79 : BEGIN_NOINTERRUPTS( &psw_i );
$DGL 0,12
00021 RFC000000 call !!_begin_noInterrupts ;[INF] 4, 3
00025 62 mov a,c ;[INF] 1, 1
00026 9C05 mov [hl+5],a ; psw_i ;[INF] 2, 1
; line 80 : tick = V_timer_tick;
$DGL 0,13
00028 RDB0200 movw bc,!_V_timer_tick+2 ;[INF] 3, 1
0002B RAF0000 movw ax,!_V_timer_tick ;[INF] 3, 1
0002E BB movw [hl],ax ; tick ;[INF] 1, 1
0002F 33 xchw ax,bc ;[INF] 1, 1
00030 BC02 movw [hl+2],ax ; tick ;[INF] 2, 1
; line 81 : END_NOINTERRUPTS( psw_i );
$DGL 0,14
00032 8C05 mov a,[hl+5] ; psw_i ;[INF] 2, 1
00034 318F sarw ax,8 ;[INF] 2, 1
00036 RFC000000 call !!_end_noInterrupts ;[INF] 4, 3
0003A
(2)の場合のリストファイル
; line 79 : BEGIN_NOINTERRUPTS( &psw_i );
$DGL 0,12
00021 ??bb01_main:
00021 8EFA mov a,0FFFFAH ;[INF] 2, 1
00023 9C05 mov [hl+5],a ; psw_i ;[INF] 2, 1
00025 717BFA di ;[INF] 3, 4
00028 ??eb01_main:
; line 80 : tick = V_timer_tick;
$DGL 0,13
00028 RDB0200 movw bc,!_V_timer_tick+2 ;[INF] 3, 1
0002B RAF0000 movw ax,!_V_timer_tick ;[INF] 3, 1
0002E BB movw [hl],ax ; tick ;[INF] 1, 1
0002F 33 xchw ax,bc ;[INF] 1, 1
00030 BC02 movw [hl+2],ax ; tick ;[INF] 2, 1
; line 81 : END_NOINTERRUPTS( psw_i );
$DGL 0,14
00032 8C05 mov a,[hl+5] ; psw_i ;[INF] 2, 1
00034 9EFA mov 0FFFFAH,a ;[INF] 2, 1
00036
ということで、3つ前のエントリで書いたvolatile変数アクセスの衝突防止の為のアセンブラコードは、結局、
お蔵入りとなりました。
- 関連記事
-
- RL78マイコン|プログラムが変なところでブレークした時にどこまでデバッグ出来るか? (5)
- RL78マイコン|フルスペックエミュレータ(IECUBE)の価格
- RL78マイコン|プログラムが変なところでブレークした時にどこまでデバッグ出来るか? (4)
- RL78マイコン|プログラムが変なところでブレークした時にどこまでデバッグ出来るか? (3)
- RL78マイコン|プログラムが変なところでブレークした時にどこまでデバッグ出来るか? (2)
- RL78マイコン|プログラムが変なところでブレークした時にどこまでデバッグ出来るか? (1)
- RL78マイコン|プログラムが変なところでブレークする様子をシミュレータで見てみた
- RL78マイコン|volatile変数アクセスの衝突防止(結局はDI/EIですが) (2)
- RL78マイコン|KURUMIスケッチ環境でのvolatile変数アクセスの衝突防止の実装 → 無かった
- RL78マイコン|本家Arduinoライブラリでのvolatile変数アクセスの衝突防止の実装
- RL78マイコン|volatile変数アクセスの衝突防止(結局はDI/EIですが) (1)
- RL78マイコン|32bit変数へのアクセスはアトミックじゃない
- RL78マイコン(G12,G13,G14)|CS+(CubeSuite+)でインターバルタイマシミュレーションを試す
- RL78マイコン基板(RL78/G10)|CS+(CubeSuite+)で内蔵周辺機能シミュレーションを試す (3)
- RL78マイコン基板(RL78/G10)|CS+(CubeSuite+)で内蔵周辺機能シミュレーションを試す (2)
2015/01/31 blog-entry-562 category: RL78 /* 16bit,8bit CISC */
| h o m e |