なんとかなるさね

マイコンをネタにブログを始めてみました


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変数アクセスの衝突防止の為のアセンブラコードは、結局、
お蔵入りとなりました。

関連記事

2015/01/31   blog-entry-562   category: RL78 /* 16bit,8bit CISC */

go page top