独自言語 picle のコンパイラ化(その7) [PIC]
picleソース内から外部処理呼出しのインターフェースとして Call_ 処理を実装していましたが、処理タイプ(proc/func)や引数チェックを行えるように外部処理宣言機能を追加しました。
具体的にはC言語のプロトタイプ宣言風な記法の後にアドレスを指定するようにします。
これによりアセンブリ言語やC言語で作成した処理を組込処理と同様に利用することが可能になります。
アセンブリ言語で記述した処理のHEXファイルの作成は「PIC24FJ64GAでのアセンブラ環境覚書」の記事の3項で書いた方法(但しMPLABの場合)で可能ですがC言語の場合については試行錯誤中です ^^;
外部処理呼出し例(picle言語)
[TOP] [ 前へ ] 連載記事 [ 次へ ]
具体的にはC言語のプロトタイプ宣言風な記法の後にアドレスを指定するようにします。
これによりアセンブリ言語やC言語で作成した処理を組込処理と同様に利用することが可能になります。
アセンブリ言語で記述した処理のHEXファイルの作成は「PIC24FJ64GAでのアセンブラ環境覚書」の記事の3項で書いた方法(但しMPLABの場合)で可能ですがC言語の場合については試行錯誤中です ^^;
- 関数のみのHEXファイルの作成
通常の方法でプロジェクトを作成すると main()関数が必須だし、スタック設定等の余分なスタートアップ処理が付加される。
ライブラリとしてプロジェクトを作成するとmain()やスタートアップ処理は付加されないが、 絶対アドレスにマッピングされず、HEXファイルが作成されない。
現時点ではこの問題の解決には至らず、通常のアプリ作成プロジェクトでなんとかしてみた。(詳細は下記)
- コードのメモリアロケーション
MPLABX のリンカスクリプトの場所は「C:¥Program Files (x86)¥Microchip¥xc16¥v1.23¥support¥PIC24F¥gld¥p24FJ64GA002.gld」にあるので、上記の「PIC24FJ64GAでのアセンブラ環境覚書」の方法で不要な領域を削除する(MPLABXでも同様)。
更に「SECTIONS」内の「.text」定義部を絶対アドレス指定に変更する。
例 /* .text : 2016/04/10 */
.text 0x9000 :
リンカスクリプトをプロジェクトフォルダにコピーし、変更後にプロジェクトの「 Linker Files 」に追加する。
先頭のスタートアップ処理と最後の main() 処理が不要であるが、必要な関数自体の絶対アドレスを指定することで切りのいいアドレスにアロケート可能。
例 int __attribute__ ((address(0x9030))) hogehoge( int arg );
元々 picle 内での処理呼出し時の引数やリターン値の渡し方は XC16 に合わせている(なので picle に実装した組込処理も picle コンパイラ内の関数をそのままコールできる)
但し、C言語側の引数及び関数リターン値は全て int型にする必要がある( picle にはint型以外の型はないので)
尚、MPLABXでのプロジェクトプロパティで下記の設定も行った
XC16 -> xc16-ld -> General
下記項目のチェックを OFF 設定にする。
・Init data section
・Create handles
・Create default ISR
- データのメモリアロケーション
データ領域をディフォルトの 0x0800 から 0x2000 に変更するスマートな方法が不明(マニュアルをじっくり読めば見つかるかも) ^^;
リンカスクリプトの「Memory Regions」内の「data」の範囲や「__DATA_BASE」の値を変更しても build 結果の表示は 0x0800 から変化しなかった ^^;
現時点では実験的に変数毎に絶対アドレス指定で対応した。
尚、関数内変数(オート変数)はスタック上にアサインされるので問題ない
例 int __attribute__ ((address(0x2000))) Hoge;
★2016/04/11 追記
解決しました。 BSS 等のデータ領域を後方のアドレスにアサイン(例えば0x2000)したい場合、リンカスクリプトの「Memory Regions」の「MEMORY」定義内の「data (a!xr)」を下記例のように変更し、更にプロジェクトプロパティの XC16 -> xc16-gcc -> Memory model の「Data model」を「Large」に設定すれば意図どおりに変数領域がアサインできます。この変更をしないと BSS領域が near 領域から外れるためにエラーが発生します。
リンカスクリプト変更箇所 MEMORY
{
/* data (a!xr) : ORIGIN = 0x800, LENGTH = 0x2000 */
data (a!xr) : ORIGIN = 0x2000, LENGTH = 0x0800
- C言語で記述した関数のコール実験結果
picle ソース内で外部処理宣言することで C言語で作成した処理を picleの組込処理と同様に扱うことができた。
例えば、浮動小数点演算処理が必要な場合はその部分をC言語の関数として作成し、picle ソース側から呼出すことが可能となるはず。
実行時の画面と C言語側のMPLABXでの表示内容は以下のとおり。
コールされる関数自体は4つの引数の合計を返す簡単なものです。
:l 1:# external func call test 2: 3:func test( arg0, arg1, arg2, arg3 ) = $9030; 4: 5:proc main() { 6: PrnStr_( "\nextern func return value = " ); 7: PrnDec_( test( 1,2,3,4 ) ); 8:} :run extern func return value = 10 : |
MPLABX内ソースとニーモニック表示 |
|
[TOP] [ 前へ ] 連載記事 [ 次へ ]
コメント 0