なんとかなるさね

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


RL78マイコン|KURUMIスケッチ環境でのvolatile変数アクセスの衝突防止の実装 → 無かった 

前のエントリで本家Arduino IDE 1.0.6のライブラリでのvolatile変数アクセスの衝突防止の為のコードを見て
みたのですが、今度はKURUMI基板用Arduino互換IDE 0.4.2に含まれているKURUMIスケッチ環境V1.05相当
ライブラリでの実装を見てみました。ところが、衝突防止の為のコードがありませんでした。ソースコードは
以下の通りでした。

ファイル: ide4gr-0.4.2\hardware\arduino\rl78\cores\arduino\RLduino78_basic.cpp
内容(抜粋):

/** ************************************************************************
* @defgroup group5 時間に関する関数
*
* @{
***************************************************************************/
/**
* プログラムの実行を開始した時から現在までの時間(ms)返します。
*
* プログラムの実行を開始した時から現在までの時間をミリ秒単位で返します。
* 約50日間でオーバーフローし、ゼロに戻ります。
*
* @return 実行中のプログラムがスタートしてからの時間を返却します。
*
* @attention なし
***************************************************************************/
unsigned long millis(void)
{
    unsigned long u32ms;

    FUNC_MUTEX_LOCK;

#ifdef USE_RTOS
    u32ms = xTaskGetTickCount() / portTICK_RATE_MS;
#else
    u32ms = g_u32timer_millis;
#endif

    FUNC_MUTEX_UNLOCK;

    return u32ms;
}


この中のFUNC_MUTEX_LOCKやFUNC_MUTEX_UNLOCKは同じファイルで以下の通り定義されていますが、
USE_RTOSが定義されていませんので、これらは空になります。

#ifdef USE_RTOS
#define FUNC_MUTEX_LOCK     xSemaphoreTake(xFuncMutex, portMAX_DELAY)   //!< 関数用MUTEX LOCKマクロ
#define FUNC_MUTEX_UNLOCK   xSemaphoreGive(xFuncMutex)                  //!< 関数用MUTEX UNLOCKマクロ
#else
#define FUNC_MUTEX_LOCK                                                 //!< 関数用MUTEX LOCKマクロ
#define FUNC_MUTEX_UNLOCK                                               //!< 関数用MUTEX UNLOCKマクロ
#endif


結局、コードとしては以下と同じであり、volatile変数アクセスの衝突防止の為のコードが無いことになります。

unsigned long millis(void)
{
    unsigned long u32ms;

    u32ms = g_u32timer_millis;

    return u32ms;
}


念の為、KURUMI基板用Arduino互換IDE 0.4.2の環境設定ファイルを書き換えてリスティングファイルを生成
させてみましたが、やはり(というか当然ながらというか)、以下のように衝突防止の為のコードはありません。

   1                             r8 = 0xffef0
   2                             r16 = 0xffee8
   3                             r24 = 0xffee0
   4                             r9 = 0xffef1
   5                             r17 = 0xffee9
   6                             r25 = 0xffee1
   7                             r10 = 0xffef2
   8                             r18 = 0xffeea
   9                             r26 = 0xffee2
  10                             r11 = 0xffef3
  11                             r19 = 0xffeeb
  12                             r27 = 0xffee3
  13                             r12 = 0xffef4
  14                             r20 = 0xffeec
  15                             r28 = 0xffee4
  16                             r13 = 0xffef5
  17                             r21 = 0xffeed
  18                             r29 = 0xffee5
  19                             r14 = 0xffef6
  20                             r22 = 0xffeee
  21                             r30 = 0xffee6
  22                             r15 = 0xffef7
  23                             r23 = 0xffeef
  24                             r31 = 0xffee7

途中省略

2050                                   .section    .text.millis,"ax",@progbits
2051                                   .global _millis
2053                               _millis:
2054                               .LFB84:
1441:E:\tools\micom\Renesas\ide4gr-0.4.2\hardware\arduino\rl78\cores\arduino\RLduino78_basic.cpp **** {
2055                                   .loc 1 1441 0 is_stmt 1
2056                               .LBB72:
1449:E:\tools\micom\Renesas\ide4gr-0.4.2\hardware\arduino\rl78\cores\arduino\RLduino78_basic.cpp ****   u32ms = g_u32timer_millis;
2057                                   .loc 1 1449 0
2058 0000 AF 00 00                     movw    ax, !_g_u32timer_millis
2059 0003 BD F4                        movw    r12, ax
2060 0005 AF 00 00                     movw    ax, !_g_u32timer_millis+2
2061 0008 BD F6                        movw    r14, ax
2062                               .LVL137:
2063                               .LBE72:
1455:E:\tools\micom\Renesas\ide4gr-0.4.2\hardware\arduino\rl78\cores\arduino\RLduino78_basic.cpp **** }
2064                                   .loc 1 1455 0
2065 000a AD F4                        movw    ax, r12
2066 000c BD F0                        movw    r8, ax
2067 000e AD F6                        movw    ax, r14
2068 0010 BD F2                        movw    r10, ax
2069 0012 D7                           ret
2070                               .LFE84:


う~ん、、、

追記 : 雑感

ちなみに、RL78 GCCは16bitレジスタが16本あるという発想でコンパイルするように設計されているのかな?
(その内の4本はAX,BC,DE,HLであり、残り12本は内蔵RAM中のSADDR領域と呼ばれる特別な領域(サイズは
224バイト(その中にレジスタバンク0,1,2,3のAX,BC,DE,HLを含む))の一部(24バイト)をレジスタに見立てて
いる? でも、リスティングファイルのアドレス配置だとレジスタバンク切り替えが出来なくなるような、、、)

追記 : 雑感その2

よくよく考えてみると、この発想でコンパイルする場合はレジスタバンク切り替えを行うメリットが殆ど無い
(割り込みルーチンの先頭/末尾で24バイト部分の待避/復帰が避けられない)ので、そうなっているのかも、、、

関連記事

2015/01/30   blog-entry-561   category: RL78 /* 16bit,8bit CISC */

go page top