6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TOPPERS/ASP - RL78版

Last updated at Posted at 2023-01-10

※この記事は、筆者自身のブログに連載していたものを読みやすく1ページにまとめたダイジェスト版です。無断転載などではありませんのでご了承ください。

概要

半導体メーカー大手、ルネサスエレクトロニクスの16Bitマイコン「RL78」です。

ルネサスエレクトロニクスは、いくつかの種類の16Bitマイコンを販売していますが、新規の採用を推奨されているものは、このシリーズと「R8C」だけです。
むか~しむかし、日立製作所は「H8」という16Bitマイコンを売っていました。
一方同じ頃、三菱電機が「M16C」という16Bitマイコンを売っていました。
ある時、この2社それぞれの半導体部門が分社、その半導体部門同士が合併し「ルネサステクノロジ」という会社ができました。
ルネサステクノロジは「M16C」の後継として、新たに「R8C」という16Bitマイコンを作りました。
しばらくして、そこへNECエレクトロニクスがやってきました。
NECエレクトロニクスは「78K0R」という16Bitマイコンを売っていました。
NECエレクトロニクスは仲間になりたそうにルネサステクノロジを見ています。

な なんと 半導体メーカーたちが・・・!
半導体メーカーたちが どんどん がったいしていく!

なんと ルネサスエレクトロニクスに なってしまった!

ルネサステクノロジとNECエレクトロニクスが合併、「ルネサスエレクトロニクス」という会社ができました。
ルネサスエレクトロニクスは「78K0R」の後継として、新たに「RL78」という16Bitマイコンを作りました。
さて、合併を繰り返して成立したルネサスエレクトロニクスは、この時点で多くの16Bitマイコンのシリーズを抱えていることになりました。
当然、同じようなカテゴリーの製品が重複するのは経営効率が悪いのでシリーズの淘汰が始まります。
まず「M16C」と「78K0R」に関しては、それぞれの後継機種が出ているので収束。
「R8C」は低コスト化、コンパクト化を推し進めて、さながら8Bitマイコンとしての立ち位置に移行。
残るは「H8」と「RL78」です。
この頃、私は「H8」を仕事に趣味にとジャンジャン愛用しており、性能、入手性の良さ、ラインナップの豊富さやペリフェラルの使い易さを気に入っていたので、「H8」だけ後継機種が出ていなくとも今後もメーカーで開発が続けられるものと信じていました。
が…!
2010年代初頭、ルネサスエレクトロニクスは「H8」シリーズの開発を収束、16Bitマイコンの開発リソースを「RL78」シリーズに集中する…というアナウンスを出しました。
なんてこった。
一般論として「RL78」が「H8」よりも優れているから、こういう結論になったはず。
ならば「RL78」とは一体!?
そういや「RL78」って地球連邦軍のMSみたいだな。
見せてもらおうか…「H8」を倒した「RL78」の性能とやらを!
…というわけで「μITRON4.0」準拠のRTOS(リアルタイムOS)であるTOPPERS/ASPを移植してみました。
(なんでやねん!)

必要なもの

今回は、RL78の中でも比較的ハイエンドな「RL78/G14」を搭載した「RL78/G14 Fast Prototyping Board」という評価ボードを使います。
こちらで買うと、3,300円くらいです。

他の型番への移植も可能ですが、TOPPERS/ASPを搭載して動作させるならROM:128KB/RAM:8KB以上の容量を持つ型番を選びましょう。
また「RL78/G14 Fast Prototyping Board」を使用する場合、デバッガーは必要ありません。
この評価ボードには既にデバッガーも実装されています。
「RL78/G14 Fast Prototyping Board」を使用しない場合は「E2 emulator Lite」というRL78に対応したデバッガを使用する必要があります。
こちらで買うと、12,000円くらいですね。

デバッガーとしては良心的な価格ですが、それを搭載している「RL78/G14 Fast Prototyping Board」がそれより遥かに安価なので、如何にお買い得かが分かりますね。
この記事では「RL78/G14 Fast Prototyping Board」を使用した場合の例を説明していきたいと思います。

ダウンロード/GitHub

ソースコードの入手は、こちらからどうぞ。
なるべく定期的にメンテナンスするようにしていますので、動きがおかしいな?という場合は最新版に更新をお願いします。
それでもダメな場合はコメントください。

開発環境の構築(コンパイラ編)

コレがなくちゃ始まらない!
まずはRL78用のコンパイラのインストールを行いましょう。
以下のページでダウンロードします。

上の方には「LLVM」というコンパイラが並んでいますね。
今回使用するのは「GCC」ですので下にスクロールします。

GCC」ありましたね?
早速ダウンロードしましょう!

すると、以下のようにログインを要求されます。
すでに「Open Source Tools for Renesas」のアカウントをお持ちの方は、入力してログインしてください…って、ほとんどの方は持っていないですよね?
その場合は面倒ですけど「登録」をクリックしてアカウントを作成後にログインしてください。
アカウントを作成したからと言って、広告メールがバンバン来るようになるとか、そんなことはありません。
まあ、年に数回更新の情報がメールで来るくらいです。

どうにかこうにかログインに成功したら、以下の画面に戻り、もう一度ダウンロードを試みましょう。
今度はダウンロードできるはずです。

ダウンロードが完了すると「gcc-x.x.x.20xxxx-GNURL78-ELF.exe」というファイルが生成されますので、これをダブルクリック!
程なくして、以下の表示が出ます。
「推奨」とありますので「すべてのユーザー用にインストール」をクリックしましょう。

インストーラーが起動します。
ここは「次へ」ボタンをクリックします。

同意せざるを得ない!
同意する」を選択して「次へ」ボタンをクリックします。

しばらくは「次へ」ボタンを連打です。

これで最後か?
インストール」ボタンをクリックしましょう。

やっとこさインストールが始まります。

インストールが終了すると以下の画面になります。
これも「次へ」をクリック!

インストールはこれで完了!
完了」ボタンをクリックしてください。

インストールしたツールチェーンの環境変数の確認を行います。
ツールチェーンは、先程のインストール作業により既に以下のディレクトリにセットアップされているはずです。
「ProgramData」以下だなんて、ちょっと変わった所にインストールされますね…。

環境変数の設定方法は他のページで調べていただくか、あるいは手前味噌で恐縮ですが、私のブログのページ(TOPPERS/ASPのビルドからデバッグまで~GNUツールチェーンの導入)の「環境変数の設定」の項目を御覧ください。
ただし、パスは…

C:\Program Files (x86)\GNU Tools ARM Embedded\7 2017-q4-major\bin

…となっているところを…

C:\ProgramData\GCC for Renesas RL78 4.9.2.202201-GNURL78-ELF\rl78-elf\rl78-elf\bin

に置き換えてください。
インストーラーが自動的に設定するバージョンでは、一番上に入れられちゃうんですね。
特に問題はないけど…不躾な!
こんな感じ…。

また、このページの「パスの確認」の項目で打ち込むコマンドも、以下のように変わります。

> rl78-elf-gcc --version

続きまして「Cygwin」のインストールを行います。
基本的には「gcc-core」、「make」、「diffutils」、「perl」と「git」の5つのパッケージを含むようなCygwin環境を構築すれば良いです。
もしよろしければ、私のブログのページ(TOPPERS/ASPのビルドからデバッグまで~Cygwinの導入)を参考にしてください。
「Cygwin」がインストールできたら、ここまでの作業が上手くいっているかどうか確認しておきましょう。
次のページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトのビルド)を参照してください。
ただし、今回使用するソースコードはこのページの冒頭の「NUCLEO-F401RE STM32 Nucleo-64」開発ボード用のTOPPERS/ASPカーネル簡易パッケージではなく、「RL78」用のものを使います。
以下のコマンドでソースコードのクローンを行います。

$ git clone https://github.com/RyutaroMorita/asp_rl78_gcc.git

ダウンロードとGithub、いずれの場合も「asp_rl78_gcc」というディレクトリの名前を「asp_1.9.2」などと改名すると、上記のページと同じ状況になります。
また、今回は「OBJ」ディレクトリを作成する必要はありません。
これは既に用意されていますので、そのまま「OBJ」ディレクトリに移動し「make~」コマンドを実行してください。

開発環境の構築(IDE編)

続きまして、RL78用のIDEのインストールを行います。
IDEは、ルネサスエレクトロニクス社純正の「e2 studio」というものを使用します。
以下のページでダウンロードします。

統合開発環境 e2 studio 2022-10 Windows用インストーラ」という項目をクリックすると…

以下のようなポップアップが表示されます。
ここでは難しく考えずに「Confirm」をクリックします。

すると以下のページが開きます。
なんと!インストールのためにはユーザー登録が必要!?
マーケティング的には重要なのはわかりますが、個人情報に気を使わなければならない時代、ただ試しにチョットだけ使ってみたい人だっているのだから、もうちょっと寛大でも良いと思うのですが…。
そのスジの方なら「My Renesas」のアカウントを持っている方もいるとは思いますが、そうでない方は「登録」をクリックして、アカウントの作成とログインをお願いします。
(私は、こういう面倒な作業で心が折れるタイプ…。)

はい、一度ログインしてしまえばダウンロードできます。
トップページに戻って「統合開発環境 e2 studio 2022-10 Windows用インストーラ」という項目をクリックです。

以下のようなページが表示されますので「同意します」をクリック。
ダウンロードが始まります。

ダウンロードが完了すると「setup_e2_studio_20xx-xx.zip」というファイルが生成されますので、これを解凍します。
解凍されて生成された「setup_e2_studio_20xx-xx.exe」というファイル、これがインストーラー本体ですので、ダブルクリック!
すぐに以下のポップアップが表示されますので、「All Users」をクリックします。

以下の表示では「Next」をクリック!

次の表示ではお目当ての「RL78」のみにチェックを入れて「Next」をクリックします。

次の表示ではニッポンジンなら「Japanese Language Support」のみにチェックを入れて「Next」をクリックします。
多分IDEの日本語表示化のオプションでしょう。

以下2つの画面では「Next」連打!

出ました!ライセンスの同意。
同意しなければ、そこで試合終了だよ…。
ソフトウェア契約の条件に同意します。」を選択した後に「Next」をクリックです。

以下の画面も「Next」をクリック…。

これで最後かな?
インストール」をクリックしてください。

インストールが始まりましたが、間髪入れずVisual C++のランタイム(だと思う…)のインストールが開始されます。
これは、放っておけば勝手に終わります。

Visual C++のランタイムが勝手に終了すると、メインのインストーラーに処理が戻りますが、その後以下のようなポップアップが3回ほど表示されます。
これは多分、デバッガーのデバイスドライバのインストール許可なので、全て「インストール」ボタンをクリックしてインストールしましょう。

しばらくすると、ルネサス純正の「RL78」コンパイラのインストールが始まります。
先程「GCC」コンパイラをインストールしたので、コチラは使わないんですけど、一応インストールしてあげましょう。
ちなみに、GCCよりも純正コンパイラの方がパフォーマンスが良いという噂があります。
そのうち純正コンパイラに対応したカーネルも作りましょうかね?
以下、赤丸の順にクリックしていって下さい。

インストール作業が始まります。

以下の画面が表示されると少なくともルネサス純正の「RL78」コンパイラのインストール作業は終了です。
完了」をクリックしましょう。

この後、ルネサス純正の「RL78」コンパイラと同様、以下のソフトウェアのインストールが始まります。

●SMSアセンブラ
●ルネサスMCUツール・ライセンスマネージャ
●LLVM「RL78」コンパイラ

要領は一緒なので、インストールを続行しましょう。
…ゆっくりとコーヒー飲んでる暇もないなぁ…。

さて、最後の「LLVM「RL78」コンパイラ」のインストールが終了すると以下の画面が表示されます。
ここでは「Launch e2 studio?」にチェックを入れてから「OK」をクリックして下さい。
これにより「OK」をクリックすると「e2 studio」が自動的に起動するはずです。

以下のようなスプラッシュスクリーンが表示されます。
初回起動には、相当な時間がかかりますのでお覚悟を。

以下の表示が現れます。
あ~これ、絶対「Eclipse」ですわ…。
前回のMSP430版で使用したTIのIDEである「Code Composer Studio」もEclipseベースでしたが、ルネサスよ、オマエもか~。
まあ、Eclipse使い慣れている人にとっては何の問題もありませんが、若干古臭いんだよなぁ…。
ここは、デフォルトのワークスペースの場所で「起動」をクリックしましょう。

次に、以下の表示が出たら「登録」をクリックして下さい。

以下のポップアップも「OK」をクリック。

すると、以下のポップアップが表示されます。
これも「OK」をクリック。
あとで再起動しないとダメらしい…。

以下のダイアログが表示されますが、これの入力はお好みに応じて。
面倒くさかったら別に「キャンセル」でも支障はないようです。

以下も「いいえ」で良いでしょう。

はい、そうすると以下の画面が残ります。
これが「e2 studio」です!

以上で「e2 studio」のインストールは完了です。
「コード生成を使用するには再起動してね!」って言われているので、一旦「e2 studio」を終了させておきましょう。

プロジェクトの作成

ここまでの作業で、開発環境をインストールし、RL78版TOPPERS/ASPのソースコードをダウンロードし、それをコマンドラインでビルドするまでを行いました。
更にルネサスエレクトロニクスのIDEである「e2 studio」のインストールを行いました。
そこで、今回はこのIDE上でビルドが行えるようにプロジェクトを作成しましょう。
先程閉じてしまった「e2 studio」を立ち上げて下さい。
そして、画面左上のメニューから「File」→「新規」→「Makefile Project with Existing Code」の順にクリックしていきましょう。

以下のダイアログが表示されたら必要事項を入力します。
ここでは、以下の通り。

プロジェクト名:<任意のプロジェクト名(ここでは「asp_1.9.2」)>
既存のコードの場所:C:\cygwin64\home\<ユーザ名>\asp_1.9.2
インデクサー設定に対するtoolchain:<なし>

入力が終わったら「終了」ボタンをクリックします。

その後は元の画面に戻ります。
何の変化もないようですが、画面右上の「-」マーク(マウスのカーソルを置くと「最小化」と表示されます)をクリックしてみてください。

以下のように表示が変化し、そのうち左側の「プロジェクト・エクスプローラー」というタブの中には先程入力したプロジェクト名のディレクトリが表示されているはずです。

次に、画面上部のメニューから「ウィンドウ」→「ビューの表示」→「ビルドターゲット」の順にクリックしていきましょう。

これにより、画面右側のウィンドウに「ビルドターゲット」タブが追加されたはずです。

以降の作業は、このページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトのデバッグ)の「プロジェクトのクリーンとビルド」の項目を参考に続行してください。
(手前ブログへの誘導みたいになっちゃって恐縮です。
アファリエイトなんかはやってませんので、そういうのキライな方でも安心して訪れてみてください。)
この「e2 studio」は、Eclipseベースなので、上記のページと同じ方法で作業を続行できます、
但し、文中の「Makeターゲット」タブは、先程表示させた「ビルドターゲット」タブに置き換えてお読みください。
名称は違いますが、これらのタブは同じ働きをするものです。
「e2 studio」の画面右側に以下のようなアイコンが表示されて、これらをダブルクリックすることによりビルドができるまでを確認してください。

「realclean」や「all」など、アイコンをダブルクリックすることにより、その操作に応じたメッセージが画面下部の「コンソール」タブ内に表示されるはずです。

プログラムの転送とデバッグ

早速、評価ボード「RL78/G14 Fast Prototyping Board」とパソコンを繋げたいと思うのですが、一つ問題が!
こういう評価ボードの場合、USBのコネクタが付いていて、これでパソコンと繋げると給電と同時にデバッガーのファンクション、加えて仮想シリアルポートとしても認識されて、シリアル通信によるデバッグ出力がすぐに使える~って思うでしょ?
ところが、この「RL78/G14 Fast Prototyping Board」はそうなっていないんです。
この評価ボードに付いているUSBのコネクタは給電とデバッガーのファンクションだけで、パソコンと接続しても仮想シリアルポートとしては認識されません。

これからTOPPERS/ASPのサンプルプログラムを動かす際には、動作確認のためにどうしてもシリアルポートが必要です。
そこで、以下のような市販のUSB/シリアル通信変換ケーブルを用意します。

シリアル通信をするために必要なポートは、RXDとTXDとGNDの三本ですね。
以下の赤い四角で囲った端子を使いましょう。

評価ボードからこうやってGNDRXDTXDと、それぞれの線を出してやって…

USB/シリアル通信変換ケーブル側の配線は、上からTXDRXDGNDの順番でこんな感じ。
これでシリアルポートの問題は解決っと。

続いて、このUSB/シリアル通信変換ケーブルをパソコンに繋いでみましょう。
パソコン上でデバイスマネージャーを開きます。
ポート(COMとLPT)のサブカテゴリーとして「USB Serial Port」というポートが追加されているはずです。
(私のパソコンでは、「COM15」として認識されていますね。)
このポート番号、覚えておいて下さい。

ここで、評価ボードとパソコンもUSBケーブルで繋げちゃいましょ。
ご覧の通り、通電します。

次に「TeraTerm」をご用意ください。
インストールしていない方は、このページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトのデバッグ)の「TeraTermの導入」の項目を参考にしてください。
もちろん、シリアル通信のターミナルであれば、他のものもお使いいただけます。
今回のTOPPERS/ASPのサンプルプログラムは、シリアル通信のメッセージを出力しますので、先程「USB Serial Port」として認識されたシリアルポート番号でターミナルを立ち上げておきましょう。
設定は、こんな感じです。
ボーレートは「9600」です。
(私のパソコンは、USB/シリアル通信変換ケーブルをCOM15として認識していました。)

さて、「e2 Studio」に戻りましょう。
まだサンプルプログラムをビルドしていない場合は、画面右側の「ビルド・ターゲット」タブの中、「OBJ」ディレクトリ直下の「all」をダブルクリックして、ビルドを完了させましょう。

次にデバッガの設定を行います。
画面上部にある緑色の「虫マーク」。
その脇に「▼」ボタンがありますので、それをクリック。
そこで現れた「デバッグの構成」という項目をクリックしましょう。

すると以下のようなダイアログが現れます。
左側のリストから「Renesas GDB Hardware Debugging」という項目をダブルクリックしてください。

ダイアログ右側がガラリと変わりましたね?

この「デバッグ構成」ダイアログの各項目に対し、以下の設定を入力します。

名前:<任意の構成名(ここでは「OBJ」)>
プロジェクト:<プロジェクト名(ここでは「asp_1.9.2」)>
C/C++アプリケーション:C:\cygwin64\home\<ユーザ名>\asp_1.9.2\OBJ\asp.exe
Build Configuration:Use Active
「自動ビルドを無効にする」を選択

お次は現在の「メイン」タブから「Debugger」タブへクリックして切り替えます。

新しく現れた各項目に対し、以下の設定を入力します。

Debug hardware:E2 Lite (RL78)
Target Device:R5F104ML

さて、お次は現在の「GDB Settings」タブから「Connection Settings」タブへクリックして切り替えます。

たくさん設定項目があるんですが、ここでは「エミュレーターから電源供給」の項目だけは忘れずに「いいえ」にしておいて下さい。

最後にもう一丁!
現在の「Debugger」タブから「共通」タブへクリックして切り替えます。

エンコードの設定で「その他」に選択し、文字コードを「UTF-8」に設定してあげて下さい。
これをしないと、デバッガーからの日本語メッセージが文字化けしてしまいます。
これでよ~やく、ダイアログ下部の「適用」ボタンと「デバッグ」ボタンを順にクリックすることで、デバッガーが起動しプログラムの転送が開始されます。

プログラムの転送が終わると、以下のようにスタートアップ・アドレスでプログラムが止まった状態になります。

ここからプログラムを続行してみましょう。
画面上部の「」ボタンをクリックすると、プログラムが続行されます。

はい、ここで長らく放置していた「TeraTerm」を見てみましょう。
以下のように、サンプルプログラムが動作していることが確認できます。

プログラムを停止する場合は、画面上部の「」ボタンをクリックします。
停止させてみましょう。

ついでに「e2 studio」の表示を「デバッグモード」から「C/C++モード」に変更します。
「e2 studio」の画面右上のボタンで切り替えができます。「C/C++」ボタンをクリックします。

ブレークポイントを仕掛けましょう。
画面右の「プロジェクト・エクスプローラー」のソースコードリストの中から「sample1.c」をダブルクリックし、ソースコードを表示します。
このソースコードの丁度中盤くらい、メインタスクの始めに仕掛けましょうか。
ブレークポイントは、ソースコードビューの左端をダブルクリックすることにより丸が表示され、セットすることができます。
(解除したい場合もダブルクリックします。丸が消えます。)

これで本当にブレークポイントがかかるのか、試してみましょう。
画面上部にある緑色の「虫マーク」。
その脇に「▼」ボタンがありますので、それをクリック。
すると今後は、さっき色々と入力した「OBJ」のデバッグ設定が登録されていますので、これをクリックすると、デバッガが起動します。

しばらくして、プログラムの転送と書き込みが完了すると、前と同じようにスタートアップ・アドレスでプログラムが停止しますので、画面上部の「」ボタンをクリックして、プログラムを続行させます。

程なくして、以下のように正しくブレークポイントを仕掛けた位置でプログラムが停止するはずです。
ここからは、「F6」キーでステップオーバー、「F5」キーでステップインなど、おなじみの操作が使用できます。
因みに、ステップオーバーやステップインなどを行っている時に命令が飛んでしまったり前後したりする場合は、最適化のせいです。
デバッグ時は、このページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトのデバッグ)の「サンプルプログラムのデバッグ」の項目を参考に最適化を解除しましょう。

サンプルプロジェクトの説明

興味のある方は、このページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトで遊ぼう)を参照してください。

RL78版カーネルについて

以下、このカーネルにおける備考です。

割り込み優先度

このカーネルでは、-1(優先度最低)から-3(優先度最高)の3段階の優先度設定が可能です。
RL78の仕様としては、本当はレベル0~3の4段階の割り込み優先度設定が許可されているのですが、一番優先度の高いレベル0が少々クセモノです。
このレベル0は、マスクできない割り込みなのです。
割り込みのマスクは「プログラム・ステータス・ワード(PSW)」というレジスタで行います。
このうち「ISP1」と「ISP0」というビットに注目してください。
これらのビットの操作による効果は、以下のようになります。

ご覧のように最高優先度のレベル0をマスクする手段がありません。
いや、マスクしようと思えばできないこともないのです。
それは「IE」というビットですべての割り込みを無効にしてしまえば良いのです。
しかしながら、これをOSに実装するにはかなりアクロバティックな記述が必要となります。
今回はGCCコンパイラを使いましたが、純正のコンパイラではレベル0用に使用させるレジスタのバンクが存在しないことから多重割り込みにも対応できず、レベル0の割り込みを使用することは半ば禁忌となっています。
このあたりの事情は、「RL78 割り込み レベル0」でググると詳しい方の解説が見つかります。
GCCコンパイラでは、これらの問題は回避できるので、この慣例に従う必要もないのですが、前述の通りアクロバティックな実装が必要なことに加え、そもそも3段階の優先度でも殆どの場合は問題になりませんので、リスクを避け、-1(レベル3)から-3(レベル1)をOS管轄の割り込みとして実装しました。
-4(レベル0)は設定できません。
(面倒くさいから!とかではないです…いや、ちょっとそうかも…。

例外ハンドラ

例外ハンドラとしては一つだけ、BRK例外「BRK命令の実行」のみに対応しています。
この動作は、サンプルプログラムで確認できます。
サンプルプログラム実行中に「z」か「Z」をターミナルで入力すると、以下の命令が実行される仕掛けになっています。

asm("brk")

これによりBRK例外が発生し、その様子がターミナルに表示されます。
小文字の「z」と大文字の「Z」の違いは、BRK例外が小文字の場合はカーネル管轄内で、大文字の場合はカーネル管轄外でそれぞれ実行されるということだけです。
デバッグでの用途以外、あまり使い道はないでしょう。

一部サービスコールは未対応

性能評価用システム時刻取得のための「get_utm()」サービスコールは未実装です。

ライセンスについて

このカーネルは「TOPPERSライセンス」で配布しております。
無償ですが、使用に関しては自己責任です。
このカーネルを商用利用するチャレンジャーな方場合は、このリンク先の条項に従ってください。

6
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?