USBから"R00〜"の実行アドレスを指定した起動用のコマンド文字列で実行をスタートさせる方法です。
リセットスイッチで、実行をスタートさせるプログラムの作り方の紹介はこのリンクです。
#include <xc.h> // test.c #include "common.h" __attribute__((address( 0x80005000 ))) void start_main (void); void wait(int n){// nカウント待つ while(n--) ; } void start_main(){ __asm__ ("NOP"); for(;;){ PORTBSET = 0x8000; // D1 LED 点灯(RB15を1):これは、0xbf886128番地への設定です. __asm__ ("NOP"); // チョット待つ wait(0x003f0000); PORTBCLR = 0x8000; // D1 LED 消灯(RB15を0):これは、0xbf886124番地への設定です. __asm__ ("NOP"); // チョット待つ wait(0x003f0000); } } /* UMEHOSHI ITAで使っている制御チップは、PIC32MX270F256Bで、 そのメモリには特殊機能レジスタ(SFRs:Special Function Registers)が割り当てられています。 このレジスタの操作で、様々な周辺回路がアクセスできます。 上記のORTBSETが、PORTBの指定ビットを1にすることで対応端子をHiにする機能のレジスタです。 また、PORTBCLR が、PORTBの指定ビットを1にすることで対応端子をLowにする機能のレジスタです。 ORTBSETとPORTBCLRのレジスタは、それぞれのメモリ上のアドレスは、0xbf886128と0xbf886124です。 よって、これらレジスタにLEDに繋がるRB15のビットを表現するx8000を代入すれば、点灯や消灯ができます。 なお、wait関数で点灯や消灯の待ち時間を作っていますが、 引数の 0x003f0000 は、適当に実験から得た値です。 この関数の呼び出し位置のアドレスはは、右リストの80005024:や8000503c:です。 この直後の「遅延スロット」で「lui a0,0x3f」の引数を設定しています。 */ |
80005000 <start_main>: 80005000: 27bdffe8 addiu sp,sp,-24 80005004: afbf0014 sw ra,20(sp) 80005008: afbe0010 sw s8,16(sp) 8000500c: 03a0f021 move s8,sp 80005010: 00000000 nop 80005014 <.L4>: 80005014: 3c02bf88 lui v0,0xbf88 80005018: 34038000 li v1,0x8000 8000501c: ac436124 sw v1,0x6128(v0) 80005020: 00000000 nop 80005024: 0c001413 jal 8000504c <.LFE8> 80005028: 3c04003f lui a0,0x3f 8000502c: 00000000 nop 80005030: 3c02bf88 lui v0,0xbf88 80005034: 34038000 li v1,0x8000 80005038: ac436128 sw v1,0x6124(v0) 8000503c: 0c001413 jal 8000504c <.LFE8> 80005040: 3c04003f lui a0,0x3f 80005044: 08001405 j 80005014 <.L4> 80005048: 00000000 nop 8000504c <wait>: 8000504c: 27bdfff8 addiu sp,sp,-8 80005050: afbe0004 sw s8,4(sp) 80005054: 03a0f021 move s8,sp 80005058: afc40008 sw a0,8(s8) 8000505c: 00000000 nop 80005060: 8fc20008 lw v0,8(s8) 80005064: 2443ffff addiu v1,v0,-1 80005068: afc30008 sw v1,8(s8) 8000506c: 1440fffc bnez v0,80005060 <wait+0x14> 80005070: 00000000 nop 80005074: 03c0e821 move sp,s8 80005078: 8fbe0004 lw s8,4(sp) 8000507c: 27bd0008 addiu sp,sp,8 80005080: 03e00008 jr ra 80005084: 00000000 nop |
以下に、上記の実際に動作した、アセンブリリストを示します。上のC言語の逆アセンブルリストをコードにしてみました。
無限ループなので、本来あるべきユーザープログラムのリターン処理がありません。(コメントアウトしています。)
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 31 32 33 |
#include <xc.h> // test.S (USBへhelloの文字列を出力するプログラム 、ロード実行タイプ) .set noreorder #アセンブラに命令の順序を自動変更させない。 .section start_main,address(0x80005000),code .ent start_main start_main: # ADDIU sp,sp,-24 # 以下で使う24byteまでの退避サイスをスタックに作る。 # SW ra,20(sp) # 現在の関数の戻り番地をスタックに退避 .L4: LUI v0,0xbf88 # 以下の3行で、0xbf886128のPORTBSETに0x8000を設定することで、D1のLEDを点灯 li v1,0x8000 SW v1,0x6128(v0) # 以上の3行で1のLEDを点灯 NOP JAL wait # チョット待つwait関数呼び出し(次行のRaに戻り番地を記憶してジャンプ) LUI a0,0x3f NOP LUI v0,0xbf88 # 以下の3行で、0xbf886124のPORTBCLRに0x8000を設定することで、D1のLEDを消灯 li v1,0x8000 SW v1,0x6124(v0) # 以上の3行で1のLEDを消灯 JAL wait # チョット待つwait関数呼び出し(次行のRaに戻り番地を記憶してジャンプ) LUI a0,0x3f J .L4 # 無限ループのジャンプ NOP .end test_main wait: ADDIU sp,sp,-8 # 以下で使う24byteまでの退避サイスをスタックに作る。<====wait関数 SW ra,4(sp) # 現在の関数の戻り番地をスタックに退避 ADDU s7, a0, zero # 引数レジスタa0を、s7に記憶 Lwait1: ADDIU s7, s7,-1 # s7=s7+(-1) BNE s7, zero, Lwait1 NOP ADDIU sp,sp,8 # 関数実行前のスタックポインタに戻す JR ra NOP |
予め、pythonが動作するターミナル(コマンドプロンプト)を、開いて準備して置くとよいでしょう。
以下では、R:\workを作業位置(カレントディレクトリ)にして説明しています。
また、pythonプログラムでは、serialモジュールを追加しておく必要があります。
「pip show serial」のコマンド操作で、インストールされているか確認できます。
インストールされていない場合は、「pip install pyserial」の操作で、インストールしておくと良いでしょう。
上記の「アセンブラ編集部」の直下にある「アセンブル」ボタンをクリックします。
(このボタン右下の、指定アドレスから実行させるコード埋め込み用のチェックボックスがチェックされていること確認して行う)
「アセンブラ編集部」のソースにエラーが無ければ、[UME専用Hexコマンド]のテキストが、その下の TextArea に表示されます。
(エラーがあれば、エラーが無くHEXコードが生成されるまで、「アセンブラ編集部」の修正とアセンブル」を繰り返します)
メモ帳などで、「command.txt」のファイルを生成して開き、
上記操作で得られたTextAreaの[UME専用Hexコマンド]のテキストを、 コピー(CTRL+A CTRL+C)操作し、
それを「command.txt」編集画面で貼り付け((CTRL+V)して、保存します。
保存位置は、pythonが動作するターミナルの作業位置(カレントディレクトリ)です。(後述例では、R:\workで示しています)
上記で作った「instruct.py」と[command.txt」が存在する位置で、
pythonが動作するターミナル(コマンドプロンプト)を開きます。
以下では、この作業位置(カレントディレクトリ)が、R:\workである場合の例で説明しています。
まず [UMEHOSHI ITA]基板と、PCをUSBで接続します。
次にターミナルプロンプトを『powershell』にして、
『Get-CimInstance Win32_PnPEntity | Where-Object {$_ -like "*(COM*"} | Select-Object Caption』
のコマンド操作で、USBのシリアル デバイスのCOM番号を調べます。
R:\work>powershell Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. 新しいクロスプラットフォームの PowerShell をお試しください https://aka.ms/pscore6 PS R:\work> Get-CimInstance Win32_PnPEntity | Where-Object {$_ -like "*(COM*"} | Select-Object Caption Caption ------- Bluetooth リンク経由の標準シリアル (COM10) USB シリアル デバイス (COM4) Bluetooth リンク経由の標準シリアル (COM11) PS R:\work>
この実行例から、USB シリアル デバイス がCOM4が使える状態になっていることが分かります。
(このリンクページで示すように、デバイスマネージャで確認することもできます)
この番号の4を記憶して次の転送プログラム実行に進むのですが、
そのUSB シリアル デバイス が見つからない場合、次の点が考えられます。
PS R:\work> python instract.py USB シリアル デバイスで、使用するCOMの番号を入力>>4 S108000500000E8FFBD271400BFAF1000BEAF21F0A003 17チェックサム: 0 USB受信● b'S108000500000E8FFBD271400BFAF1000BEAF21F0A00317\r\n' USB受信● b'SET:80005000\r\n' S1080005010000000000088BF023C00800324286143AC C1チェックサム: 0 USB受信● b'S1080005010000000000088BF023C00800324286143ACC1\r\n' USB受信● b'SET:80005010\r\n' S108000502000000000001314000C3F00043C00000000 0Eチェックサム: 0 USB受信● b'S108000502000000000001314000C3F00043C000000000E\r\n' USB受信● b'SET:80005020\r\n' S10800050300088BF023C00800324246143AC1314000C A7チェックサム: 0 USB受信● b'S10800050300088BF023C00800324246143AC1314000CA7\r\n' USB受信● b'SET:80005030\r\n' S1080005040003F00043C0514000800000000F8FFBD27 9Dチェックサム: 0 USB受信● b'S1080005040003F00043C0514000800000000F8FFBD279D\r\n' USB受信● b'SET:80005040\r\n' S1080005050000400BFAF21F0A0030800C4AF00000000 94チェックサム: 0 USB受信● b'S1080005050000400BFAF21F0A0030800C4AF0000000094\r\n' USB受信● b'SET:80005050\r\n' S1080005060000800C28FFFFF43240800C3AFFCFF4014 16チェックサム: 0 USB受信● b'S1080005060000800C28FFFFF43240800C3AFFCFF401416\r\n' USB受信● b'SET:80005060\r\n' S1080005070000000000021E8C0030400BF8F0800BD27 A1チェックサム: 0 USB受信● b'S1080005070000000000021E8C0030400BF8F0800BD27A1\r\n' USB受信● b'SET:80005070\r\n' S0880005080000800E00300000000 30チェックサム: 0 USB受信● b'S0880005080000800E0030000000030\r\n' USB受信● b'SET:80005080\r\n' R008000500000 61チェックサム: 0 実行スタートの Enter >> USB受信● b'R00800050000061' 終了確認の Enter >>> PS R:\work>
[command.txt」の中に"R008000500000"のような実行コマンドが存在すると、実行スタートの Enter >>の
プロンプトが出て、一時停止します。
上記例では、そこでENTERキーを入力することで、"R00800050000061"が送られ、
UMEHOSHI ITA基板で「0x80005000」番地から実行により、「 Lチカ 」が始まります。
上記の手法は、[command.txt」の内容の命令のアドレス範囲がRAMである場合でも、リセットによって初期化されるものではありません。
電源供給を続けていれば、リセットしても、実行スタート用のコマンド文字列(上記の例では"R00800050000061")を送ることで、プログラムを起動できます。
しかしリセットによって、既に転送済のプログラムを自動的に起動することができる訳ではありません。
リセット後は、実行アドレスを指定したスタート用のコマンド文字列("R00〜")を送らなければ、実行できません。
リセット後に自動実行させるプログラムの作り方はこちらで示すページで示します。