denshikobo’s blog

PICプログラミングやPCの操作で感じた日々の由無し事を綴ります

関数を固定アドレスに配置してみた

目指しているのは、ユーザ・プログラム(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ボタンをクリックして・・・

f:id:denshikobo:20170807104259p:plain

サクッと開発環境が構築されました。(パチパチパチ~)

あとはゴリゴリ、ゴリゴリ、コードを書き連ねて行きます。

 

これまで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

 

f:id:denshikobo:20161201121657p:plain

 

OrangePI PCの/opt/sambaWindowsからアクセスできるようになりました。

パチパチパチ~

JAVAプログラムの開発は、sambaディレクトリにプロジェクト・フォルダを置いて、Windowns上のNetbeansで行うスタイルが気に入っています。