Siglent SDS1204X-E 購入

消費税が10%になる前に、前から検討していた、デジタルストレージオシロスコープを購入した。

今までは、オークションで買った、アナログオシロスコープ(テクトロニクス 2465A)を使っていた。

DSOの場合、アナログ、デジタル変換の性能も、かなり色々ノウハウがあり優劣があるのだが、問題はソフトウェアーだろう。
かなり色々調べたが、値段とパフォーマンス、操作性など総合的な評価から「Siglent」が良さそうだと判断した。

同じシリーズでは、低価格な100MHz機があるのだが、どうせ買うなら、より良い物をと言う事で、200MHz機にした。
自分は値段が安く、アフター(一応3年保障付)がある所から購入したが、200MHz機は、在庫は無く、取り寄せだったが1週間くらいで商品が届いた。
流石に、本国から正規で入っている物なので、ファームは最新になっており、全く問題は無かった。

4チャネル機は、オプションとして、ロジックアナライザ機能を追加する事が出来るが、プローブとソフトはコストがそれなりだったので、残念だが見送った。
※USBのロジックアナライザがあるので、当面、それを利用する事になる・・

まだ、使い方を覚えている段階で、使いこなすまでには相当かかると思うが、やはり新品で最新の機器は素晴らしく、操作性も普通に使うには問題を感じない。

I2C、SPI、UART、CANなどのトリガー機能、FFTなどの解析機能などが標準であり、かなり便利に使えそうだ。

日本語にも標準で対応している。

ElectronicsDIY5 web shop

R8C で AD9851を試してみる

以前に、周波数シンセサイザ、AD9833 を試していたが、より高い周波数に対応した、AD9851も試してみた。
※最近RXマイコンばかりで久しぶりにR8Cを触った、このような実験には、小回りが利いて便利だ。

値段はかなり高く、モジュールで3500円程だった。

買ってから気がついたが、このICはサイン波のみで、三角波はサポートしていない。
※矩形波はコンパレーターがあるので作れるだろうか・・

ただ、内部は最大180MHzで駆動できる為、出力できる周波数を高く設定でき、周波数ステップも細かく設定可能。
※AD9850は最大125MHz
※AD9833は最大25MHz
※AD9851では、電源電圧により、最大動作周波数が異なる

モジュールでは、出力にLCRを使ったローパスフィルタが組んであるのだが、出力する周波数によって振幅が小さくなるので、結構扱いが面倒だ・・
※10MHzだと減衰がかなり大きい。
この手のICを実用的に使うとなると、一番ネックになるのが、出力の扱いだと思う。
中心をGNDにして、+-で振幅させたいとか、出力振幅やオフセットを設定したいとかするには、外部に何らかの回路を付けたいが、マイコンで制御できるようにするには、意外と単純では無い。

いつものようにテンプレートライブラリとしたが、周波数の計算で、倍精度の浮動小数点を使っている。
本来整数計算だけで出来ると思うが、参考にしたライブラリの手法をそのまま流用した、時間がある時にでも考えてみたい。

ICの制御は基本4本の制御線が必要で、外部基準発信器をどのようにするかを設定出来るようにしてある。

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
    @brief  AD985X テンプレートクラス
    @param[in]  D7      ポート・クラス
    @param[in]  W_CLK   ポート・クラス
    @param[in]  FQ_UD   ポート・クラス(FQ_UpdDate)
    @param[in]  RESET   ポート・クラス
    @param[in]  BASEC   ベースクロック(AD9850:125, AD9851:180)
*/    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
template <class D7, class W_CLK, class FQ_UD, class RESET, uint32_t BASEC>
class AD985X {

...
public:
    //-----------------------------------------------------------------//
    /*!
        @brief  レジスターを設定
        @param[in]  w0      W0 レジスター値
        @param[in]  freq    周波数
     */
    //-----------------------------------------------------------------//
    void set_reg(uint8_t w0, float freq)


};

サンプルでは、外部OSCが30MHzで、内部の6倍PLLを有効にする。

    // P1_0(20):
    typedef device::PORT<device::PORT1, device::bitpos::B0> D7;
    // P1_1(19):
    typedef device::PORT<device::PORT1, device::bitpos::B1> W_CLK;
    // P1_2(18):
    typedef device::PORT<device::PORT1, device::bitpos::B2> FQ_UP;
    // P1_3(17):
    typedef device::PORT<device::PORT1, device::bitpos::B3> RESET;

    // 180MHz
    typedef chip::AD985X<D7, W_CLK, FQ_UP, RESET, 180> AD9851;
    AD9851  ad9851_;



    {  // AD9851 開始
        ad9851_.start();
        ad9851_.reset();
    }




    char tmp[32];
    command_.get_word(1, sizeof(tmp), tmp);
    float a = 0.0f;
    if((utils::input("%f", tmp) % a).status()) {
        ad9851_.set_reg(0b00001001, a);  // Phase: 1, PLL 6x
    } else {
        error = true;
    }

市販の周波数ジェネレーターはそれなりに高いので、安価な実験用発信器が欲しかったのだが、実用的な物にするにはそれなりの工夫が必要で、それなりに考える必要がある。
AD9851は内部180MHz動作なのだが、三角波も出せないので、AD9833の方が良いのかもしれない・・・

AD985X.hpp
github AD9851_sample

RX65N Envision Kit ファミコンエミュレーター再び

RX65N Envision Kit で実現する、ファミコンエミュレーターだけど、内臓メモリの空きエリアなどの問題で、動作させる事が出来るカートリッジファイルに大きな制限があった。

それもあって、実用性が乏しいので、機能を追加する事に消極的だった。
なので、本来持っている機能(ステートのセーブ、ロードなど)実装していなかった。

以前のバージョンでは、最大でも1MビットROM1個分(128Kバイト)までしか動作出来なかった。
※1Mビット1個でもメモリ不足になるカートリッジファイルもあった・・
最近、nes ファイルのロードと、メモリアロケーション関係を整理(nes_rom.c)、修正したら、実は2Mビット(256K)まで動作可能な事が判った。
※何で、こんな「無駄」な事をしていたのか理解に苦しむが、元のソースコードは、ESP32用だったので、ESP32 用になっていた物を Windows で動かす実験をした際に、適当な実装になっていたのがそのまま残っていた・・・

2Mビットまでとなると、過去に自分がプログラムを担当した「暴れん坊天狗」が動く!(RX65NでNESEMUを走らせるゴールのようなもの)
※かれこれ30年前のファミコン向けゲーム(NES版は、「Zombie Nation」)
※1Mビット(PRG)+1Mビット(CHR)、MMC3バンク切り替えという仕様
※生産数が少ない為、今では貴重なカートリッジで、中古価格は意外と高い、確か、まだ実家に未使用品が1個あったハズだが、捨てられているかもしれない・・
※国内版と海外版でタイトルが異なるが、本来、海外版向けとして開発していたが、国内で売る場合に、京都のN社の「倫理規定」が通らず、社長の一存で、国内向けにタイトルを変更したものだった。
今でも覚えているが、社長が、新聞の番組欄で「暴れん坊将軍」を見て、それと、その当時N社が販売していた「花札の天狗」をかけて出来たタイトルで、自機のキャラクターも、落ち武者の顔から天狗になった・・・
まぁ、B級とか、糞ゲーとか揶揄されるが、結構真面目に丁寧に設計され作っている。
感覚と理論的なバックボーン、バランスで出来ている。
※サウンドドライバーや、スコアのオーサリングツールも自分で実装していて、ドット絵ツール以外は全て一人でコーディングした。
このゲームは、音楽も高く評価されている。
源平のN氏が最後に作曲をしたファミコンの作品だと思う。
※楽曲は、N氏とO氏の共同作業だった。
※ドラムやスネアなどで使っている、デルタモジュレータのビットストリームは、当時交流があったU氏が、FMタウンズでサンプリングして作成したデータが元になっていて、音楽や企画を担当したO氏が、それのスタートアドレスを微妙にずらしてバリエーションを作り色々工夫して使っている。
「NOAのテスターにNESでは最高の音楽」と言ってもらった。
※国内版(海外版は修正されている)には、バグがあり、割り込み内で、プログラムバンクを切り替えていて、元に戻し忘れているので、微妙な確率で、暴走して、奇妙な動作をする事がある。
このバグは処理が重い状態じゃないと発生しないので、デバッグでは見つける事が出来なかった・・・
驚く事に、ネットで流通している nes ファイルの中には、このバグにパッチを当てて修正しているものもある。
※エミュレーターでは未定義動作で停止してしまうのだろう~

RX65N のパフォーマンスは素晴らしい、ファミコンのハードウェアを完全にエミュレーションできる。
音も完全に近い状態で再生される。
そして、ステートのセーブとロード機能も実装しておいたので、バッテリーバックアップ機能が無いカートリッジでも、途中の状態をまるまるセーブして保存出来る。
※ファミコンの電源を切らない状態の再現

カートリッジファイルは拡張子が「nes」になっており、PC などのエミュレーターなどで一般的な形式を使っている。
※このファイル形式は、カートリッジのハードウェアー設定なども含まれていて、自動で、キャラジェネのH、Vリンク、マッパーのエミュレーションを切り替える。

ESP32 版と大きく異なるのは、2Mビットまでだが、カートリッジファイルを選んでエミュレーションする事が出来る(この違いは大きい)点
オーディオの再生品質がほぼ完全な事。
※ESP32 では、nes ファイルを ROM データとして、プログラムと同梱しなければならず、又、オーディオの品質もかなり低いと思われる。
エミュレータの品質が高いのは、nesemu コードが優れており、ルネサス RX65N マイコンの高機能によるところが大きいものとなっている。

RX65N Envision Kit の改造方法は、以下のリンクを参照して頂きたい。
NESEMU_sample for GitHub

改造は、比較的ハードルが低く、プログラムをコンパイルする環境も、 gcc で、ソースコードを取得して、手順を進めるだけなので意外と簡単だと思う。
※ルネサス純正コンパイラでは、試していないが、コンパイルが出来ないかもしれない。
※RX65N にプログラムを書き込む場合、ルネサス社のツール(Renesas Flash Programmer)を利用する必要があるが、無料版をダウンロードして使う事が出来る。

ゲームの操作は、タッチパネルでは操作が難しいので、外部にファミコンと同等なゲームパッドを接続する必要がある。
※ファミコンパッドには8ビットのシフトレジスタ(CMOS 4021B)が載っており、シリアルクロック、ロード/シフト、データの3本で情報を取得する。

RTK5RX65N Start for NES Emulator
Start GLCDC
# help
    dir [xxx]       list current directory
    pwd             current directory path
    cd [xxx]        change current directory
    nes filename
    pause
    reset
    save [slot-no]
    load [slot-no]
    info
    call-151
# nes GALAXIAN.NES
ROM header dirty, possible problem
ROM loaded: GALAXIAN.NES [0] 32k/8k Hcreated memory mapper: None
setting up mapper 0
reset memory mapper
# call-151
$fff8.ffff
FFF8- FF FF 0C E2 20 E0 20 E0
$e020l
E020- 78       SEI
E021- D8       CLD
E022- A2 4D    LDX  #$4D
E024- 9A       TXS
E025- A9 10    LDA  #$10
E027- 8D 00 20 STA  $2000
E02A- AD 02 20 LDA  $2002
E02D- 10 FB    BPL  $E02A
E02F- A2 00    LDX  #$00
E031- 8A       TXA
E032- 95 00    STA  $00,X
E034- 9D 00 02 STA  $0200,X
E037- 9D 00 06 STA  $0600,X
E03A- 9D 00 07 STA  $0700,X
E03D- E8       INX
E03E- D0 F2    BNE  $E032
E040- A2 00    LDX  #$00
E042- BD 05 01 LDA  $0105,X
E045- DD 10 E0 CMP  $E010,X
E048- D0 0B    BNE  $E055
$0.ff
0000- 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
0010- 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
0020- 00 00 00 40 00 00 00 24  00 00 01 00 00 14 01 00
0030- 00 00 00 00 00 00 03 20  F2 E1 F3 E9 00 01 01 00
0040- 00 00 00 01 02 00 00 00  00 00 00 00 04 00 00 00
0050- 00 00 00 00 00 00 00 00  00 00 00 21 2B 41 4A 50
0060- 59 5C 07 0F 10 00 0C 00  32 00 00 00 00 00 00 0B
0070- 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
0080- 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
0090- 00 00 00 00 00 00 00 00  00 00 01 00 00 F0 FF 00
00A0- 00 01 00 09 08 07 06 05  04 03 02 01 00 09 08 07
00B0- 06 05 04 03 02 01 00 09  08 07 06 05 04 03 02 01
00C0- 00 00 FB 07 0F 1F 3F 1F  18 3E 1C 07 00 07 0F 1F
00D0- 3F 1F 1F 3F 1F 0F 07 00  2F 00 86 20 33 00 3D 09
00E0- 23 00 77 06 F8 F9 00 00  CF E9 B0 E9 0B 0B 00 00
00F0- 00 00 0B 00 00 00 00 FF  00 00 06 90 00 00 04 02
$0.
0000- 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
$0:1 2 3 4
$0.
0000- 01 02 03 04 00 00 00 00  00 00 00 00 00 00 00 00
$400
0400- FD
$

上記のように、シリアル接続により、モニターぽぃ機能が使える。
※SCI9、8ビット、1ストップビット、115200 BPS

・「call-151」でモニターが起動(「exit」で戻る)
・6502逆アセンブラが使える。
・メモリダンプや、メモリの書き換え等が出来る。
※「call-151」の意味が判る人なら、使い方は判ると思うが、上記機能くらいしか実装していない。

LAN8720A モジュールの試用

FreeRTOS でネットワーク関係を実験したくて、中華製のLAN8720 モジュールを試してみた。

モジュールは、アマゾンで購入した。

本当は、RX65N Envition kit で未実装のPHYチップやトランスなどを実装して、実験するつもりで部品を買っていたが、QFNパッケージのハンダ付けが難しく(1個失敗した)、また、本体を壊してしまうのではと思い、工具も無いので、ストールしていた。

LAN8720A はマイクロチップの 10/100 イーサネット PHY で、安価で入手しやすく、比較的良く使われているデバイスだ。
※GR-KAEDE にも使われている。

QFNパッケージで、裏が全面 GND、DIY ではユニバーサル基板で製作しにくい。
※QFN のユニバーサル基板が割高で入手しにくいのも要因

モジュールは安く送料も無料だが、船便なので、注文してから10日程かかる、基板が届いて早速開封、ネットで回路などを探す。
「LAN8720 ETH Board」

このモジュールは、50MHz の OSC が乗っていて、一般的な25MHz クリスタルとは異なっている。

LAN8720Aは、リセット時のピン状態を読み込んで、基本的な設定を自動で行う「Configuration Straps」と呼ばれる機能がある。

50MHz 外部クロックを使う場合、「LED2/nINTSEL(2)」をオープンかプルアップしておく必要がある。
※ボードはLEDが接続されており「オープン状態なので」50MHz外部クロックモードになっていると思われる。
同時に LED のドライブはアクティブ LOW となる。(吸い込み)

最初に試すソフトは、以前に実験した、ルネサスの T4 ライブラリなので、GR-KAEDE などと同等にしておく必要がある。

RX マイコンの仕様なのかもしれないが、PHY デバイスとの通信で使う「MDC、MDIO」は参考回路ではプルアップしてあるので、同じようにプルアップしておく。
※以前に、プルアップが無い場合にPHY通信が失敗した事があった。
※回路図を見ると、MDIOはプルアップしてあるので、MDCのみ適当な抵抗(3.9K)でプルアップしておいた。

このボードで、問題なのは、RX_ER 端子がプルアップされて、外部コネクタに出ていない。
また、この端子は、「 Configuration Straps 」における、PHYアドレスを設定するピンでもある、チップ抵抗を外して、直接ラインを接続した。
※ボードは、写真のように、ピンヘッダーを外して、直接ボードに取りつけてある。
※このような組み方を良くする、やってみると簡単で確実。

RX_ER 端子を直接接続

今回実験に使ったRXマイコンは、RX71Mで、169ピンタイプ。

イーサーネットは、チャネル0を使った。
各ピンの接続は以下のようになっている。
RX71M: P83/RMMI0_CRS_DV(74) ---> CRS_DV(7)
RX71M: P82/RMMI0_TXD1(79) ---> TXD1(14)
RX71M: P81/RMMI0_TXD0(80) ---> TXD0(11)
RX71M: P80/RMMI0_TXD_EN(81) ---> TXD_EN(12)
RX71M: P77/RMMI0_RX_ER(84) ---> LAN8720 (10) 直接続
RX71M: P76/REF50CK0(85) ---> RX_CLK(8)
RX71M: P75/RMMI0_RXD0(87) ---> RXD0(10)
RX71M: P71/RMMI0_RXD1(88) ---> RXD1(9)
RX71M: P72/ET0_MDC(101) ---> MDC(5)
RX71M: P71/ET0_MDIO(102) ---> MDIO(6)
RX71M: Vcc(3.3V) ---> VCC(1, 2)
RX71M: Vss(GND) ---> GND(3, 4)

接続の様子:

Start RX71M http sample
Link no proccess (0)
Link no proccess (1)
Link no proccess (2)
Link no proccess (3)
Link no proccess (4)
Get DHCP: 192.168.0.4

RXマイコン、FreeRTOS、FatFs でオーディオ再生

前回、マルチスレッドとは言え、シンプルな物で、動作検証を行った。

そこで、今回はもう少し複雑となる、MP3、WAV、のコーデックを動かして、実用的な実験を行った。

詳細は「RXマイコン、FreeRTOS、FatFs、で MP3、WAV の再生」に投稿した。

プログラムは、
・自作 RX64M
・GR-KAEDE
・RX65N Envition kit
などで行った。

FreeRTOS は使える~

元は、シングルタスク用に作ったもので、それを別タスクで動かし、コーデックのデコードをやっている。

タスク間は、ファイル名の受け渡しを行っている。

音楽再生中に、SDカードのディレクトリーを取るなど、平行動作させても、音楽の再生は途切れずに鳴り続ける。

FreeRTOS で FatFs を使う

FatFs 0.13c には、スレッドセーフで動かす為の機能が用意されている。

そこで、FreeRTOS で異なるタスクから、ファイル操作を行う実験を行い、その設定などをまとめ Qiita に投稿した。

RXマイコンを使って、FatFs を FreeRTOS で運用する

GR-KAEDE(RX64M)、自作のRX64Mボード、RX65N Envition Kit などで動作を確認した。
※RX66T、RX71M でも動作するだろうが、SDカードのインターフェースを付けていないので確認できない・・

RX24Tではメモリが少なく、動作を確認出来なかった・・

RX24Tは、RAMが16Kしか無いので、タスク別にスタックを確保する必要があるので、どうしても無理があるのかもしれない。
多分、32Kあれば、動くと思える。

FreeRTOS で FatFs を使う場合、現在のバージョンでは、多少、FatFs のソースコードを修正する必要がある。

FatFs をバージョンアップ

FreeRTOS を本格的に運用する目処がたったので、まず、FatFs を最新版にした。

以前は、「ff12b」を使っていた。

今回「ff13c」に移行した。

意外と大きく変更になっている。

・ファイル名やパスが整理された。
・ヘッダー定義名やマクロ名などが、吟味され、より良くなった。
※マクロ名など、他のシステムと「当たらない」ように修正されたようだ。
・ファイルパスの文字コードがより洗練されて扱いやすくなった。
※ファイルのパスコードで、以前は、CP932 か、UTF-16 しか選べなかったが、UTF-8 も使えるようになった。
・排他制御用をやりやすいように変更があったようだ。
※lock、unlock などの関数コールが追加され、FreeRTOSと親和性が高い。
・一部、API が廃止になり、新しい API になった。
※日本だけなら、コードページ932だけで良いが、世界中で使っているので、その辺りを柔軟に改良したようだ。

などなど、細かく色々修正されている。

えるむ/ChaN さんのこのプロジェクトは世界中の人が使っている。
本当に素晴らしく、高機能なもので、今でも、少しづつ改良されているのには驚くばかりで、本当に頭が下がる。

FreeRTOS のような RTOS では、複数のタスクから、ファイル操作が出来ないとならないので、ドライバーの出来は、性能に直接影響するので、現在のソフト転送は改良する必要性がある。

ただ、難しい部分でもあり、性能を上げるのは簡単ではなさそうだ・・・

-----

とりあえず、github の FatFs を使っているアプリを全て修正し、master ブランチにマージしてある。

FreeRTOS、Rxv2 と、他デバイス対応

現在自分が扱う RX マイコンはどれも、RXv2 コアなので、GCC/RX600v2 のコードを使いたい。
しかしながら、gcc-6.4.0 は「RXv2」に対応していない。

rx-elf-as は、RXv2 に対応している。

% rx-elf-as -v --help
GNU assembler version 2.28 (rx-elf) using BFD version (GNU Binutils) 2.28
Usage: ./rx-elf-as [option...] [asmfile...]
Options:

.....
.....
.....

  --mcpu=<rx100|rx200|rx600|rx610|rxv2>
  --mno-allow-string-insns
Report bugs to <http://www.sourceware.org/bugzilla/>

そこで、RXv2 依存のアセンブリコードを使った関数を、アセンブラソースに分離して、対応する事にした。

多少の問題としては、「FreeRTOSConfig.h」の設定を使っている部分で(割り込みの優先順位)なのだが、まぁこれはあまり変更する事が無いと思うので、とりあえず、直接値を代入しておいた。

これで、リンクして、無事実行ファイルが出来、動作を確認したのだけど、そーいえば、コンパイラからアセンブラにオプションを渡せないのかな?

調べたら、あったー・・・

-Wa,option
option をアセンブラに対するオプションとして渡します。

なんだー、これだー、とゆー事で、Makefile を少し修正して、ソースコードはそのままで、「RXv2」に対応する事が出来たー
非常にスマートに対応出来た。

下記のようにコンパイラオプションを追加する事で、内部動作は、コンパイル後にアセンブラを起動する場合に、以下のオプションが追加される。

-Wa,-mcpu=rxv2

続いて、他のCPUについても、ICU 関係のクラスに「SWINT」関係を追加して、Makefile を作成して、実行ファイルを各マイコンに書き込んで試してみた。
とりあえず、問題なく動作するようだ。

これで、

RX24T
RX64M
RX71M
RX65N
RX66T

に対応する事が出来た、次は、よく使うドライバークラスをマルチタスク対応にして、ネットスタックの実験に進みたい。

ソースコードは、github の master ブランチにマージ済みとなっている。

FreeRTOS を使い始めました~

少し時間が出来たので、FreeRTOS をポートして、自分の環境で動かし始めた。

詳細は、
「RXマイコンで、FreeRTOS を使う場合の要点
に投稿している。

自分のブログでは、今回「はまった」点にフォーカスしてみたい。

そもそも、FreeRTOS は RX マイコンをサポートしており、RX マイコン用コードもアーカイブに含まれる。
しかし、それは、ルネサスさんの環境用で、自分のように、gcc を自前でコンパイルして使っている場合、そのままでは使えない。

それと、ルネサスさんの環境用なので「iodefine.h」定義が必要なのも、敬遠する理由となっている。
※ハードウェアー定義は C++ クラスで独自に実装してある。

なので C++ ベースの制御クラスを定義して、そのコンテキストを FreeRTOS に使ってもらうようにしたい。

最初は、「簡単」だと思ってやっていたが、勘違いから、かなり時間を使ってしまった・・・

FreeRTOS では、ソフトウェアー割り込みも使う。
今まで、ソフトウェアー割り込みは使った事がなく、割り込み関係クラスもサポートしていなかったので、それらを追加した。
※これが、間違いの始まり・・・

「SWINT」はベクター番号27で、この割り込み許可と、割り込みレベル設定は、ICU 関連レジスターにある。
割り込み許可は、問題無かったが、割り込みレベル設定は、IPRのベースアドレス+27と思い込み、そのような設定にして、何の疑いもしなかった。

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
    @brief  IPR レジスタ @n
            全て、下位4ビットが有効
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
template <uint32_t base>
struct ipr_t {


 
   rw8_t<base + 27> SWINT;



};
static ipr_t<0x00087300> IPR;

そして、ようやく、主要な部分が出来て、簡単なサンプルを用意して、マイコンに書き込み起動するが動作しない・・・

その過程で、色々「マズイ」部分も見つかり、直すが、全く動かない。

デバッグ用コードを入れて、どこまで動いているか確認すると、定義したタスクが起動していない・・・

そして、なぜ起動しないのか、ソースを追うと、どうやら、ソフトウェアー割り込みが怪しい事に気がつき、単独で、ソフトウェアー割り込みの動作を確認してみた。

当然のように「動かない」・・・

そこで、ハードウェアーマニュアルを見直したら、ベクター27のソフトウェアー割り込みレベル設定は、+3である事が判った・・・
それを修正したら、動作するようになった。

    rw8_t<base + 3> SWINT;

そこで、不思議に思った事がある・・
ソフトウェアー割り込み(SWINT)を使う場合、「asm("int #27");」を実行するハズだけど、どこを探しても、それらしい実装が見つからない。
よくよく調べると、ICU レジスターには、ハードウェアーから、SWINT を発生させる機能があり、それをハードコードしていた。
※「portmacro.h」

#define portYIELD()                         \
    __asm volatile                          \
    (                                       \
        "PUSH.L R10                 \n"     \
        "MOV.L  #0x872E0, R10       \n"     \
        "MOV.B  #0x1, [R10]         \n"     \
        "MOV.L  [R10], R10          \n"     \
        "POP    R10                 \n"     \
    )

「0x872E0」 に「1」をライトするのがそれだー、これは痛い・・・
何で、iodefine.h をインクルードしているのに、こんな事してるのか?
それに、こんな面倒な事しなくても、「asm(int #27);」で良くない??

疑問は残るけど、FreeRTOS に戻って、実験したらようやく動作したーー(ヤレヤレ~)

そもそも、ハードウェアー依存部分は、完全に外部に出せるから、「port.c、portmacro.h」に含める必要性は無いのに・・・

そんなこんなで、動くようになったので、github に上げた。

これから、色々マルチタスク対応にしていこうと思う。

追記:
「ソフトウェアー割り込み命令(int #27)」と「SWINT ハードウェアー割り込み」は動作が異なるとの知見(RXマイコン内の動作がどのように異なるのか不明なので、完全に理解している訳ではないが・・)を受けて、とりあえず以下のように変更した。

※気になっていたのは、32ビットリードなので・・

#define portYIELD()                         \
    __asm volatile                          \
    (                                       \
        "PUSH.L R10                 \n"     \
        "MOV.L  #0x872E0, R10       \n"     \
        "MOV.B  #0x1, [R10]         \n"     \
        "CMP    [R10].UB, R10       \n"     \
        "POP    R10                 \n"     \
    )

RX72Mが発表になってた・・

ルネサスRXv3コアを持つRXマイコンのフラッグシップRX72Mが発表されていた・・

最近、久しぶりに Unity 関係の仕事を請けた為忙しくなり、趣味のマイコンには、なかなか触れない。

RX66T が入手出来るようになり、RX72Tも発表になり、RX71Mの後継が待たれていたが、遂に発表された。
多少、期待していた仕様とは異なるが(最大クロック速度が上がるものと思っていた)それでも、色々新しい機能を追加しているようだ。

デバイスは、今年の9月末量産受付となっているようだ。

RX71Mとどこが異なっているのか、簡単にトピックを記しておく。

  • EtherCAT 対応
  • GLCDC、DRW2D 対応
  • 1Mバイトの内臓RAM
  • 224LFBGA パッケージの追加
  • 倍精度浮動小数点コプロセッサ
  • RXv3 コア
  • ΔΣインターフェース
  • 単精度三角関数演算器
  • PHY マネジメントインターフェース

逆に、無くなった機能として・・

  • サンプリングレートコンバータ
  • USB 2.0 ハイスピードモジュール(480Mbps)
  • FIFO内臓シリアルコミュニケーションインターフェース

他にも細かい違いはあるが、色々改善もされているようだ。

224LFBGA は、ピン数が増えて、良さそうだ、176ピンパッケージでも、主要な機能をアサインしようとすると、使えない事が多い。
ただ、自作基板とかで、デバイスを載せるのは難しいかもしれず、また、多層基板とピン間3本くらいのルールが必要かもしれず、製作コストが上がる・・

GLCDC、DRW2D、1Mバイト内臓RAMのおかげで、LCD を接続した機器を作りやすくなった。
480×272 の LCD で、ダブルバッファが行なえそうだ。
内臓 RAM は、前半512Kがノーウェイト、後半512Kが1ウェイトとなっているので、後半をフレームバッファにする事になるだろうか・・

USBのハイスピード(480MBps)が無くなったのは残念だ・・

シリアルサウンドインターフェース(SSIE)が機能強化されており、外部にオーディオ用DACをより繋ぎやすくなった。

倍精度浮動小数点演算がサポートされたが、gcc などで使えるようになるには、RXマイコン用ライブラリが、gcc のソースツリーに集約される必要があり、それには時間がかかりそうで、多少不安だ、現在のように、かなり古い gcc (gcc-4.8)ベースがこのまま続くとなると、自分で何とかしないといけなくなる・・・
※もうそろそろ、自前のCコンパイラは諦めて、gcc や LLVM ベースに統合するべきだと思うが、専用コンパイラを数十万円で販売していて、フリー版に制限を設けているようでは難しいと思われる。

とりあえず、RX72M に対応したライブラリを追加している。
速くデバイスを入手して動かしてみたい~

Just another WordPress site