関数を固定アドレスに配置してみた
目指しているのは、ユーザ・プログラム(HEXファイル)をFlashメモリに書き込んで、ユーザが定義した関数を呼び出すことです。
HEXファイルを読み取り、Flashメモリに書き込むところまで出来ました。
あとは、書き込んだFlashメモリ上のアドレスを関数コールして、リターン出来れば・・・
本当に上手くできるのか?その実現性は未だ不明です。(^_^;)
関数呼び出しのテストをやりやすくするため、予め用意したtest_func()を呼び出してみることにしました。その関数を固定アドレスに配置できれば都合が良いのですが、どうすれば関数を固定アドレスに配置できるのか?
取り敢えずの思い付きを試してみると・・・
void test_func(void) @ 0x900
{
unsigned char loop;
while( break_flag )
{
loop++;
}
loop = 0;
}
ビンゴ~
簡単に実現出来てしまいました。
ーーーーーーーーーーーーーーーーーーーーーーーーーー
後で、『XC8 C Compiler User's Guide』を調べてみると、 5.8.4 Changing The Default Function Allocationの項に”absolute function”として説明されていました。
『知識は後から着いてくる』(<==基本的な開発ポリシー)
MPLABXの不具合が解決した
意外な結末でした。
comm.cを組み込むとMPLABXの動作がおかしくなることが分かって、調査は一気に進みました。先ずはcomm.cのコードの殆どをコメント・アウトして試してみると 問題なし(まぁ当然の結果です)。前半分のコメントを外しても問題なし(これで後半分に絞られました)
これを繰り返して不具合が再現する箇所を絞り込んで行くと・・・
以下の行(これ↓)に辿り着きました。
short stack[16];
変数名をstackからstack_buffに変更すればO.K.だと分かりました。
試しにmain.cに以下の記述を加えると不具合が再現しました。
int stack;
void main(void)
{
stack = 0;
コンパイル・エラーにならないのですが、stackという変数名がMPLABXの不具合を引き起こしていたようです。
やれやれ・・・
MPLABXの不具合が再現した
MCCで新たにProjectを起こして、起動確認
==>Breakポイントの表示もStep実行も問題なし
debug.cとdebug.h,ring_buffer.cとringbufer.hを追加して動作確認
==>Breakポイントの表示もStep実行も問題なし
少しずつ機能を追加して・・・
comm.cとcomm.hを追加して動作確認
==>不具合再現!
実は、全部組み込んでも不具合は再現しない、いわゆる『お化け』騒動で終わることを期待していたのですが、目論見が外れました。まさか、Cプログラムの書き方でこんなことが起きるとは、思ってもみませんでした。comm.cの関数呼び出しを外しても不具合状況に変化はありません。つまり、プログラム実行時に生じる不具合ではなく、comm.cのソース・コード自体に問題があるようです。
MPLABXがソース・コードを表示しようとして、どこかで重大なエラーに遭遇して、エラー・コードも吐かずに止まってしまうものと思われます。orz
もう少し、調査を続けます。
MPLABXの動作がおかしくなった
突然、MPLABXの動作がおかしくなりました。
ユーザ・プログラムの初期化コードに設定したブレーク・ポイントで停止しているのに、当該プログラム行をハイライト表示してくれません。Program Memoryウィンドウの表示を確認すると、ブレーク動作は正しいように思われます。さらに、その状態からStep実行しようとするとデバッガが停止してしまいます。RUNすれば、PICは正しく動作して、ホスト間の通信も正常に行うことが出来ます。
PICkit3を替えても、MPLABXを(3.61から3.65に)アップデートしても不具合状態は解消しません。orz
困ったことになりました。このまま開発を続けるか?トラブルシュートを続けるか?
う~む・・・
ふと思い立って、PIC16F1938を使った他のProjectで試してみると・・・
ちゃんとブレークしたプログラム行をハイライト表示しました。
(パチパチパチ~)<==喜んでいる場合ではない!
詳しいことは分かりませんが、開発しているプログラムのどこかが気に入らなくて、MPLABXが正常に動作できなくなっているようです。
現在のProjectフォルダは凍結して、新たなProjectを立ち上げ直し、そこにコードを順番に移植して、どこでおかしくなるか?調べてみようと思います。
MCCでサクッと開発開始
Tools ==> Embedded ==> MPLAB Code Configuratorと辿って、MCCを起動すると下のような画面が表示されます。(<==起動に時間が掛かります)今回はホストとPIC間の通信にUARTを使い、Flash Programmingを行うので、Device ResourcesからEUASRTとMEMORY(<==下のLibraryの中にある)を選択して、Project Resourcesに持ってきました。で、Generateボタンをクリックして・・・
サクッと開発環境が構築されました。(パチパチパチ~)
あとはゴリゴリ、ゴリゴリ、コードを書き連ねて行きます。
これまでRaspiをホストにするときは、もっぱらI2Cを使ってきました。当初の構想でもI2Cを使う予定でした。ところが最新のデバイス(PIC32MK)にI2Cが搭載されていない(必要ならソフト処理でI2C通信を行う)ことが判明しました。UARTで1対Nの通信を行う(通信の始めにアドレス・バイトを送信して相手を指定する)機能を組み込み、I2Cの機能をUARTで実現しようとしています。どうやらMicrochipはI2CからUARTへの移行を進めているようです。
RaspiにはUARTも搭載されているので、I2CからUARTへの変更は可能です。調べてみると、ユーザが使えるのはRaspi-3 とZero Wはmini UART、他のモデルはPL011で、取り扱いが異なるようなのです。(詳しくはここ↓)
The Raspberry Pi UARTs - Raspberry Pi Documentation
Raspi-3はCORE周波数を250MHz固定にしないと上手く通信できない(通信速度が変化してしまう)とか、enable-uartの設定が必要だとか・・・
モデルによって取り扱いが異なるのはユーザの混乱を招きそうなので、『USB-シリアルを採用』することにしました。
denshikobo's blog再開のお知らせ
暫く更新していなかった、denshikobo's blogを再開致しますので、宜しくお願い申し上げます。
PICの新しい開発環境に関する構想(<==妄想)を得て、今年の6月から開発し始めました。初期構想から二転三転して(何時ものことです)、ようやく『これ』という形が見えてきました。
『基板にUSB-シリアル変換ICを搭載して、USBケーブルで接続する』と言う形です。そうすることで、RaspiにもRaspi ZeroにもPCにも接続できるようになります。
(パチパチパチ~)
OrangePI PCにsambaをインストールした
(2016.12.01)
OrangePI PCとRaspi間でファイルを送受出来るようになったので、既存のscriptファイルを使ってsambaをインストールします。
$ scp pi@192.168.2.101:./samba_install.sh ./
中身はこんな感じです。
#!/bin/bash
#<Install samba>
sudo apt-get install samba samba-common-bin
sudo smbpasswd -a pi
sudo mkdir /opt/samba
sudo chown pi:pi /opt/samba
chmod 777 /opt/samba
sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.org
sudo cp ./smb.conf.replace /etc/samba/smb.conf
sudo service nmbd restart
sudo service smbd restart
もう一つsmb.confを置き換えるファイルを持ってきます。
$ scp pi@192.168.2.101:./smb.conf.replace ./
smb.conf.replaceとデフォールトのsmb.confの違いはこんな感じです。
pi@OrangePI:~$ diff /etc/samba/smb.conf smb.conf.replace
47c47
< ; interfaces = 127.0.0.0/8 eth0
---
> interfaces = 127.0.0.0/8 192.168.2.0/24
54,55c54
< ; bind interfaces only = yes
<
---
> bind interfaces only = yes
254a254,260
> [PIDRIVE]
> comment = pidrive
> read only = no
> locking = no
> path = /opt/samba
> guest ok = yes
> force user = pi
(全てオープンなローカル・ネットワーク内の運用が前提です)
samba_installを実行して・・・
$ sh samba_install.sh
OrangePI PCの/opt/sambaにWindowsからアクセスできるようになりました。
パチパチパチ~
JAVAプログラムの開発は、sambaディレクトリにプロジェクト・フォルダを置いて、Windowns上のNetbeansで行うスタイルが気に入っています。