WR250Xで見知らぬ林道を巡る

google map を観ていて気になった

国道411号線の柳沢峠にある市営駐車場に林道の入り口がある。
※411号、柳沢峠の先、塩山方面は、非常に整備されたワインディングで中高速コーナーの連続なので、わざわざ林道に行くのは一部の変態だけとおもうけどw

google map で確認すると、途中で道は途切れていて、行っても引き返すだけと思っていた。
だけど、航空写真で見ると、どうやら続きが出来ており、どこかに抜けられそうだと思っていた。
※3月の終わりころ、行ってみたら、ゲートが締まっていて、冬季閉鎖だった。
通常、4月末には冬季閉鎖は解除されるので、もう一度トライしてみた。


※どうやら、この林道は「竹森線」と言うらしい~

林道とは言え、舗装されており、コンデションもそれ程悪く無く(かなり綺麗)道幅も普通だ(離合は難しいけど・・)。
ただ、落ち葉、コケなどもあるので、走行には注意が必要なのは言うまでも無い。

林道の峠からは富士山が良く見える

※発電機が映っているが、違法無線の監視を行っていた。

この林道、殆ど車を観ないので、あまり知られていない&利用する人が極端に少ないと思えるのだが、最近開通した部分が非常に綺麗な舗装で、かなり楽しい!

軽量バイクの為にある舗装林道だ!と思える程

峠を越えると、下りになる、それなりに長いし、コーナーも多いし、面白い!
対向車は少ないとは言え「ゼロ」では無いので、ブラインドでは、カーブミラーで確認、スピードのコントロール、など最新の注意は必要。

ある程度降りたらT字路にぶつかり「竹森線」は終了

T字路は、「鈴庫山線」に接続している。
左は、「塩山方面」で、県道207号に接続していると思う(今回、そちらは試していない)こちらの道はかなり新しい~
右は「三富方面」で、国道140号に接続しているようだ。

三富方面は途中分岐がある

この方面にも「峠」があり、やはり富士山が綺麗に見えるポイントがある。
そして分岐がある。
右に上がる道も国道140号に接続している(民芸茶屋 清水の辺りに接続する)が、終盤、細くて、かなり荒れた林道が2キロ位続くので、あまりお勧めは出来ない(軽自動車なら大丈夫だが、乗用車だと難儀するかもしれない)

直進して、ゲートを過ぎると直ぐに道が細くなり、多少荒れている、さらに進むと、途中、舗装されていない道が数百メートルあるが、まぁ何とかなる(リッターバイクとかだと多少キツイかもしれないw)

そして、国道140号に接続する

国道140号から、国道411号に行くには、通常なら、フルーツラインを通って行くのが王道だと思うが、この林道経由で行く事も出来る。
ただ、林道スキー以外にはあまり刺さらないと思うケドw、道が綺麗で長くて楽しい!(途中の悪路はご愛敬w)

久しぶりの県道31号

帰りは、140号を通り、久しぶりに県道31号を楽しんだ~
140号側からの登りは、道幅も広く、中速コーナーも多く、それなりに楽しい。
「太良峠」から下りは、道幅は狭い場所も多く、注意を要するが、広くて綺麗な舗装の区間もあり、かなり楽しめる。
武田神社を過ぎると、街中で、信号も多く、平均速度も下がるけど、ここは我慢して、なるべく空いた道を選んで、国道20号まで出た。

国道137号から県道708号、御坂峠へ

国道20号から、国道137号に入って、セブンとエネオスが合体したスタンドでガソリンを補給した。(6リッター)

国道137号を富士吉田方面に行くと、途中、長いトンネルがあるが、その手前で、トンネルを使わない峠道(県道708号)がある。
県道708号も、峠まで登ると狭いトンネルがあり、抜けると、「天下茶屋」を通り過ぎ、少し降りた処に、林道西川新倉線に分岐する処がある。
ここは、少し進むと、登山客が多く利用する駐車場があり、そこを抜けて進む。
しばらく登ると、ビュースポットがある。

富士山河口湖ビュースポット

通常、午後は、富士山に雲がかかり綺麗に見えない事が多いが、今日は、風が強く寒いくらいで、雲が掛かっていなかった。

何故かゲートが閉鎖されていた・・・

この林道は、富士吉田市内に抜ける事が出来る、しかし「増田誠顕彰碑」の近くにゲートがあり、閉鎖されていた・・・
えーーー、ここまで来てーーー・・・
ゲートの右の隙間を無理やり通れば、250のバイクなら抜けられそうではあったが、失敗した場合、谷に落ちそうだった為、自重して、結局戻る事にした・・・

県道708号まで戻り、県道を下り(そこそこ道が良く、車はいなかったので、楽しい!)
国道137号まで戻り(トンネル出口付近に合流する)市内に行く。
本当なら、もっと速く市内に着いたハズなのに40分くらいロスした・・・

沼津魚がし鮨 流れ鮨 富士吉田店

少し遅いが、朝飯が遅かったので、昼食相当w
値段はそれなりに高いが、ネタが良いので、行ってみたかった。
普段食べた事が無い、白身系のネタを数種類食べた、中々美味しかった~
※4毒(小麦、植物油、乳製品、甘い物)を抜いているので、外食は、かなり限られる。
まぁ寿司も、砂糖はそれなりに使っていると思うけど、「良し」としている。

最後に「北口本宮冨士浅間神社」に参拝

参拝して、折角なので、「御朱印」を賜った。

参拝した時間は4時を過ぎていたが、参拝して大月に戻った。

まとめ

今日は、天気は良いものの、風が強く、少し肌寒かったが、中々充実したツーリングだった。
WR250Xも、タイヤ交換して、安心感があるが、α13は、加重をちゃんとかけなとグリップしない感じがある。
※加重が抜けると滑るようだ、注意しないと・・・

それと、ブレーキの握りに違和感がある。
握ると少し、ギシギシする・・・
マスターシリンダーをOHすれば直るのか?
又は、マスターを交換する事になるのか?
少し調べないと・・・

WR250X のタイヤ交換(中古 α13-SP)

 久しぶりのタイヤ交換

バイクに乗る機会が減った為、前回から2年以上経っている。
α-14 は、スリップサインが出て、そろそろ限界に近く、交換時期となっている。
※何故か、フロントが 110 では無く、120 サイズとなっていた?

中古の α13-SP に組み替え

2年くらい前に、もて耐で使っていた (CBR250RR) タイヤを貰っていた。
ちょっと時間が経ちすぎて、少し硬いが、まぁ街乗りなので問題無いだろうと思ってる。
これから暖かい時期でもあるし、何とかなるだろう~
※最近の流行りは、ダンロップなら「Q5」とかだろうと思うが、前後入れ替えるとそれなりの金額になる。

レースでは、3~4時間くらい使ったら、美味しい部分は無くなっているので、交換するのは割と常識となっている。
「山」はまだ十分あり、どちらかと言うと中心よりサイド側が減りが多い。
リッターバイクなどパワーがあるバイクだと、リアのセンターはそれなりに減るが、250cc の場合は、それ程センターに負担がかからない。

中古とは言え、一応レース用タイヤなので、ちゃんと温めれば、街中でもそれなりに食うと思う。
まぁ、ガチで峠を攻めたりしないので、十分だと思えるw
路面がぬれていたり、急な雨とかだと、多少危ないが、十分注意していれば大丈夫。
※これは当然自己責任の範疇

DUNLOP SPORTMAX α13-SP

前後 サイズ 扁平率 直径(インチ)
フロント 110 70 17
リア 150 60 17

リアが、150/60 だが(標準は 140/70)WR250X の場合、ギリで、チェーンに当たらないので、何とか大丈夫な感じ。
扁平率が 60 なので、多少乗り方を調整する必要があるかもしれない。


 フロントの交換でやらかした・・・

中古で硬たかったので、意外に苦労した。
そして「やらかす」、硬かった為、十分に潰せていないのもあって、フロントを組んだ時、タイヤレバーでチューブを挟み、パンクさせてしまった・・・
※組み終わって10分もしたら「ぺしゃんこ」になってた・・・
組む時、少し空気を入れておけば、避けられたミスだった・・・

しかし、以前にリア側でタッピングビスが刺さってパンクした時、チューブを買ったのだが、フロント・リアのセットだったので、フロントの新品チューブが余っていた。

しかし、フロントのビードが中々上がらない~


関係トルク、組付けの要領

箇所 トルク (N/m)
フロントホイール・アクスルナット 63
フロントホイール・アクスルピンチボルト 23
フロントブレーキ・キャリパーボルト 23
リアホイールアクスルナット 125
  • ディスクローター側のカラーはツバが付いた物、反対側がストレートのカラーなので、間違わないようにする。
  • ピンチボルトは、2本なので、締める場合、均等に少しづつ締める。
  • フロントのアクスルナットを締める時、供回りする場合、右側のピンチボルトを軽く締めて供回りを防ぐ。
  • 左側アクスルナットを決めたら、右側のピンチボルトを緩めて、フロントホークをフリー状態にして軽く上下させ、センターを出す。
  • センターを出したら、ピンチボルトを締める(この工夫で、フロントホークの中心が出て、スムーズに伸び縮みする)

少し走ってみた感じ

組付けが終わって、少し周辺を走ってみたが、少し硬い感じがする。
空気圧のせいもあるかもしれないが、レーシングスピードを維持する訳では無いので、少し強めに入れておいた方が良さそうと思う。
ほとんど寝かしていないので、グリップは判らない、週末、天気が良さそうなので、峠にでも行ってみようと思う。


やり残し作業

  • ブレーキオイルの交換
  • ブレーキパッドの交換(残 1mm くらいしか無い)

250 は軽いので、ブレーキパッドはあんまし減らない、しみったれているが、後 100 キロくらい走ってから交換しようと思う。
※純正パッドを購入済

リンカースクリプトを更新、そして元に戻す

やらかした・・・

良かれと思って行った修正が、実は、良く無かった事は良くある事とはいえ、今回は久しぶりにやらかした・・・

リンカースクリプトを更新

以前のリンカースクリプトは、gcc-6.4.0 位の物で、現在メインに利用している gcc-8.3.0 の物より若干古い。
そこで、8.3.0 ベースの物に全て更新した。

独自の記述もあるので、多少切り貼りをしているものの、基本は同じものと思う。


RAYTRACER_sample を動かして気がついた・・・

リンカースクリプトを更新して、全てでは無いものの、いくつかのソフトを動かして、まぁちゃんと動いているなぁーと確認して、全てコミットした。
全 RX マイコンのリンカースクリプトなので、それなりのファイル数となっている。

ところが、「RAYTRACER_sample」で奇妙な動作をしている事に気がついた。

    bool        run_ = false;
    int         sampling_ = 1;
    int         render_width_  = 320;
    int         render_height_ = 240;

このコードは、main.cpp 無地の namespace でくくられている部分で、起動時に、ROM 領域から、コピーされる。

ところが、renderheight が、「0」になっていて、起動時にこのパラメータでレンダリングするのだが、それが原因で奇妙な動作になる・・・

初期値が正しくコピーされていない。

以前は、正しく動いていたと思えるので、どうやら、リンカースクリプトが怪しい事と思い、以前のリンカースクリプトに戻してみた。
すると、この問題が解消された。

うーーん、これはヤバイなぁーと、リンカースクリプトの更新時のすり合わせを行った。

異なる部分

gcc-8.3.0 の rx.ld では、C++ のインスタンスを初期化するルーチンのリスト「ctor」は ROM 領域にのみ配置されている。

 .init :
  {
   KEEP (*(.init))
   __preinit_array_start = .;
   KEEP (*(.preinit_array))
   __preinit_array_end = .;
   __init_array_start = (. + 3) & ~ 3;
   KEEP (*(.init_array))
   KEEP (*(SORT(.init_array.*)))
   __init_array_end = .;
   __fini_array_start = .;
   KEEP (*(.fini_array))
   KEEP (*(SORT(.fini_array.*)))
   __fini_array_end = .;
   } > ROM

一方、gcc-6.4.0 では、data 領域に配置されており、起動時に、ROM 領域から RAM にコピーされて利用される。

  .data : {
    . = ALIGN(4);
    PROVIDE (__datastart = .); /* IF_ROROM */
    PROVIDE (__preinit_array_start = .);
    KEEP (*(.preinit_array))
    PROVIDE (__preinit_array_end = .);
    PROVIDE (__init_array_start = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array))
    PROVIDE (__init_array_end = .);
    PROVIDE (__fini_array_start = .);
    KEEP (*(.fini_array))
    KEEP (*(SORT(.fini_array.*)))
    PROVIDE (__fini_array_end = .);
    LONG(0); /* Sentinel.  */

...

    . = ALIGN(4);
    _edata = .;
    PROVIDE (edata = .);
    PROVIDE (__dataend = .);
  } > RAM AT> ROM

この関数リストは、起動時、わざわざ RAM にコピーするのは無駄なので、ROM 領域だけに配置する事は、メモリを節約する意味もあり、意味があると思える。
ただ、これを元に戻すと、正しく動作しなくなる・・・

不思議なのだが、gcc-8.3.0 だと、data 領域は 2168 バイトとなっている。

rx-elf-size raytracer_sample.elf
   text    data     bss     dec     hex filename
  51244    2168    8120   61532    f05c raytracer_sample.elf

ところが、gcc-6.4.0 だと、data 領域は 48 バイトと少なくなっている

rx-elf-size raytracer_sample.elf
   text    data     bss     dec     hex filename
  53364      48    8120   61532    f05c raytracer_sample.elf

text 領域の 2120 バイト分が data 領域に移動している?

何故、こうなるのか、さっぱり判らない・・・

結局、元に戻すしか無いのかもしれないが、直すファイル数がとてつもなく多い・・・うーーーん・・・
しかし、原因が判らないので、とりあえず、元に戻してコミットしなおした。


FPU の無い RX220 で RAYTRACER_sample を走らせたら、劇遅かったw

RX220 でも走らせた、最初、何か止まるなぁー、何が悪いの?
と、色々調べたらー、単に遅いだけだったw

# render
Render time: 291320ms (1)

「291秒」・・・
48MHz の RX140 では 1.8 秒なのを考えると、劇遅・・・
動作周波数が 32MHz と少し遅い事もあるけど、FPU が無いと 100 倍以上遅い、こんだけハンディになるのかー、まぁ、それはそうだけど、これは厳しいよなぁー・・・

やっぱ、FPU が無いマイコンは使う価値が薄いとつくづく実感するー

RX マイコンの場合、FPU の有る無しで、コストがそんなに変わらない場合もあり、浮動小数点を扱わないアプリなら別だけど、逆説的に、FPU を搭載していない RX マイコンを選択する理由が無いように思える。

最近のYouTubeスピリチュアル系動画

昨年中旬頃から、スピリチュアル系動画が沢山出だした

それは、以下のようなチャネルだ・・

他にも、同じような形態のチャネルが沢山ある


AIを駆使しているのか?

内容は、詳しく述べないので、興味ある方は、自分で確かめて感じてもらいたい。

基本的に、かなり長い尺が普通で、興味無い人には全く刺さらないようになっている。

それにしても、投稿頻度が凄く短く、長い動画が多いので、AI を駆使して情報を集約し、やはり、AI を使った合成音声、合成画像、動画を生成している感じがする。

ただ、内容は、かなり面白く、構成も良く出来ていて、何となく感じていた事をピンポイントで発信していて為になる事も多い。

いったい誰が、創って投稿しているのか、非常に興味深い。


「AI を駆使している」と感じたが、それだけでは説明出来ないような情報も多く、非常に広範囲な知識、知性を感じる構成になっている。

コメントを観ると、かなり多くの人が、共感しているようで、時代の流れなのかと思われ、興味深い。

  • 全く信じていない人(出鱈目、嘘だとしている)も少数ながら、コメントしている。
  • しかし、ポエムとする合理的な理由が無いし、「嘘やフェイク」の類なら、長い動画を連続投稿する事は出来ないと思う。
  • 何かを購買させるような、仕掛けも無い。
  • 宗教的な勧誘や教義も無い。
  • 精神的な健全性を保つ為に、瞑想、自然との繋がりを意識した生活を送るようにアドバイスしている。
  • 他のスピリチュアルチャネル系で話題となった話などが、即時に含まれてリンクされていたりする。
  • ある程度は再生回数を稼いでいるようなので、多少の見返りがあるものと思うが、ビジネスとして成立する程とは考えられない。
  • 「予言、預言、予知」とは異なるもので、未来的で、高性能な経済活動、生活、を推進する方法論などを説いている。
  • やはり、投稿者のバックボーンが凄く気になる。

2025年は、色々な意味で、大きな変化が起こると予想出来る

政治、経済、色々な面で、スピリチュアルに興味が無くとも、予想はつくと思われるが、今年は激動の年になるだろうと思う。

いずれにしても、今年の年末頃には、これら動画の真の意味や効果が明らかになるだろうと思える。

シェーバーの充電池を何とかする

充電池が消耗してる・・・

最近、充電しても、直ぐに電池切れになる。
このシェーバーは3年前くらいに買ったもの。
自分は、そんなに髭が濃い方では無いので、そんなに使用頻度は多く無いと思うが、1日でそれなりに伸びる。
多い時で、1日1回は使うかも・・・
外出しない場合や、忘れていると、使わない事もある。

現在の状況は、満充電になって1回使うと、次の日には電池切れになる。
充電は、8時間くらいはかかり、使いたい時に使えないのはストレスが溜まる。
又、このシェーバーは、充電アダプタを挿しても、満充電にならないと使う事が出来ない。


とりあえず、新品は注文した

まぁ、2~3年で買い替えしてもらわないと、メーカーにしてみれば商売にならないだろうと思う。

以前はamazonで買ったが、値段を観ると1万超えで、えーーー高いってなって、ビックカメラを観たら8千円くらいだったので、納得はしなかったが、ビックで注文した。
※前買った時は5000円くらいだと思ったけどなぁー
※替え刃だけでも3000円くらいのコスト

ただ、とりあえず、ヘッドや刃は問題なく、動けば、使えるので、分解してみた。


分解するー

分解は、非常にトリッキーで、爪を折らないように慎重に行った。
けっこう難儀したー

最初は、充電池を交換して、使えるようにしようかとも思ったが、タブ付き充電池(ニッケル水素充電池)を買う必要もあり、外部に「直」にエネループを接続すれば良いのでは?
と思い、配線を加工する事にした。

充電コネクタ周辺のラインをカットして、そこから直に、充電池の端子に接続した。

充電アダプタのケーブルを切り、単三2本の電池ボックスを接続した。


動かない・・・

電源ボタンを「ON」にするー
オレンジのLEDが点滅して、言う事を聞かない・・・

色々調べたら、どうも、内部の充電池マネージメントが働き、外部電源から充電を行い、正常な状態に初期化しないと、モーターを起動しないようだった
まぁ、安全装置と言えば聞こえが良いが、魔改造を受け付けない合理的な機構なのだろうと思う。
そもそも、充電に8時間とかかかるのが、おかしいよなぁーと思う。


こうなったらダイレクトにモーターに接続

基板の写真を撮らなかったが、結局、外部端子からのラインをモーターに直接接続して強制的に動かしたw

ちょっと、スマートとは言えない結果にはなったが、とりあえず、使えるので良しとするw
それに、新品も買ったしねw

次、充電池が消耗したら、魔改造で使い倒す!w
※同じシェーバーを持っている人は、今回の記事を参考にしてもらいたいw

format、input クラスの更新

はじめに

これらクラスは、printf(format)、scanf(input)に代わる組み込み向け C++ コードで、ヘッダーをインクルードするだけで、他の環境でも利用可能となっている。
※自分は、clang64 などの環境でも便利に利用している。   

  • C++17 コンパイラが必須
  • 元々、printf、scanf などの可変引数の安全性に疑問があり、それを避ける為に実装を始めたもの
  • C++ 環境なので、C 言語の関数を利用するメリットがない
  • C++ には、安全性を意識した実装が色々あるが、「組み込み」マイコンで使うには、巨大になる為、使えない場合が多々ある
  • 「巨大」になる理由として、std::iostream クラスの存在がある
  • 組み込みマイコン環境で使っても、意外とコンパクトになるし、ヘッダーをインクルードするだけで使えて便利!
  • 実装は、あまり巨大ではなく、適当に難解で、C++ のスキルを磨くのにも重宝している
  • 仕様的にイマイチな部分もあるけど、現状、それなりに歴史があるので、大きな仕様変更を行う事が出来ない
  • テスト環境も充実してきており、問題無く利用可能となっている
  • 以前は、「%g」の仕様が満足に実装されていなかったが、それも実装され、ほぼ困る事が無くなった
  • 浮動小数点のパースでは、主に整数計算を利用しており、FPU を持たない CPU でもリソースを多く消費しない
  • 64 ビット浮動小数点のパースは基本出来ない(floatにキャストする)のだが、困る事はすくない
  • 64 ビット浮動小数点をサポートしない為、コンパクトになる
  • int64_t、uint64_t などの 64 ビット整数は扱えるように改修した
  • 「if constexpr」を使う事で、コードをシンプル、ダイエットする事が出来た(C++17)
  • github ディレクトリには、全体テストを行うソースが含まれている
  • format クラスでは、printf の出力と比較される
  • input クラスでは、入力された文字列と、実際の数値などが比較される
  • 使い方など詳しくは、github のリンクを参照して下さい

format クラス

Github format class で公開しているコードを更新した。

( 1) ( 1/ 1) output buffer size check.  Pass.
( 2) ( 1/10) decimal check.  Ref: 'form=12345678' <-> Res: 'form=12345678'  Pass.
( 2) ( 2/10) decimal check.  Ref: 'form=-12345678' <-> Res: 'form=-12345678'  Pass.
( 2) ( 3/10) decimal check.  Ref: 'form=     12345678' <-> Res: 'form=     12345678'  Pass.
( 2) ( 4/10) decimal check.  Ref: 'form=    -12345678' <-> Res: 'form=    -12345678'  Pass.
( 2) ( 5/10) decimal check.  Ref: 'form=000012345678' <-> Res: 'form=000012345678'  Pass.
( 2) ( 6/10) decimal check.  Ref: 'form=-00012345678' <-> Res: 'form=-00012345678'  Pass.
( 2) ( 7/10) decimal check.  Ref: 'form=12345678' <-> Res: 'form=12345678'  Pass.
( 2) ( 8/10) decimal check.  Ref: 'form=-12345678' <-> Res: 'form=-12345678'  Pass.
( 2) ( 9/10) decimal check.  Ref: 'form=12345678' <-> Res: 'form=12345678'  Pass.
( 2) (10/10) decimal check.  Ref: 'form=-12345678' <-> Res: 'form=-12345678'  Pass.
( 3) ( 1/ 5) octal check.  Ref: 'form=1245667' <-> Res: 'form=1245667'  Pass.
( 3) ( 2/ 5) octal check.  Ref: 'form=   1245667' <-> Res: 'form=   1245667'  Pass.
( 3) ( 3/ 5) octal check.  Ref: 'form=001245667' <-> Res: 'form=001245667'  Pass.
( 3) ( 4/ 5) octal check.  Ref: 'form=1245667' <-> Res: 'form=1245667'  Pass.
( 3) ( 5/ 5) octal check.  Ref: 'form=1245667' <-> Res: 'form=1245667'  Pass.
( 4) ( 1/ 5) binary check.  Ref: 'form=10101110' <-> Res: 'form=10101110'  Pass.
( 4) ( 2/ 5) binary check.  Ref: 'form=    10101110' <-> Res: 'form=    10101110'  Pass.
( 4) ( 3/ 5) binary check.  Ref: 'form=0000010101110' <-> Res: 'form=0000010101110'  Pass.
( 4) ( 4/ 5) binary check.  Ref: 'form=10101110' <-> Res: 'form=10101110'  Pass.
( 4) ( 5/ 5) binary check.  Ref: 'form=10101110' <-> Res: 'form=10101110'  Pass.
( 5) ( 1/10) hex-decimal check.  Ref: 'form=12a4bf9c' <-> Res: 'form=12a4bf9c'  Pass.
( 5) ( 2/10) hex-decimal check.  Ref: 'form=  12a4bf9c' <-> Res: 'form=  12a4bf9c'  Pass.
( 5) ( 3/10) hex-decimal check.  Ref: 'form=012a4bf9c' <-> Res: 'form=012a4bf9c'  Pass.
( 5) ( 4/10) hex-decimal check.  Ref: 'form=12a4bf9c' <-> Res: 'form=12a4bf9c'  Pass.
( 5) ( 5/10) hex-decimal check.  Ref: 'form=12a4bf9c' <-> Res: 'form=12a4bf9c'  Pass.
( 5) ( 6/10) hex-decimal check.  Ref: 'form=12A4BF9C' <-> Res: 'form=12A4BF9C'  Pass.
( 5) ( 7/10) hex-decimal check.  Ref: 'form=  12A4BF9C' <-> Res: 'form=  12A4BF9C'  Pass.
( 5) ( 8/10) hex-decimal check.  Ref: 'form=012A4BF9C' <-> Res: 'form=012A4BF9C'  Pass.
( 5) ( 9/10) hex-decimal check.  Ref: 'form=12A4BF9C' <-> Res: 'form=12A4BF9C'  Pass.
( 5) (10/10) hex-decimal check.  Ref: 'form=12A4BF9C' <-> Res: 'form=12A4BF9C'  Pass.
( 6) ( 1/10) positive decimal check.  Ref: 'form=12345678' <-> Res: 'form=12345678'  Pass.
( 6) ( 2/10) positive decimal check.  Ref: 'form=4282621618' <-> Res: 'form=4282621618'  Pass.
( 6) ( 3/10) positive decimal check.  Ref: 'form=     12345678' <-> Res: 'form=     12345678'  Pass.
( 6) ( 4/10) positive decimal check.  Ref: 'form=   4282621618' <-> Res: 'form=   4282621618'  Pass.
( 6) ( 5/10) positive decimal check.  Ref: 'form=000012345678' <-> Res: 'form=000012345678'  Pass.
( 6) ( 6/10) positive decimal check.  Ref: 'form=004282621618' <-> Res: 'form=004282621618'  Pass.
( 6) ( 7/10) positive decimal check.  Ref: 'form=12345678' <-> Res: 'form=12345678'  Pass.
( 6) ( 8/10) positive decimal check.  Ref: 'form=4282621618' <-> Res: 'form=4282621618'  Pass.
( 6) ( 9/10) positive decimal check.  Ref: 'form=12345678' <-> Res: 'form=12345678'  Pass.
( 6) (10/10) positive decimal check.  Ref: 'form=4282621618' <-> Res: 'form=4282621618'  Pass.
( 7) ( 1/12) floating point check.  Ref: 'form=2.236068' <-> Res: 'form=2.236068'  Pass.
( 7) ( 2/12) floating point check.  Ref: 'form=-2.236068' <-> Res: 'form=-2.236068'  Pass.
( 7) ( 3/12) floating point check.  Ref: 'form=2.23606801' <-> Res: 'form=2.23606801'  Pass.
( 7) ( 4/12) floating point check.  Ref: 'form=-2.23606801' <-> Res: 'form=-2.23606801'  Pass.
( 7) ( 5/12) floating point check.  Ref: 'form=2.236068' <-> Res: 'form=2.236068'  Pass.
( 7) ( 6/12) floating point check.  Ref: 'form=-2.236068' <-> Res: 'form=-2.236068'  Pass.
( 7) ( 7/12) floating point check.  Ref: 'form=2.2361' <-> Res: 'form=2.2361'  Pass.
( 7) ( 8/12) floating point check.  Ref: 'form=-2.2361' <-> Res: 'form=-2.2361'  Pass.
( 7) ( 9/12) floating point check.  Ref: 'form=2.2361' <-> Res: 'form=2.2361'  Pass.
( 7) (10/12) floating point check.  Ref: 'form=-2.2361' <-> Res: 'form=-2.2361'  Pass.
( 7) (11/12) floating point check.  Ref: 'form=     2' <-> Res: 'form=     2'  Pass.
( 7) (12/12) floating point check.  Ref: 'form=    -2' <-> Res: 'form=    -2'  Pass.
( 8) ( 1/20) floating point (exponent) check.  Ref: 'form=1.025001e+05' <-> Res: 'form=1.025001e+05'  Pass.
( 8) ( 2/20) floating point (exponent) check.  Ref: 'form=3.250000e-08' <-> Res: 'form=3.250000e-08'  Pass.
( 8) ( 3/20) floating point (exponent) check.  Ref: 'form=-1.075001e+05' <-> Res: 'form=-1.075001e+05'  Pass.
( 8) ( 4/20) floating point (exponent) check.  Ref: 'form=-6.250000e-08' <-> Res: 'form=-6.250000e-08'  Pass.
( 8) ( 5/20) floating point (exponent) check.  Ref: 'form=1.025001e+05' <-> Res: 'form=1.025001e+05'  Pass.
( 8) ( 6/20) floating point (exponent) check.  Ref: 'form=3.250000e-08' <-> Res: 'form=3.250000e-08'  Pass.
( 8) ( 7/20) floating point (exponent) check.  Ref: 'form=-1.075001e+05' <-> Res: 'form=-1.075001e+05'  Pass.
( 8) ( 8/20) floating point (exponent) check.  Ref: 'form=-6.250000e-08' <-> Res: 'form=-6.250000e-08'  Pass.
( 8) ( 9/20) floating point (exponent) check.  Ref: 'form=1.025001e+05' <-> Res: 'form=1.025001e+05'  Pass.
( 8) (10/20) floating point (exponent) check.  Ref: 'form=3.250000e-08' <-> Res: 'form=3.250000e-08'  Pass.
( 8) (11/20) floating point (exponent) check.  Ref: 'form=-1.075001e+05' <-> Res: 'form=-1.075001e+05'  Pass.
( 8) (12/20) floating point (exponent) check.  Ref: 'form=-6.250000e-08' <-> Res: 'form=-6.250000e-08'  Pass.
( 8) (13/20) floating point (exponent) check.  Ref: 'form=1.0250e+05' <-> Res: 'form=1.0250e+05'  Pass.
( 8) (14/20) floating point (exponent) check.  Ref: 'form=3.2500e-08' <-> Res: 'form=3.2500e-08'  Pass.
( 8) (15/20) floating point (exponent) check.  Ref: 'form=-1.0750e+05' <-> Res: 'form=-1.0750e+05'  Pass.
( 8) (16/20) floating point (exponent) check.  Ref: 'form=-6.2500e-08' <-> Res: 'form=-6.2500e-08'  Pass.
( 8) (17/20) floating point (exponent) check.  Ref: 'form=1.0250e+05' <-> Res: 'form=1.0250e+05'  Pass.
( 8) (18/20) floating point (exponent) check.  Ref: 'form=3.2500e-08' <-> Res: 'form=3.2500e-08'  Pass.
( 8) (19/20) floating point (exponent) check.  Ref: 'form=-1.0750e+05' <-> Res: 'form=-1.0750e+05'  Pass.
( 8) (20/20) floating point (exponent) check.  Ref: 'form=-6.2500e-08' <-> Res: 'form=-6.2500e-08'  Pass.
( 9) ( 1/ 5) string format check.  Ref: 'AbcdEFG' <-> Res: 'AbcdEFG'  Pass.
( 9) ( 2/ 5) string format check.  Ref: '   AbcdEFG' <-> Res: '   AbcdEFG'  Pass.
( 9) ( 3/ 5) string format check.  Ref: '00AbcdEFG' <-> Res: '00AbcdEFG'  Pass.
( 9) ( 4/ 5) string format check.  Ref: 'AbcdEFG' <-> Res: 'AbcdEFG'  Pass.
( 9) ( 5/ 5) string format check.  Ref: 'AbcdEFG' <-> Res: 'AbcdEFG'  Pass.
(10) ( 1/ 1) format poniter to nullptr, error code check.   Pass.
(11) ( 1/ 5) different type (float): '%s' error check.   Pass.
(11) ( 2/ 5) different type (float): '%d' error check.   Pass.
(11) ( 3/ 5) different type (float): '%c' error check.   Pass.
(11) ( 4/ 5) different type (float): '%u' error check.   Pass.
(11) ( 5/ 5) different type (float): '%p' error check.   Pass.
(12) ( 1/ 1) pointer type check.  Ref: '000000A020F8F9B4' <-> Res: '000000A020F8F9B4'  Pass.
(13) ( 1/ 1) floating point 'inf' (infinity) check.  Ref: 'inf' <-> Res: 'inf'  Pass.
(14) ( 1/ 4) different type (int): '%s' error check.   Pass.
(14) ( 2/ 4) different type (int): '%f' error check.   Pass.
(14) ( 3/ 4) different type (int): '%p' error check.   Pass.
(14) ( 4/ 4) different type (int): '%g' error check.   Pass.
(15) ( 1/ 8) fixed point check.  Ref: '0.016' <-> Res: '0.016'  Pass.
(15) ( 2/ 8) fixed point check.  Ref: '0.059' <-> Res: '0.059'  Pass.
(15) ( 3/ 8) fixed point check.  Ref: '0.097' <-> Res: '0.097'  Pass.
(15) ( 4/ 8) fixed point check.  Ref: '0.488' <-> Res: '0.488'  Pass.
(15) ( 5/ 8) fixed point check.  Ref: '0.732' <-> Res: '0.732'  Pass.
(15) ( 6/ 8) fixed point check.  Ref: '0.875' <-> Res: '0.875'  Pass.
(15) ( 7/ 8) fixed point check.  Ref: '0.976' <-> Res: '0.976'  Pass.
(15) ( 8/ 8) fixed point check.  Ref: '1.000' <-> Res: '1.000'  Pass.
(16) ( 1/ 1) floating point '-1' check.  Ref: '-99.000000' <-> Res: '-99.000000'  Pass.
(17) ( 1/ 1) floating point '%-' check.  Ref: '-99.000000' <-> Res: '-99.000000'  Pass.
(18) ( 1/ 1) report pointer (char*) '%p' check.  Ref: '000000A020F8F9C0' <-> Res: '000000A020F8F9C0'  Pass.
(19) ( 1/ 1) report pointer (int*) '%p' check.  Ref: '00007FF6C43E3940' <-> Res: '00007FF6C43E3940'  Pass.
(20) ( 1/22) floating point '%g' check.  Ref: '1e+07' <-> Res: '1e+07'  Pass.
(20) ( 2/22) floating point '%g' check.  Ref: '1.41421E+07' <-> Res: '1.41421E+07'  Pass.
(20) ( 3/22) floating point '%g' check.  Ref: '1e+06' <-> Res: '1e+06'  Pass.
(20) ( 4/22) floating point '%g' check.  Ref: '1.41421E+06' <-> Res: '1.41421E+06'  Pass.
(20) ( 5/22) floating point '%g' check.  Ref: '100000' <-> Res: '100000'  Pass.
(20) ( 6/22) floating point '%g' check.  Ref: '141421' <-> Res: '141421'  Pass.
(20) ( 7/22) floating point '%g' check.  Ref: '-100000' <-> Res: '-100000'  Pass.
(20) ( 8/22) floating point '%g' check.  Ref: '-141421' <-> Res: '-141421'  Pass.
(20) ( 9/22) floating point '%g' check.  Ref: '1000' <-> Res: '1000'  Pass.
(20) (10/22) floating point '%g' check.  Ref: '1414.21' <-> Res: '1414.21'  Pass.
(20) (11/22) floating point '%g' check.  Ref: '1' <-> Res: '1'  Pass.
(20) (12/22) floating point '%g' check.  Ref: '1.41421' <-> Res: '1.41421'  Pass.
(20) (13/22) floating point '%g' check.  Ref: '0.001' <-> Res: '0.001'  Pass.
(20) (14/22) floating point '%g' check.  Ref: '0.00141421' <-> Res: '0.00141421'  Pass.
(20) (15/22) floating point '%g' check.  Ref: '-1e-05' <-> Res: '-1e-05'  Pass.
(20) (16/22) floating point '%g' check.  Ref: '-1.41421E-05' <-> Res: '-1.41421E-05'  Pass.
(20) (17/22) floating point '%g' check.  Ref: '1e-05' <-> Res: '1e-05'  Pass.
(20) (18/22) floating point '%g' check.  Ref: '1.41421E-05' <-> Res: '1.41421E-05'  Pass.
(20) (19/22) floating point '%g' check.  Ref: '1e-06' <-> Res: '1e-06'  Pass.
(20) (20/22) floating point '%g' check.  Ref: '1.41421E-06' <-> Res: '1.41421E-06'  Pass.
(20) (21/22) floating point '%g' check.  Ref: '1e-07' <-> Res: '1e-07'  Pass.
(20) (22/22) floating point '%g' check.  Ref: '1.41421E-07' <-> Res: '1.41421E-07'  Pass.
(21) ( 1/22) floating point '%8g' check.  Ref: '1.666e+07' <-> Res: '1.666e+07'  Pass.
(21) ( 2/22) floating point '%8g' check.  Ref: '1.41421E+07' <-> Res: '1.41421E+07'  Pass.
(21) ( 3/22) floating point '%8g' check.  Ref: '1.666e+06' <-> Res: '1.666e+06'  Pass.
(21) ( 4/22) floating point '%8g' check.  Ref: '1.41421E+06' <-> Res: '1.41421E+06'  Pass.
(21) ( 5/22) floating point '%8g' check.  Ref: '  166600' <-> Res: '  166600'  Pass.
(21) ( 6/22) floating point '%8g' check.  Ref: '  141421' <-> Res: '  141421'  Pass.
(21) ( 7/22) floating point '%8g' check.  Ref: ' -166600' <-> Res: ' -166600'  Pass.
(21) ( 8/22) floating point '%8g' check.  Ref: ' -141421' <-> Res: ' -141421'  Pass.
(21) ( 9/22) floating point '%8g' check.  Ref: '    1666' <-> Res: '    1666'  Pass.
(21) (10/22) floating point '%8g' check.  Ref: ' 1414.21' <-> Res: ' 1414.21'  Pass.
(21) (11/22) floating point '%8g' check.  Ref: '   1.666' <-> Res: '   1.666'  Pass.
(21) (12/22) floating point '%8g' check.  Ref: ' 1.41421' <-> Res: ' 1.41421'  Pass.
(21) (13/22) floating point '%8g' check.  Ref: '0.001666' <-> Res: '0.001666'  Pass.
(21) (14/22) floating point '%8g' check.  Ref: '0.00141421' <-> Res: '0.00141421'  Pass.
(21) (15/22) floating point '%8g' check.  Ref: '-1.666e-05' <-> Res: '-1.666e-05'  Pass.
(21) (16/22) floating point '%8g' check.  Ref: '-1.41421E-05' <-> Res: '-1.41421E-05'  Pass.
(21) (17/22) floating point '%8g' check.  Ref: '1.666e-05' <-> Res: '1.666e-05'  Pass.
(21) (18/22) floating point '%8g' check.  Ref: '1.41421E-05' <-> Res: '1.41421E-05'  Pass.
(21) (19/22) floating point '%8g' check.  Ref: '1.666e-06' <-> Res: '1.666e-06'  Pass.
(21) (20/22) floating point '%8g' check.  Ref: '1.41421E-06' <-> Res: '1.41421E-06'  Pass.
(21) (21/22) floating point '%8g' check.  Ref: '1.666e-07' <-> Res: '1.666e-07'  Pass.
(21) (22/22) floating point '%8g' check.  Ref: '1.41421E-07' <-> Res: '1.41421E-07'  Pass.
(22) ( 1/ 1) floating point 'nan' (not a number) check.  Ref: '   nan' <-> Res: '   nan'  Pass.
(23) ( 1/ 1) '%' check.  Ref: '1234abcdefg%ABCDEFG5678' <-> Res: '1234abcdefg%ABCDEFG5678'  Pass.
(24) ( 1/ 1) '%q' check.  Ref: 'aaa q bbb' <-> Res: 'aaa q bbb'  Error: unknown type.  Pass.
(25) ( 1/ 5) binary check.  Ref: 'form=110110011011011100101011010110101110' <-> Res: 'form=110110011011011100
101011010110101110'  Pass.
(25) ( 2/ 5) binary check.  Ref: 'form=   110110011011011100101011010110101110' <-> Res: 'form=   110110011011
011100101011010110101110'  Pass.
(25) ( 3/ 5) binary check.  Ref: 'form=00110110011011011100101011010110101110' <-> Res: 'form=0011011001101101
1100101011010110101110'  Pass.
(25) ( 4/ 5) binary check.  Ref: 'form= 110110011011011100101011010110101110' <-> Res: 'form= 1101100110110111
00101011010110101110'  Pass.
(25) ( 5/ 5) binary check.  Ref: 'form=110110011011011100101011010110101110' <-> Res: 'form=110110011011011100
101011010110101110'  Pass.
(26) ( 1/ 5) decimal 64 bits check.  Ref: 'form=37812750652850076' <-> Res: 'form=37812750652850076'  Pass.
(26) ( 2/ 5) decimal 64 bits check.  Ref: 'form=-37812750652850173' <-> Res: 'form=-37812750652850173'  Pass.
(26) ( 3/ 5) decimal 64 bits check.  Ref: 'form=   37812750652849979' <-> Res: 'form=   37812750652849979'  Pa
ss.
(26) ( 4/ 5) decimal 64 bits check.  Ref: 'form=  -37812750652850270' <-> Res: 'form=  -37812750652850270'  Pa
ss.
(26) ( 5/ 5) decimal 64 bits check.  Ref: 'form=0000000037812750652849882' <-> Res: 'form=00000000378127506528
49882'  Pass.
(26) ( 6/ 5) decimal 64 bits check.  Ref: 'form=-000000037812750652850367' <-> Res: 'form=-0000000378127506528
50367'  Pass.
(26) ( 7/ 5) decimal 64 bits check.  Ref: 'form=   37812750652849785' <-> Res: 'form=   37812750652849785'  Pa
ss.
(26) ( 8/ 5) decimal 64 bits check.  Ref: 'form=  -37812750652850464' <-> Res: 'form=  -37812750652850464'  Pa
ss.
(26) ( 9/ 5) decimal 64 bits check.  Ref: 'form=37812750652849688' <-> Res: 'form=37812750652849688'  Pass.
(26) (10/ 5) decimal 64 bits check.  Ref: 'form=-37812750652850561' <-> Res: 'form=-37812750652850561'  Pass.
(27) ( 1/10) hex-decimal 64 bits check.  Ref: 'form=567f12a4bf9c' <-> Res: 'form=567f12a4bf9c'  Pass.
(27) ( 2/10) hex-decimal 64 bits check.  Ref: 'form=  567f12a4bf9c' <-> Res: 'form=  567f12a4bf9c'  Pass.
(27) ( 3/10) hex-decimal 64 bits check.  Ref: 'form=000567f12a4bf9c' <-> Res: 'form=000567f12a4bf9c'  Pass.
(27) ( 4/10) hex-decimal 64 bits check.  Ref: 'form=567f12a4bf9c' <-> Res: 'form=567f12a4bf9c'  Pass.
(27) ( 5/10) hex-decimal 64 bits check.  Ref: 'form=567f12a4bf9c' <-> Res: 'form=567f12a4bf9c'  Pass.
(27) ( 6/10) hex-decimal 64 bits check.  Ref: 'form=567F12A4BF9C' <-> Res: 'form=567F12A4BF9C'  Pass.
(27) ( 7/10) hex-decimal 64 bits check.  Ref: 'form=  567F12A4BF9C' <-> Res: 'form=  567F12A4BF9C'  Pass.
(27) ( 8/10) hex-decimal 64 bits check.  Ref: 'form=000567F12A4BF9C' <-> Res: 'form=000567F12A4BF9C'  Pass.
(27) ( 9/10) hex-decimal 64 bits check.  Ref: 'form=567F12A4BF9C' <-> Res: 'form=567F12A4BF9C'  Pass.
(27) (10/10) hex-decimal 64 bits check.  Ref: 'form=567F12A4BF9C' <-> Res: 'form=567F12A4BF9C'  Pass.

format class Version: 121
All Pass: 27/27

input クラス

Github input class で公開しているコードを更新した。

( 1) ( 1/ 2) Integer input (type int): '123456789' ---> 123456789  Pass.
( 1) ( 2/ 2) Integer input (type int): '-123456789' ---> -123456789  Pass.
( 2) ( 1/ 2) Floating point input (type float exponent): '2.5439e3' ---> 2.543900e+03  Pass.
( 2) ( 2/ 2) Floating point input (type float exponent): '-2.5439e3' ---> -2.543900e+03  Pass.
( 3) ( 1/ 1) Integer (uint32_t) max value conversion: '4294967295' ---> 4294967295  Pass.
( 4) ( 1/ 1) Fail conversion state check, initial value hold: '8o0173476' 123456789 ---> 123456789  Pass.
( 5) ( 1/ 1) Multi scan for integer (%d[, ]%x[, ]%d): '-98516 105aBd3,21369871' (3) -98516, 105abd3, 21369871
 Pass.
( 6) ( 1/ 1) Multi scan for integer (%d[, ]%x,%d): '-9577463,fa4c57ab,23645687' (3) -9577463, fa4c57ab, 236456
87  Pass.
( 7) ( 1/ 1) Multi scan for (%d,%f,%c): '-17743347,-1273.75941,Z' (3) -17743347, -1273.759399, Z  Pass.
( 8) ( 1/ 1) Multi scan for (%f,%d,%x,%o): '101.945678,-76437583,7fdcab5f,7453642341' (4) 101.945679, -7643758
3, 7fdcab5f, 7453642341  Pass.
( 9) ( 1/ 1) Multi scan for 'int' at spacing ( %d %d %d): ' 100 250 300' (3) 100, 250, 300  Pass.
(10) ( 1/ 1) Multi scan for 'auto' (%a %a %a %a): '100 0x9a 0b1101 0o775' (4) 100, 154, 13, 509  Pass.
(11) ( 1/ 1) Multi scan for 'auto' (%a %a %a %a %a): '100 x9a b1101 o775 -123.4567' (5) 100, 154, 13, 509, -12
3.456703  Pass.
(12) ( 1/ 1) Multi scan for (%b %o %d %x %f %c): '11011 0625 -985 4a7Bc 1.025 Y' (6) 27, 405, -985, 4a7bc, 1.0
25000, Y  Pass.
(13) ( 1/ 1) Check signed integer error (%d): '-8964743' ---> 0  Pass.
(14) ( 1/ 1) Check hexa-decimal conversion for signed integer (%x): '-7ffe9283' ---> 80016d7d  Pass.
(15) ( 1/ 1) Check signed type error (%d): '-8967464' ---> 0  Pass.
(16) ( 1/ 1) Integer input 'std::string' as (%d): '56789' ---> 56789  Pass.
(17) ( 1/ 1) Overflowed floting point input as (%f): '0.555555555555' ---> 0.555556  Pass.
(18) ( 1/ 1) Overflowed integer32 '2147483647' (%d) error check input as '2147483648' ---> -2147483648  Pass.
(19) ( 1/ 1) Overflowed floting point input as (%f): '987643214321' ---> 987643200.000000  Pass.
(20) ( 1/ 1) Overflowed binary error check input (%b): '101010101010101010101010101010101' ---> 0xaaaaaaaa  Pa
ss.
(21) ( 1/ 1) Overflowed hexa-decimal error check input (%x): 'a290fc4b1' ---> 0xa290fc4b  Pass.
(22) ( 1/ 1) Overflowed octal error check input (%o): '65234223514' ---> 354e24e9  Pass.
(23) ( 1/ 1) Special character separator (%d\%%d\[%d\]%d): '123%456[789]5678' (4) 123, 456, 789, 5678  Pass.
(24) ( 1/ 1) Floating point conversion for (%f): '123456789' ---> 123456792.000000  Pass.
(25) ( 1/ 1) Floating point conversion (%f): '.123456789) ---> 0.123457  Pass.
(26) ( 1/ 1) Floating point conversion (%f): '-.123456789' ---> -0.123457  Pass.
(27) ( 1/ 1) Floating point conversion (%f): '.123456789e-3' ---> 0.000123  Pass.
(28) ( 1/ 1) Floating point conversion (%f): '-.123456789e-3' ---> -0.000123  Pass.
(29) ( 1/ 1) Integer (uint64_t) max value conversion: '18446744073709551615' ---> 18446744073709551615  Pass.
(30) ( 1/ 1) Overflowed int64_t at '9223372036854775807' (%d) error check input as '9223372036854775808' --->
-9223372036854775808  Pass.
(31) ( 1/ 2) Integer input (type short): '23456' ---> 23456  Pass.
(31) ( 2/ 2) Integer input (type short): '-23456' ---> -23456  Pass.
(32) ( 1/ 2) Integer input (type uint16_t): '45678' ---> 45678  Pass.
(32) ( 2/ 2) Integer input (type uint16_t): '56789' ---> 56789  Pass.

input class Version: 112
All Pass: 32/32

RXマイコンサポート(RX110、RX111、RX113)と、データフラッシュの操作系見直し

RX110, RX111, RX113 などをサポート

RX マイコン C++ フレームワークでは、なるべく多くの品種をサポートするべく作業を行っている。

これらの RX マイコンは、現行品で、比較的低価格のマイコンとなっている。
FPU が無いとか、5V で動かせない(1.8~3.6V)とか、色々と制限があるものの、特定の分野なら十分な能力があると思う。
動作周波数は 32MHz だが、8/16 ビット系に比べて、扱い易く、高性能だと思える。

  • FPU はアプリケーションによっては、無い事が不利益にならない場合がある
  • 32 ビット CPU なので、バンクを気にする必要が無く、プログラムの実装は、非常にやりやすいと思う
  • それでいて、十分低消費電力であり、コストパフォーマンスも良い
  • 必要十分なペリフェラル(MTU, RTC, SCI, I2C, RSPI)を内蔵しており、通常の用途では十分と思える
  • USB、LCD、静電タッチ機能を使える物など、そこそこバリエーションがある
  • 基本的に RX マイコンのリソースを再利用出来る

サポートと言っても、以前のリソースを集めたり、定義を少し書くだけなので、そんなに大げさなものでは無い。
ただ、デバイスを入手して、実験していないので、ちゃんと動作するかは判らない、近々にデバイスを入手して、簡単なテストは行いたい。

  • ROM 容量が 64K 以上ある RX140 が安価に入手出来れば良いのだが、チップワンストップには在庫が確認出来ない
  • ROM 容量が大きい RX140、海外の販売サイトには在庫があるようだが、単価が高いので、RX231とかの方が良いかもしれない
  • 上記 RX100 系は、動作電圧範囲が狭いので、A/D を使う場合に、ダイナミックレンジが狭く、色々と制限が多いのは、マイナスポイント
  • 当然、電源電圧が低いと、ノイズ耐性にも影響があるものと思う

チップワンストップ:

RX110: 64LQFP, RXv1, 32MHz, Code: 32K, RAM: 10K, DataFlash: 0K, R5F51101ADFM
1個:256円
10個:@190円
RX110 Github

RX111: 64LQFP, RXv1, 32MHz, USB2.0, Code: 128K, RAM: 16K, DataFlash: 8K, R5F51115ADFM
1個:368円
10個:@234円
RX111 Github

RX113: 64LQFP, RXv1, 32MHz, USB2.0, Code: 512K, RAM: 64K, DataFlash: 8K, R5F51138ADFM
1個:630円
10個:@483円
RX113 Github


データフラッシュの操作

今まで、RX64M 系、RX24T 系のデータフラッシュの操作は、実装して、試していたが、それとは異なる系統の場合、実装されていなかった。
構成が異なり、シーケンスも微妙に異なるグループがある。
これは、デバイスにより、内蔵フラッシュメモリの構造や特性が異なるのが要因と思う。
このデータフラッシュ操作は、RX220/RX621/RX62N/RX631/RX63N など、古いタイプの RX マイコンなのもある。
しかし、RX26T が、このグループに近い操作系となっており、ついでにサポートして実験した。

  • 消去は基本、バンク単位で行う
  • 1バイト単位で書き込め、消去後の値が 0xFF の場合、多分従来型の EEPROM に近いものと思う
    - 消去後の値が未定の場合は、新しいタイプ(E2?)のフラッシュメモリとなっている
CPU 容量 バンクサイズ 書き込み単位 消去後の値 ユニークID数
RX140 4K 256 1 0xFF 4
RX220 8K 2048 2 0x?? 4
RX231 8K 1024 1 0xFF 4
RX24T 8K 1024 1 0xFF 4
RX26T 16K 64 4 0x?? 3
RX62N 32K 2048 8 0x?? 0
RX631 32K 2048 4 0x?? 4
RX64M 64K 64 4 0x?? 3
RX71M 64K 64 4 0x?? 3
RX65N 32K 64 4 0x?? 4
RX72N 32K 64 4 0x?? 4
RX66T 32K 64 4 0x?? 3
RX72T 32K 64 4 0x?? 3

FLASH_sample: 各プロジェクト、データフラュシュ操作クラス、アプリケーションの動作確認

Project File flash_io 動作確認
RX140/Makefile RX24T/flash_io.hpp
RX220/Makefile RX62x/flash_io.hpp
RX231/Makefile RX24T/flash_io.hpp
RX24T/Makefile RX24T/flash_io.hpp
RX26T/Makefile RX62x/flash_io.hpp
RX62N/Makefile RX62x/flash_io.hpp
RX631/Makefile RX62x/flash_io.hpp
RX64M/Makefile RX600/flash_io.hpp
RX71M/Makefile RX600/flash_io.hpp
RX65N/Makefile RX600/flash_io.hpp
RX72N/Makefile RX600/flash_io.hpp
RX66T/Makefile RX600/flash_io.hpp
RX72T/Makefile RX600/flash_io.hpp

RX220/RX26T/RX62[1N]/RX63[1N] などサポート

これらグループは、ほぼ同じ操作系なのだが、微妙に異なる部分もあり、やりたくは無かったが、「#if defined(xxx)」でより分けている。
多少工夫すると、無くせなくも無いが、コードの見通しがもっと悪くなると思ったのもあって、とりあえず、制御文で別けている。

RX26T は、ほぼ同じとは言え、構成も異なるので、ソースを別けた方が良いかもしれないが、同じようなコードをコピペする事になる、コピー元を変更したら、コピー先に反映させなければならないしで、どうしたものか・・・
※まぁ、機能違いは、継承させて、分離する方が良いかもしれないが、それも複雑になるし、一長一短ではある・・・

  • RX62[1N]、RX63[1N]は、ファームの転送が必要
  • RX26T は、FACI コマンド発行アドレスが異なる
  • RX26T は、データフラッシュ操作アドレス用に、専用のレジスタがあり、適切な値を設定する必要がある
  • それぞれ、書き込みサイズ、バンクサイズ等が異なる場合があり、FLASH レジスタークラスで定義を行って、flash_io クラスからは参照するようにしている

まとめ

Start Data Flash sample for 'RX62N FRK-RX62N' 96 [MHz]
Flash drive clock: 48 [MHz]
Data Flash total size: 0x00008000
Data Flash block size: 2048 bytes
Data Flash word size: 8 byte
# check 2
Erase check: bank 2: 0x1000 to 0x17FF OK
# write 1000 123456789abcdef0 fa926534bcdea021
# r 1000 100f
0x1000: 123456789ABCDEF0 FA926534BCDEA021
# check 2
Erase check: bank 2: 0x1000 to 0x17FF NG
# erase 2
Erase OK: bank 2, 0x1000 to 0x17FF
# check 2
Erase check: bank 2: 0x1000 to 0x17FF OK
# r 1000 100f
0x1000: 1274567892BCDEF0 FA926514BCDEA021
#
  • RX220 は、RX62[1N]/RX63[1N] この系列なのだが、動作確認で失敗し、原因を調査・・・
  • RX220 は ROM ブロック領域の説明も実際と異なっている
  • データフラッシュのバンクサイズも128バイト、2048バイトと説明が2つあり、どちらが正解なのか判らない
  • 多分 2048 バイトだと思う
  • RX220 は保守外の品種なので、どうかと思うが、一応、ルネサスに質問しておこうと思う
  • RX220 のフラッシュ操作が動かない理由は、判ったー
  • FCU クロック通知を、データ領域では無く、コード領域に行う必要がある・・・
  • 「フラッシュ P/E モードエントリレジスタ(FENTRYR)」のアドレスがタイポしていた・・・
  • レジスタアドレスは、構成が同等の RX マイコンでも、微妙に異なっている場合がある・・・
  • それを修正して動作するようになった!(確認したつもりだったが・・・)
  • 消去後のデータが不定だと、消去されているか不明なので、ワード単位の消去チェックや消去操作が必要となる
  • これは、今後ワード単位の API を追加する(RX64M 系も同じように追加が必要)

RX C++ フレームワーク、RX261 サポート

RX260/RX261 が発売された

ルネサス社は、RXマイコンの新シリーズ、RX260/RX261 を発売した。

https://www.nikkei.com/article/DGXZRSP680552_S4A021C2000000/

チップワンストップでの価格は、以下(現在、1品種しか確認していない)

RX261 100QFP, ROM: 512K, RAM: 128K, DataFlash: 8K

  • R5F52618BGFP#70 @852、10個時 @621

※RX260 は、RX261 から、CANFD、USB、セキリティ関係IP を省いたタイプのようだ
※セキリティ関係IPは、ルネサス社との特別な契約により、内容が公開されるようだ


主な特徴

  • RXv3 コア
  • 最大動作周波数 64MHz
  • 32 ビット単精度浮動小数点
  • 1.6V ~ 5.5V 動作
  • 高速動作モード:84 µA/MHz
  • CAN FD Module (CANFD)
  • USB2.0 Full Speed, Host, Function
  • 12ビットA/D変換器
  • 8ビットD/A変換器

このシリーズ、RX26T の系統なのかと思ったけど、RXv3 コアにして、低消費電力化を図り、RX140、RX231、のリソースを統合したような CPU で、USB が使える事は良いものの、SSIE、SDHI が省かれるなど、単純に RX231 を代替えする事が出来ないのが少し勿体ないと思う。
※RX231 の代わりが出来てしまうと、RX231 が存在する理由が無くなってしまう・・、D/A も 8 Bits だし・・・

RX231 の 54MHz に比べて、64MHz は少しだけ速くなったが、微妙な感じ。

それでも、C++ フレームワークではサポートファイルを用意して、とりあえず、使えるようにしておいた。(コミット済)

  • RX140、RX231 のペリフェラルと同等の部分が多いので、新規に作成したファイルは少ない為、労力は少なかった。
  • クロック構成が多少特殊なので、それらのファイルは新規に用意した。
  • ただ、まだ実際にデバイスを入手していないので、動作確認をしていないのだけど・・・

この CPU 割り込みが、全て標準ベクタにアサインされていて、選択型や、グループ割り込みが無い設計になっている。


CANFD のドライバーを、本格的に用意したい

このデバイス、CANFD を搭載しているので、自動用途にも向いているように思う、しかも電気を食わない。
現状 CANFD のドライバーを実装していないので、それも早々に用意したい処だ・・


まとめ

新しいシリアルコミュニケーション RSCI も搭載している、これは、他で展開する(ARM、RISC-V)新しいもので、それらと共通の仕様となっているようだ。
※CANFD もそのようだ・・
とりあえず、ドライバーは用意してある(まだ、ちゃんとした動作確認はしていない)

値段もそこそこ安いし、色々使えそうなので、早急にチップを購入して実験してみたい。

rx_prog の更新

Renesas RX Series Programmer Version 1.90
Copyright (C) 2016, 2024 Hiramatsu Kunihito (hira@rvf-rc45.net)
usage:
rx_prog [options] [mot file] ...

Options :
    -P PORT,   --port=PORT     Specify serial port
    -s SPEED,  --speed=SPEED   Specify serial speed
    -d DEVICE, --device=DEVICE Specify device name
    -e, --erase                Perform a device erase to a minimum
    --id=ID[:,]ID[:,] ...      Specify protect ID (16 bytes)
    -r, --read                 Perform data read
    -v, --verify               Perform data verify
    -w, --write                Perform data write
    --progress                 display Progress output
    --erase-page-wait=WAIT     Delay per read page  (2000) [uS]
    --write-page-wait=WAIT     Delay per write page (5000) [uS]
    --device-list              Display device list
    --verbose                  Verbose output
    -h, --help                 Display this

rx_prog の歴史的背景

RX マイコンのフラッシュ書き換えに、独自に実装したプログラムを保守、管理している。

「Renesas Flash Programmer」があるのに、何故?と思われるかもしれないが、歴史的な背景がある。

最初は、コマンドラインから動かせるとか、マルチプラットホーム(Windows,Linux,OS-X)とか、色々な理由があって、少しづつ機能追加していって、現在の姿になっている。

R8C/M120AN マイコン用のフラッシュプログラマーを実装したのもあって、「RX マイコン用も欲しいなぁー」と単純に思ったのも要因としてある。
なので、同じように使えるような仕様にしてある。

自分は、どうも GUI の操作が面倒だと感じる、複数のマイコンを試す場合など、R.F.P.では、プロジェクトを開き直す必要がある。

又、マルチプラットホームで動作するようにしてあるので、個々に専用の設定キーがあったり、色々な環境で使い回すのに都合が良いように工夫してある。

ただ、現状、機能的には完全では無い。


RX26T のサポート

RX26T は、今までの RX マイコンと異なり、書き込むページサイズが 128 バイトとなっている。
※以前は 256 バイト

その仕様に伴い、細かく色々変更したものの、何故か、書き込みに失敗する不具合があり、長い間、ほったらかしていた・・

丁度良い機会だったので、不具合の原因を調べてみたー
ところが、中々原因が掴めない。

結局、「erase_page」にバグがあり、それが引き金となり、ちゃんと消去されていない為、書き込みに失敗する事が判った。
この原因を見つけるのに、かなり時間を使ってしまったが、ちゃんと動作するのは嬉しいのものだー

これで、手持ちの RX マイコンは全て、サポートして、動作実績がある事になる!
※RX65x は、ボードを作って無いので、試せていないが・・・


RX220 の erase_page で不具合

RX220 は、ID コードプロテクトをしていない状態だと、ブートモードでデバイスと接続して、P/E モードに入ると、自動でフラッシュを消去してくれる機能がある。
※P/E モード: プログラム、イレース モード
※このような仕様は、RX220 に限らず、RX24T、RX63T など、少し古いデバイスでは、そのようになっている場合がある。
※その為、「erase_page」の機能をちゃんと実装していなかった。

又、消去されている、されていないに限らず、必ず「消去」コマンドを発行する事で、プログラムの書き込みに関する手順を一般化出来るので、消去の機能を省くのは良くない。

今回、そのケアも行った。
ただ、古い、RX マイコンでは、フラッシュのプログラミングプロトコルが、あまり洗練されていない事がある。

RX220 のハードウェアーマニュアルを読み、「erase_page」の実装を行い、実験すると、エラーで消去出来ない。

エラーのステータスを調べると、「ブロック番号エラー」となっている。

「ブロック番号」とは、RX220 の解説によると、2K バイト単位で、128 ブロックあると書かれている。(256K品)
※「36.4 ブロック構成」

ところが、この仕様に沿って、適切なブロック番号を渡しても、エラーとなる・・

そもそも、ブロック単位が 2K バイトって「変」だよな・・と思って、デバイスの接続時に、取得するエリア情報を観てみたー

#01/26: Area: FFFFF000, FFFFFFFF
#02/26: Area: FFFFE000, FFFFEFFF
#03/26: Area: FFFFD000, FFFFDFFF
#04/26: Area: FFFFC000, FFFFCFFF
#05/26: Area: FFFFB000, FFFFBFFF
#06/26: Area: FFFFA000, FFFFAFFF
#07/26: Area: FFFF9000, FFFF9FFF
#08/26: Area: FFFF8000, FFFF8FFF
#09/26: Area: FFFF4000, FFFF7FFF
#10/26: Area: FFFF0000, FFFF3FFF
#11/26: Area: FFFEC000, FFFEFFFF
#12/26: Area: FFFE8000, FFFEBFFF
#13/26: Area: FFFE4000, FFFE7FFF
#14/26: Area: FFFE0000, FFFE3FFF
#15/26: Area: FFFDC000, FFFDFFFF
#16/26: Area: FFFD8000, FFFDBFFF
#17/26: Area: FFFD4000, FFFD7FFF
#18/26: Area: FFFD0000, FFFD3FFF
#19/26: Area: FFFCC000, FFFCFFFF
#20/26: Area: FFFC8000, FFFCBFFF
#21/26: Area: FFFC4000, FFFC7FFF
#22/26: Area: FFFC0000, FFFC3FFF

やっぱりね・・・
このリストによると、FFFC0000~FFFF7FFF は 16K 単位で、
FFFF8000~FFFFFFFF は 4K 単位であるようだ・・・

この事実に沿って、ブロック番号を指定したら、ちゃんと消去出来たー
マニュアルの嘘は勘弁して欲しい~、これは、あまりに酷いので、報告しておこうかな・・・


RX231/RX24T の書き込み速度

最近、RX231、RX24T の書き込みで、途中ストールする場合が多くなった・・・
この症状は、ページライト時に、十分な遅延が不適切で、書き込みデータを転送出来ない場合に起こると思われる。

そこで、通常の倍、遅延を取るように common/makefile に指示した。
※「--write-page-wait=15000, --erase-page-wait=4000」


ブランク・チェック

主に、RX200 系や、古い RX62x 系、RX63x 系では、ブランクチェックの仕様が古く、全体が消去されているか、いないかしか判らない。
rx_prog は、書き込む際、書き込むデータのマップを 256 バイト単位で作成して、必要な領域のみ、消去するようにしている。

又、ID コードが無指定の場合、デバイス接続で、自動で消去される仕様なので、ブランクチェックを行い、全体が消去されていたら、余分な消去操作を行わないようにした。

さらに、消去領域は、広いので、一旦消去されたブロックに対して、何度も消去操作が発生しないようにした。


まとめ

マイコンの違いで、手順を完全に分けているが、マイコンが異なっても、同じ手順で重複している物がかなりある。
現状では、これらは、コピー、ペーストになっていて、保守性が最悪な状態だ・・・
次は、これらの仕組みを整理してまとめようと思う。

又、まだサポートしていない機能が色々あるのでそれも何とかしたい・・

  • Config memory への書き込み
  • プロテクト ID の書き込みと管理
  • 読出し機能と管理など
  • 詳細なエラーレポート

iPhone6s のバッテリー交換

iPhone6s が懐妊

自分は大月の田舎に住んでいる、このような山沿いの集落では、あるあるなのだが、何かの時事会役員になる事になる。
今は、組長と、氏子総代の総務を担当しており、色々な仕事がある。(ボランティアなので、仕事の合間にこなす必要がある)

昨日、氏子関係の資料を配る為、近所の集落を回っていた。
昨日は、かなり暑かった・・
その時、携帯の google MAP を観ながら、目的の家を探していたのだが、あっとゆー間に携帯が膨らんできた・・

俗に言う「懐妊」とゆー現象だ、その状態でも、電源は切れずに、使えていたのだが、発火するのではと気が気では無かった。
と言っても、MAP が無いと、何も出来ないので、その状態で、何とか資料を配布した。

自宅に戻って、新バッテリーを注文した。

iPhone6s は、かなり古い携帯だが、十分な性能で満足している。


次の日にはバッテリーが到着

田舎でも、宅配便は、意外と遅延無く届くのがありがたい!
次の日の3時くらいに、先日注文したバッテリーが到着、早速交換作業を開始した。
※バッテリーの交換は二回目なので、手順は大体理解しているが、ネジが小さく、視力も落ちているので、難儀する・・

バッテリーの両面テープを抜くのが怖かったが、予め、無水エタノールをバッテリーとケースの隙間に入れておいたので、非常にスムーズに抜け、一番の懸念事項が解消された。
※一回目のバッテリー交換時に、もの凄く難儀し、無理やりバッテリーを剥がそうとして、バッテリーが発火して大きな事故になる処だった事は秘密にしているw


両面テープの残りを掃除

意外と大変なのが、残った両面テープのカスを掃除する作業だ・・
無水エタノール、キムワイプ、ピンセットなどを総動員して、掃除した、結構な時間を要したー


新バッテリーを組み込み

新バッテリーに両面テープを貼り、コネクターの位置を合わせて、組み込む。
コネクターの位置をちゃんと合わせておかないと、コネクターがちゃんと刺さらなくて、電源が繋がらない事がある。
※実際、それが起こったが、繋ぎ直して、電源が入る事を確認。


最終組み立て

ケースに両面テープを貼る。
※これが、又、意外と苦労する・・

液晶を元に戻して、ケースと合わせる前に、電源を入れてみるが・・
電源が入らない・・
ここで、電源コネクターの差し込みが不十分であったようで、挿しなおして、電源が入る事を確認。
ケースを閉めて、最後のネジを閉めた。


まとめ

iPhone6s はもうかなり古いので、もう少し新しい 8plus 位の中古が欲しいのだが・・・

この機会に、購入しようかとも考えている。
もう少し大きい画面が欲しい~

Just another WordPress site