R152 で大月から浜松へ

突然実施

第三日曜日は、地区の朝礼が8時からある、連絡事項の後、掃除。

それが終わり、天気を確認したら、台風が去って温帯低気圧に変わり、晴天。
大月は、今回の台風では、あまり雨が降らなかった。

アトピーでバイクに長い間乗って無かったのもあって、少し遠出してみる事にした。
※アトピーが直った訳では無いが、今の季節、バイクで走っていれば、そこそこ涼しいし別の事に集中してる方が気が楽な事もある。

ルートは事前に考えていた

今回は、R152 よりも、R20 から R152 に至る途中の道が主で、「富士見パノラマリゾート」手前から、「入笠山」を抜ける林道を通り、R152 に連絡出来る。
※上記写真は、そのルート上で何とも整った風景を観たので撮影したもの。
※入笠山周辺は、マイカーの規制があるので、注意が必要なようだ、途中停車も出来ない区間がある。
※警備に止められた場合は、「伊那」に抜けると言えば大丈夫なようだ。
※規制は8時~3時までのようだ。

浜松行は急に決めた

R152 に合流したのが2時過ぎ、このまま R152 を戻って諏訪から R20 で帰るのも何だかなぁと思い、前から思っていた R152 で浜松まで行く事にした。
帰りは遅くなると思うが、どうしようも無く眠くなったらルートインとかに泊まれば良いと軽く考えてた。

WR250X は長距離のツーリングに適さない

WR250X の燃料タンクは7.4リッター程、大体5リッター消費で給油ランプが点く。
リッター30キロ程は走るので、150キロで給油が必要となる。

以前に、山中で給油しようと思ったら、GS が休みで、仕方なくそのまま戻ったが途中でガス欠になった・・
仕方なく数キロバイクを押したが、宛にしていた GS は、やはり営業しておらず、難儀していた。
※バイクを置いて、自宅まで何とか戻り、ステップワゴン(トランポ仕様にしている)を取りに行こうと考えていた。
農作業をしていたやさしい方に耕運機用に備蓄していたガソリンを別けてもらい自宅まで戻れた経緯がある。

一応、1リットル入る携行缶は持っているが、+30キロでは、場所や時間によっては無理がある。
※二つあれば安心感があるが、それなりに重い・・

結局、150キロの範囲で、大きな街にアクセス出来るようなプランじゃないとマズイ事になる・・
※夜は営業していない場合もある、大きな都市なら、セルフで24HのGSもあるが、小さい集落では夕方にはGSは閉まってしまう。

今回、R152 は「通行止め」区間があった・・

R152 は、一応「国道」だが、途中狭く、離合も困難な場所がある、一方、整備された区間は、道幅も広く、綺麗で、走っていて気持ちが良い。
そして、非常に空いている。

最初に、「地蔵峠」手前のクネクネで不通になっており「全面通行止め」となっていた。
仕方なく、戻って、県道59号との分岐(大鹿村役場)まで戻り、一旦、R153 まで出て、ガソリンを補給した。
懲りずに、県道251号を通り、「喬木 I.C.」から「程野 I.C.」を経て R152 に合流したw
※この自動車専用道路は、ほぼトンネルで、無料区間となっていた。(5キロ程)

二度目の通行止め・・

次に、「兵越峠」を抜ける手前でやはり「全面通行止め」となっていた・・・
規制看板の手前でバイクを止め文面を読んでいたら、地元の車が上がっていったので、アレ?、通れるのかな?と思い、付いていった。
そしたら、上から降りて来たキャンピングカーが、「全面通行止め」で先には行けない「浜松に抜けられない」と教えてくれた。
何でも、3日前くらいに起こったらしい・・・

うーーん、ここまで来てかぁーと思ったが仕方無いので、少し戻り、R418、県道1号を進み、「佐久間ダム」の標識がある分岐まで来た。
この時、既に暗くなっており、あまり良く考えずに「ダムの方に向かったらマズイ」のでは?と思ってしまった。
※ここで、停車して地図を確認すれば良かったが、電波の状況とか、残燃料とか、暗かったとか、面倒にも思って、あまり考えずに県道426号に行ってしまった・・
これが、今回の大失敗となった・・・
県道426号はかなりの難所で、何とか R151 までたどり着いたが、この段階で7時位?
こんな山の中だが、集落に 24H のファミマがあり、簡単な食事をした。(ファミリーマート 北設楽東栄町店)

燃料給油が急務

現在の距離(燃料消費量)から、早急に GS を見つけないとならない・・・
色々検討したが「豊橋」辺りまで抜けないと 24H のセルフは無いかもしれない、携行缶に1リッターあるので、何とかギリギリ間に合う計算。
途中、集落に GS はあったが、やはり閉まっていた。

「新庄市」に入ったら、大きな都市で、24H のセルフがあり、給油出来た、この時10時前、携行缶のガソリンは使わなかった。
※6.44リッター給油(残り800cc)

自宅に戻る

給油して、少し休んだら、気力が戻り、疲労感も少ない(クラッチ側の手も痛くない)ので、到着は夜中になるけど、自宅まで戻る事にした。
※自粛期間だし、宿泊するのも気が重い、途中色々なホテルの駐車場を見たが、かなり車が停まっていたので、宿泊してる人は意外に多いようだ。

まず、R301 で浜松(浜名湖)まで抜けた。
ここで、ファミマで休憩して、ルート検索を行ったが、大月まで戻るのに「高速で5時間」、「下道で6時間」だった。
高速使っても1時間しか変わらない?
うーーん、高速だと、WR250X は結構色々辛い!、また、途中で眠くなったら、SA まで我慢しないとならないしと思い、下道で帰る事にした。
帰りは、R1、R139 とシンプルなルートだ。

途中眠くなったらコンビニで休めるし、R1 沿いなら GS も沢山ある。

R1 は高速道路だった!

今回初めて浜松から R1 を利用したが、自動車専用道路となっており、高速道路と大差無い・・
制限速度は60キロだが、60で走ってるとバンバン抜かれるが、この時間空いているし、かなり快適、速度以外は東名と変わらない。
WR250X は、高速で100キロ連続とかだと、エンジンの回転をかなり上げないとならないし、風圧がそれなりにあり疲れる。
※70~80くらいが丁度良い。(メーターは、1割くらい低く表示するので、66キロくらいで、正確に60キロだと思う)

途中何回か休憩をして、R139に合流、富士市でガソリン補給。(午前2時、5.34リットル)
※ここから大月まで90キロ程度、給油は必要無い。

R139 で大月までー

寒くなるだろうから、今回珍しく持参したバイク用レインスーツを上下着た。

R139 はこの時間、ほぼ車はいない、そして凄く寒い!、14度。

あまりに寒いので、富士吉田で24H営業のなか卯で、少し早い朝食(牛丼とうどんのせっと)を食べ、自宅に戻ったのが4時位。

まとめ

今回、それなりに疲れたが、峠を満喫した、軽量バイクの楽しみは、狭い林道w

R152 は面白い、狭い林道と、そこそこ広い整備された道で、緩急があり飽きないし、昼間でも下手なマイカーが少ない!
昼間なら、休憩スポットも色々ある。

また、細々と整備も進められており、完成が待たれる・・

二度の通行止めで、消化不良の面もあるので、通行止め解消の折には、もう一度通っていない部分を含め挑戦したい!
次は、もっと早く出発して、宿泊を前提にしたい。

RX マイコン I2C モニター

I2C モニター

RX マイコンのサンプルで中途のプロジェクトを更新した。

I2C デバイスを接続して、操作を行うサンプルだが、雛形は作ったが、中身は無い状態だった。
※サンプルはそれなりに多いので、作ったつもりで忘れている事もあるw

それを、ある程度実装した。

※実験は、RX72T ボードで行った、IICA ペリフェラルを利用している。


対話形式で、I2C デバイスと通信する

とりあえず、最低限必要なコマンドを実装。

コマンド パラメーター 機能
scan start end I2C デバイスをスキャンする
adr address 操作を行う I2C デバイスのアドレスを設定
r num I2C からデータを受け取る(recv)
s data... I2C へデータを書き込む(send)

操作画面

操作の入出力は、シリアル接続されたターミナルで行う。

接続したデバイスは、DS3231 のモジュールで、24C32(EEPROM)も載っている。

起動時:

Start I2C sample for 'RX72T' 200[MHz]
SCI Baud rate (set):  115200
SCI Baud rate (real): 115287 (0.08 [%])
CMT rate (set):  100 [Hz]
CMT rate (real): 100 [Hz] (0.00 [%])
I2C Start ok: (intrrupt level = 0)
#

スキャン:

# scan
Ditect I2C address: 0x57 ( 87, 0b1010111)
Ditect I2C address: 0x68 (104, 0b1101000)
  Ditect I2C Device(s): 2
#

書き込みと読出し:

# adr 0x68
# s 0
# r 16
43 39 03 06 03 09 21 00 00 00 00 00 00 00 00 88

# s 0
# r 16
50 39 03 06 03 09 21 00 00 00 00 00 00 00 00 88

#
  • I2C アドレス設定(0x68)
  • アドレスレジスタを設定(0)
  • 16バイトの読出し
  • 秒カウンタが変化している。(43 ---> 50)

まとめ

とりあえず、動作しているので、コミットしてある。

まだまだ、初期段階なので、今後拡張していきたい。

IICA の割り込みモードも完成させたい。

Makefile を共通化

Makefile 共通化

RX マイコンの各プロジェクトで、Makefile で共有出来る部分を抜き出して、共通化を行った。

今まで、同じような「手順」を各プロジェクト毎にコピーしていたが、二度手間だし、プロジェクト数が多く、作業が大変だった。
※Makefile を複数に別けたく無かったとゆーこだわりがあったのだが、現在のように手順がそこそこ複雑だと、そうする「こだわり」はあまり意味が無い。

共通部分

# -*- tab-width : 4 -*-
#=======================================================================
#   @file
#   @brief  RX microcontroller share Makefile
#   @author 平松邦仁 (hira@rvf-rc45.net)
#   @copyright  Copyright (C) 2021 Kunihito Hiramatsu @n
#               Released under the MIT license @n
#               https://github.com/hirakuni45/RX/blob/master/LICENSE
#=======================================================================

# System include path for each environment
ifeq ($(OS),Windows_NT)
SYSTEM := WIN
# C++.boost root
LOCAL_PATH  =   /mingw64
else
  UNAME := $(shell uname -s)
  ifeq ($(UNAME),Linux)
    SYSTEM := LINUX
    LOCAL_PATH = /usr/local
  endif
  ifeq ($(UNAME),Darwin)
    SYSTEM := OSX
    OSX_VER := $(shell sw_vers -productVersion | sed 's/^\([0-9]*.[0-9]*\).[0-9]*/\1/')
    LOCAL_PATH = /opt/local
  endif
endif

まず、これは、Windows、Linux、OS-X の環境を判断して、微妙な違いを吸収する。
※一番重要な事は、boost のパスを各環境で同じように扱う事。


LIB_ROOT    =   ../../rxlib/lib

INC_SYS     =   ../../rxlib/include $(LOCAL_PATH)/include

PROG_VERIFY = --verify
  • LIB_ROOT は、RX マイコン専用ライブラリのパスを設定している。
  • INC_SYS は、RX マイコン専用ライブラリのインクルードパスと、ローカルのインクルードパス(boost)などを設定している。
  • PROG_VERIFY は、rx_prog でフラッシュ書き込みする際に、「VERIFY」を行う場合のキーワードとなっている。
  • RX24T は、通常の手順で、VERIFY が行われない為、無効にする必要がある。

ifeq ($(RX_DEF),SIG_RX24T)
  RX_CPU = RX24T
  RX_OPT = v2
  LDSCRIPT  =   ../../RX24T/$(DEVICE).ld
  PROG_VERIFY =
endif

ifeq ($(RX_DEF),SIG_RX64M)
  RX_CPU = RX64M
  RX_OPT = v2
  LDSCRIPT  =   ../../RX64M/$(DEVICE).ld
endif

ifeq ($(RX_DEF),SIG_RX71M)
  AS_OPT    +=  --defsym MEMWAIT=1
  RX_CPU = RX71M
  RX_OPT = v2
  LDSCRIPT  =   ../../RX71M/$(DEVICE).ld
endif

ifeq ($(RX_DEF),SIG_RX65N)
  LIB_ROOT += ../../RX600/drw2d
  INC_APP +=  ../../RX600/drw2d/inc/tes
  USER_LIBS += drw2d
  RX_CPU = RX65N
  RX_OPT = v2
  LDSCRIPT  =   ../../RX65x/$(DEVICE).ld
endif

ifeq ($(RX_DEF),SIG_RX66T)
  RX_CPU = RX66T
  RX_OPT = v3
  LDSCRIPT  =   ../../RX66T/$(DEVICE).ld
endif

ifeq ($(RX_DEF),SIG_RX72T)
  RX_CPU = RX72T
  RX_OPT = v3
  LDSCRIPT  =   ../../RX72T/$(DEVICE).ld
endif

ifeq ($(RX_DEF),SIG_RX72N)
  LIB_ROOT += ../../RX600/drw2d
  INC_APP +=  ../../RX600/drw2d/inc/tes 
  USER_LIBS += drw2d
  RX_CPU = RX72N
  RX_OPT = v3
  LDSCRIPT  =   ../../RX72N/$(DEVICE).ld
endif

ifeq ($(RX_DEF),SIG_RX72M)
  LIB_ROOT += ../../RX600/drw2d
  INC_APP +=  ../../RX600/drw2d/inc/tes
  USER_LIBS += drw2d
  RX_CPU = RX72M
  RX_OPT = v3
  LDSCRIPT  =   ../../RX72M/$(DEVICE).ld
endif

この条件文で、RX マイコン毎に異なる設定を行っている。
現状では、「SIG_xxx」のキーワード毎に行っているが、将来的には、DEVICE で IC の型番を設定しているので、それに従って行うのが妥当だと思う。

※型番で行えば、ピン数の違いによる変更をソースコードへ伝達する事が出来る。

RX71M だけは、ちょっと特殊で、スーパーバイザーモードでしかアクセス出来ないレジスタがある。
そこで、そのレジスタを、start.s アセンブラブログラム内で行っている。「--defsym MEMWAIT=1」

FreeRTOS の場合、ユーザーモードに移行しない事が重要だが、それは、各プロジェクト毎に設定する。

# for FreeRTOS option
AS_OPT      =   --defsym NOT_USER=1

# Renesas GNU-RX gcc compiler version check
TARGET_ISA_TEXT := $(shell rx-elf-gcc --target-help | grep ISA)

# Renesas GNU-RX (8.3.0) compiler 
ifeq ($(TARGET_ISA_TEXT),)
  # for gcc-7.5.0 current gcc source build
  AS_DEFS       =   -mcpu=rx600
  CC_DEFS       =   -mcpu=rx600 -Wa,-mcpu=rxv2
  CP_DEFS       =   -mcpu=rx600
else # Renesas GNU-RX gcc 8.3.0
  AS_DEFS       =   -misa=$(RX_OPT)
  CC_DEFS       =   -misa=$(RX_OPT)
  CP_DEFS       =   -misa=$(RX_OPT)
endif

これは、Renesas GNU-RX gcc コンパイラと、プレーンな gcc コンパイラで、オプションが異なるので、それを自動判別する。


# You should not have to change anything below here.
AS          =   rx-elf-as
CC          =   rx-elf-gcc
CP          =   rx-elf-g++
AR          =   rx-elf-ar
LD          =   rx-elf-ld
OBJCOPY     =   rx-elf-objcopy
OBJDUMP     =   rx-elf-objdump
SIZE        =   rx-elf-size

AFLAGS      =   $(AS_OPT) $(AS_DEFS)
CFLAGS      =   -std=gnu99 $(CC_OPT) $(OPTIMIZE) $(CC_DEFS) $(DEFS)
PFLAGS      =   -std=c++17 $(CP_OPT) $(OPTIMIZE) $(CP_DEFS) $(DEFS)
FLAGS       = $(AS_OPT) $(AS_DEFS) $(CC_OPT) $(CP_OPT) $(OPTIMIZE) $(CC_DEFS) $(CP_DEFS) $(DEFS)

# FLAGS_CMP := $(shell cat $(TARGET).opt)

override LDFLAGS = $(MCU_TARGET) -nostartfiles -Wl,-Map,$(TARGET).map -T $(LDSCRIPT)

OBJCOPY_OPT =   --srec-forceS3 --srec-len 32

OBJECTS =   $(addprefix $(BUILD)/,$(patsubst %.s,%.o,$(ASOURCES))) \
            $(addprefix $(BUILD)/,$(patsubst %.c,%.o,$(CSOURCES))) \
            $(addprefix $(BUILD)/,$(patsubst %.cpp,%.o,$(PSOURCES)))

DOBJECTS =  $(addprefix $(BUILD)/,$(patsubst %.c,%.o,$(CSOURCES))) \
            $(addprefix $(BUILD)/,$(patsubst %.cpp,%.o,$(PSOURCES)))

DEPENDS =   $(patsubst %.o,%.d, $(DOBJECTS))

# all, clean: optional make command
.PHONY: all clean clean_depend run text
.SUFFIXES :
.SUFFIXES : .hpp .s .h .c .cpp .d .o

all: $(BUILD) $(TARGET).elf text

$(TARGET).elf: $(OBJECTS) $(LDSCRIPT) Makefile
    $(CC) $(LDFLAGS) $(LIBINCS) -o $@ $(OBJECTS) $(LIBS)
    $(SIZE) $@

$(BUILD)/%.o: %.s
    mkdir -p $(dir $@); \
    $(AS) -c $(AOPT) $(AFLAGS) $(AINCS) -o $@ $<

$(BUILD)/%.o : %.c
    mkdir -p $(dir $@); \
    $(CC) -c $(COPT) $(CFLAGS) $(CINCS) $(CCWARN) -o $@ $<

$(BUILD)/%.o : %.cpp
    mkdir -p $(dir $@); \
    $(CP) -c $(POPT) $(PFLAGS) $(PINCS) $(CPWARN) -o $@ $<

$(BUILD)/%.d: %.c
    mkdir -p $(dir $@); \
    $(CC) -MM -DDEPEND_ESCAPE $(COPT) $(CFLAGS) $(APPINCS) $< \
    | sed 's/$(notdir $*)\.o:/$(subst /,\/,$(patsubst %.d,%.o,$@) $@):/' > $@ ; \
    [ -s $@ ] || rm -f $@

$(BUILD)/%.d: %.cpp
    mkdir -p $(dir $@); \
    $(CP) -MM -DDEPEND_ESCAPE $(POPT) $(PFLAGS) $(APPINCS) $< \
    | sed 's/$(notdir $*)\.o:/$(subst /,\/,$(patsubst %.d,%.o,$@) $@):/' > $@ ; \
    [ -s $@ ] || rm -f $@

clean:
    rm -rf $(BUILD) $(TARGET).elf $(TARGET).mot $(TARGET).lst $(TARGET).map

clean_depend:
    rm -f $(DEPENDS)

これは、gcc の設定で、従属規則を自動生成する仕組みを内包する。


lst: $(TARGET).lst

%.lst: %.elf
    $(OBJDUMP) -h -S $< > $@

# Rules for building the .text rom images

text: mot lst

lst: $(TARGET).lst
mot: $(TARGET).mot
bin: $(TARGET).bin

%.lst: %.elf
    $(OBJDUMP) -h -S $< > $@

%.mot: %.elf
    $(OBJCOPY) $(OBJCOPY_OPT) -O srec $< $@

%.bin: %.elf
    $(OBJCOPY) -O binary $< $@

これは、リンカーで実行バイナリーを作成後、リストファイル、モトローラーファイル、バイナリーファイルを作成する手順だ。


# Serial Flash write 
run:
    $(MAKE)
    rx_prog -d $(RX_CPU) --progress --erase --write $(PROG_VERIFY) $(TARGET).mot

最後は、シリアル接続で、フラッシュ書き込みを行うツールの設定などになっている。

個別部分

上記のように、共通出来る部分を追い出したので、個別部分はシンプルとなった。

# -*- tab-width : 4 -*-
#=======================================================================
#   @file
#   @brief  RX72N Makefile
#   @author 平松邦仁 (hira@rvf-rc45.net)
#   @copyright  Copyright (C) 2020, 2021 Kunihito Hiramatsu @n
#               Released under the MIT license @n
#               https://github.com/hirakuni45/RX/blob/master/LICENSE
#=======================================================================
TARGET      =   raytracer_sample

DEVICE      =   R5F572NN

RX_DEF      =   SIG_RX72N

BUILD       =   release
# BUILD     =   debug

VPATH       =   ../../

ASOURCES    =   common/start.s

CSOURCES    =   common/init.c \
                common/vect.c \
                common/syscalls.c

PSOURCES    =   RAYTRACER_sample/main.cpp \
                graphics/font8x16.cpp \
                graphics/color.cpp \
                common/stdapi.cpp

USER_LIBS   =

USER_DEFS   =

INC_APP     =   . ../ ../../

AS_OPT      =

CP_OPT      =   -Wall -Werror \
                -Wno-unused-variable \
                -Wno-unused-function \
                -fno-exceptions

CC_OPT      =   -Wall -Werror \
                -Wno-unused-variable \
                -fno-exceptions

ifeq ($(BUILD),debug)
    CC_OPT += -g -DDEBUG
    CP_OPT += -g -DDEBUG
    OPTIMIZE = -O0
endif

ifeq ($(BUILD),release)
    CC_OPT += -DNDEBUG
    CP_OPT += -DNDEBUG
    OPTIMIZE = -O3
endif

-include ../../common/makefile

-include $(DEPENDS)

これは、RX72T の RAYTRACER_sample の Makefile で、基本、リンクするファイルの記述が殆どだ。

リリースビルドと、デバッグビルドの違いで切り替える部分は共通化しなかった。
最適化を変えたり、プロジェクト毎に微妙な違いを許容する事が出来るように配慮した。


まとめ

共通化する過程で、オプションなどを変更した場合に、フルコンパイルが自動で行えるように出来ないか検討したが、make を完全に理解していない為、思ったように作れなかった・・

これは今後の課題にしたいと思う。