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バイト部分の待避/復帰が避けられない)ので、そうなっているのかも、、、
みたのですが、今度は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バイト部分の待避/復帰が避けられない)ので、そうなっているのかも、、、
- 関連記事
-
- 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)
- RL78マイコン基板(RL78/G10)|CS+(CubeSuite+)で内蔵周辺機能シミュレーションを試す (1)
2015/01/30 blog-entry-561 category: RL78 /* 16bit,8bit CISC */
| h o m e |