tmori / athrill-sample Goto Github PK
View Code? Open in Web Editor NEWathrill sample programs
athrill sample programs
通信仕様の変更に対応
MOTOR_ANGLE_Xは原実装に合わせて仕様を変更
バッテリ関係の追加
Athrill側からの通信にジャイロリセットを追加。ジャイロリセットは一度設定したら(UDPパケットが飛んだら)すぐに戻す(flushした際にこのデータをクリアする)。このため、mmap形式では対応できないものとなるが、ひとまずこれで運用。
lcd関係の関数を呼び出すと落ちてしまうので、空関数とする。正式対応までの暫定対応
ETロボコンのサンプルプログラムをそのまま使うと、app.cfgをcfg1_out.cをコンパイルした際にTPRI_INIT_TASKがないと言われる。
common/ev3api/api.cfg.h でev3.hがincludeされていないため。これは単にインクルードすれば良い。
また、app.cfgでtecsgen.cfgを読み込まないといけないため、テンポラリのcfgファイルを作る対応が必要。
これらを
Bluetooth接続に使用するev3_serial_open_file()をサポートする。
ただし、直接Bluetoothには繋げないので、PIPEファイルを作成して、それでIN/OUTをできるようにする。
https://dev.toppers.jp/trac_user/ev3pf/wiki/UserManualにある以下のようなコードを動作させる。
// Bluetooth仮想シリアルポートのファイルをオープンする
FILE *bt = ev3_serial_open_file(EV3_SERIAL_BT);
// 書式化した文字列をBluetooth仮想シリアルポートへ書き込む
fprintf(bt, "Bluetooth SPP ID: %d\n", EV3_SERIAL_BT);
// Bluetooth仮想シリアルポートから1文字を読み取る
int c = fgetc(bt);
この時、PIPEファイルができて、そこにアクセスすることでやりとりができる。
デフォルトでは__ev3rt_bt_inと__ev3rt_bt_outができて
cat __ev3rt_bt_out
や
echo "TEST" > __ev3rt_bt_in
とシェルで打つことで出力と入力ができる。
PIPEはNo Blockで作っているが、受け側なしで書き続けているとそのうちロックすることがあるため注意。
そのため、make startで起動した際にBluetoothの受け側のコマンドを自動的に実行できるようにもする。
アプリケーションのMakefile.incにて
ADDITIONAL_PRE_APPL=cat __ev3rt_bt_out &
のように書くと、勝手に起動してくれる。
また、PIPEや仮想ファイルシステムのトップディレクトリをdevice_config.txtで指定できるように変更した。
DEVICE_CONFIG_UART_BASENAME __ev3rt_uart
DEVICE_CONFIG_BT_BASENAME __ev3rt_bt
DEVICE_CONFIG_VIRTFS_TOP __ev3rtfs
指定しない場合は上記の値がデフォルト値として使われる
athrill側と同時に変える必要あり
以下の3つの関数に対応する。
ev3_sdcard_closedir
ev3_sdcard_opendir
ev3_sdcard_readdir
現状これらはtarget/v850_gcc/pil/include/driver_interface_filesys.h
に定義されているので、これをコメントアウトし、アプリケーション側からはathrill_syscall.hの関数を呼ぶようにする。
athrill側ではこれに対応するopendir/readdir/closedirをシステムコールとして提供する。
appheap が1MB設定されており,スタートアップ時のゼロクリア処理において,本データの初期化で時間がかかっている模様.
appheapセクションをbss_noclrの方に配置して,スタートアップ処理の初期化をしないように修正する.
以下の変更を実施する.
①スタートアップ時の初期化非対象セクションを新設(bss_noclr)し,新規RAM領域(INTRAM2)に配置する
ev3rt/ev3rt-beta7-release/asp3/target/v850_gcc/v850es_fk3.ld
②本修正に伴い,memory.txtにINTRAM2領域を追加する.
③あわせて,memory.txtのMALLOC領域は不要となったため削除する.
理由は以下の通り.
以下のタスク終了関数(task_term.c ext_tsk())において,lock_cpu()とっている.
現状のv850版asp3の移植内容の問題点として,t_set_ipm(TIPM_ENAALL);において,割り込みマスク解除が行われた後,task_terminateに行きつく前の隙間で割り込みが発生するケースにおいて,lock_flagがtrueのまま,カーネルの割り込みハンドラに突入してしまう.
結果として,カーネルの割り込みハンドラのassertionでエラー発生する.
対応方法としては,カーネル管理内の割り込み入口処理(ターゲット層)において,このフラグを強制解除しなければならない.
ER
ext_tsk(void)
{
PRI intpri;
ER ercd;
LOG_EXT_TSK_ENTER();
CHECK_TSKCTX(); /*[NGKI1164]*/
if (sense_lock()) {
/*
* CPUロック状態でext_tskが呼ばれた場合は,CPUロックを解除し
* てからタスクを終了する.実装上は,サービスコール内でのCPU
* ロックを省略すればよいだけ.[NGKI1168]
*/
}
else {
lock_cpu();
}
intpri = t_get_ipm();
if (!enadsp || intpri != TIPM_ENAALL) {
if (!enadsp) {
/*
* ディスパッチ禁止状態でext_tskが呼ばれた場合は,ディスパッ
* チ許可状態にしてからタスクを終了する.[NGKI1168]
*/
enadsp = true;
}
if (intpri != TIPM_ENAALL) {
/*
* 割込み優先度マスク(IPM)がTIPM_ENAALL以外の状態で
* ext_tskが呼ばれた場合は,IPMをTIPM_ENAALLにしてからタス
* クを終了する.[NGKI1168]
*/
t_set_ipm(TIPM_ENAALL);
}
dspflg = true;
p_schedtsk = search_schedtsk();
}
task_terminate(p_runtsk); /* [NGKI3449]*/
exit_and_dispatch(); /* [NGKI1169]*/
ercd = E_SYS; /* [NGKI1163]*/
error_exit:
LOG_EXT_TSK_LEAVE(ercd);
return(ercd);
}
kernel_api.defにとりあえず入れて通す。DOMAINは無視してくれる
現状,「EV3RT Powered by TOPPERS/HRP2 RTOS」になっているけれど,以下に変更する.
EV3RT Powered by TOPPERS/ASP3 RTOS of Hakoniwa
現状のathrillではlibc.aからいくつかオブジェクトを抜いて対応している。そのため、今後ETロボコンで使用された場合に不整合が生じる可能性がある。そのため、libc.aを結合できるようにする必要がある。
そのためにやることは以下
libc.aをオリジナルのものに戻す
リンカスクリプトでgpの位置を正しくする(1)
リンカスクリプトでdataをROM領域として定義し、実際にはRAMのアドレスを指定する
memory.txtでデータ領域をRAMとする
athrill-libgcc.cのmallocを置き換えるのではなく、open_rなどのプリミティブなものを修正する(2)
athrill-libgcc.aがlibkernel.aのライブラリ形式だとリンクの際に使われないことがあるため、オブジェクトとしてリンクする
ev3apiの初期化関係でbrickを初期化する(これをやらないとappheapが使われない)
(1)のgpの位置として、sdataとdataは近い位置にあって、16bitオフセット内に収まらないといけない(特にnewlibに関して)。こうしないとリンク時に16bitにおさまらなかったというエラーが出る。
また、これだけでは動作せず、memory.txtの変更も必要
(2)に関してはathrill側の修正で、athrill_syscall.hの修正と、athrill_syscall_device.cの修正が必要となる。
ev3_ultrasonic_sensor_listen()で用意している領域とuart_dri_get_data_ultrasonic()で設定するデータサイズに差分があった。
get_distance()はint16だが、listenはbool_t。bool_tが1バイトではなさそう。
周期を短くしたタスクを動作させた場合に
owered by TOPPERS/ASP3 RTOS of Hakoniwa
Initialization is completed..
System logging task is started.
GO TO THE START
../../kernel/time_event.c:563: Assertion `!sense_lock()' failed.
../../kernel/time_event.c:563: Assertion `!sense_lock()' failed.
:
:
../../kernel/time_event.c:search_region():search_region:not found error:addr=0x5ff6ffc
mpu_get_pointer():addr=0x5ff6ffc
ERROR:PREPARE pc=0x1ff0 sp=0x5ff7000
Exec Error code[0]=0xddf2 code[1]=0x301a type_id=0x0
というassertが出ることがある。
これはgpis_dri.cにてタスクコンテキストでlock_cpu()を呼んでいるが、割り込みを禁止していないため、unlock_cpu()が呼ばれるまでの間にタイマ割り込みが実行され、signal_time()を呼ぶことがあるため。
この場合、signal_time()の
signal_time(void)
{
TMEVTB *p_tmevtb;
bool_t callflag;
assert(sense_context());
assert(!sense_lock()); // ここでCPUロックのフラグを見ている
でassertされる。assertするとこの中でprintをしようとするが、さらにその中でassertが走り、というループを繰り返してスタックあふれが発生すると思われる。
あまり意味はないが、macだと実行権で怒られることがあるため修正。
athrill-sample-yk/ev3rt/ev3rt-beta7-release/asp3/cfg/cfg.rbのバージョンは1.2.2
TOPPERSのリポジトリ https://dev.toppers.jp/svn/ruby_cfg でのtrunkでは1.6.0,tagsでは1.5.0であるため,最新版に変更したい.
C++でコンパイルすると最終リンクでdso_handleの多重定義が出ることがある。
target/v850_gcc/athrill/athrill-libgcc.cで定義してあったので、これを削除する。
cの場合でも大丈夫だったので、大丈夫と思われる。
新さんのテストより
ev3_color_sensor_get_color()を実行すると、下記アサーションがでます。Unityからは0を送っても1を送っても出るので、未実装か見ているところが違っていると思われます。
../common/ev3api/src/ev3api_sensor.c:129: Assertion `val >= COLOR_NONE && val < TNUM_COLOR' failed
調査したところ、COLOR_COLが対応していない
HRP3のMakefile.imgを使ってworkspaceを作り直す。
OBJ/memory.txtとOBJ/device.txtをcommonの下に持っていき、それをアプリ共通で使うように修正する。
合わせてC++の動作でmallocが失敗していた修正として、MALLOC領域をmemory.txtに追加。
athrillのissue tmori/athrill:#15 の不具合に対応。
athrillに入れたathrill_syscall.cをコンパイル対象とする
workspaceでコンパイルした際、
make startで通常起動
make debugでデバッグモード(インタラクションモード)で起動するようにする
timer32なので,2バイトデータを行うと,CPU例外が発生してしまう.
自分の環境だとこれが出てしまってエラーになることがある。
ev3_newlib.cでabortあたりからリンクされている。
もしかすると自分の環境だけかもしれないが、ev3_newlib.cにダミーの関数を用意しておく。
本当はweakにしておいた方が良いが。
原因は,以下と考えています.
.sdataの初期化が行われていない.
.sdataの初期化が行われていないのは,スタートアップルーチンで.sdataの初期値コピー処理が行われていないため.
また,.sdataのROM領域の設定がリンカスクリプトにも漏れている.
一旦,.sdataのROM領域を以下のように定義する.
INTSROM(raxi) : org = 0x00200000, len = 512k
これと併せて,athrillのmemory.txtも修正する.
ev3_led_set_color()をしてもr3のプロトコルの0x003cのLEDが変化しない
現在motor_stop()を呼ぶとUnity側で強制的に止まるのようになっているが、一度brake=trueでstop()を呼び出すとその後再開できなくなっていた。
Unity側ではSTOPを使って停止させることはせず、ev3rt側からPWM0を送る。
Unity側ではfloat/brakeの動作を実現する
新workspaceではhrp3と同様に、OBJの下はテンポラリで使われるようになるため、git管理下のファイルは削除する。
vectorなどのstlが使えない状態であった。
hrp3ではMakefileでC11を使えるようにしていたので、それに合わせて対応する
C++でコンパイルした際にlibcpp-ev3-standalone.aがないとエラーが出る
athrill-syscall.oの依存関係をきちんと書いていなかったので、並列コンパイルの順序によってはエラーとなっていた。
依存関係を記述する。
HRP3のMakefile.imgを持ってきたが、C++でうまく動作しないところがあり、修正。
これに合わせてMakefile.img内に定義していたev3関係のオブジェクト追加はMakefile.imgではなく、target/v850_gcc/Makefile.ev3を定義してそこから持ってくることにした。
libcpp-ev3をコンパイルするために、ALL_LIBSにAPPL_LIBSを反映するように修正
slackの議論より引用
_gccが抱えている__muldi3のコードは
https://github.com/gcc-mirror/gcc/blob/master/libgcc/config/v850/lib1funcs.S
にあるのですが、この中で
___muldi3のコードが少しおかしいところがあります。
森さんが指摘していた点とだいたい指摘は同じですが、実際はスタックオーバーフローではなく、
.type ___muldi3,@function
___muldi3:
#ifdef v850
jarl __save_r26_r31, r10 ★この中でスタックを-20上げている
addi 16, sp, sp ★ここでなぜか16足している
mov r6, r28
shr 15, r28
このままだとどんどんスタックが上がっていきそうですが、そうだとすると普通に動かないはずですが、実際は大抵の場合は動いています。それは実は後の方で
2258行付近
mulh r10, r17
add -16, sp ★戻している!
mov r28, r12
mulh r8, r12
のように、スタックを戻しているのです。この間スタックから参照されることはないので、通常通り動くのですが、この戻すまでの間に割り込みが入った場合、そこからスタックを取られるので、そのため最初にセーブしていた内容が割り込みよって消されてしまいます。
そのため、return_r26_r31をやった時に不正な番地に飛ぼうとするのです。
archにv850_mul.Sを用意し、上記のスタックのおかしな動作をしないものを作成して組み込む。
athrill-sampleにあるログなどを司るcdlファイルはathrillのアプリで共通で使用するものとして、アプリ側ではなく、common/athrill_common.cdlと定義する。
common/Makefile.workspaceを修正し、ファイルを移動する
unity 2019.4.0f1でev3rt-demo1.0-1.unitypackageをimportするとUnity Editorがクラッシュする。
数回試みたが、どれも同じ結果になる。
athrillのサンプルプログラムの格納先(sdk/OBJ)固定から、workspace配下でビルド可能の対応
私の環境では、以下のような3つのリポジトリが存在します。
athrilll
18fa538 (HEAD -> master, origin/master, origin/HEAD) Merge pull request #17 from ytoi/master
athrill-target
63234d3 (HEAD -> master, origin/master, origin/HEAD) Merge pull request #23 from ytoi/master
athrill-sample
20e1643 (HEAD -> master, origin/master, origin/HEAD) Merge pull request #25 from ytoi/master
athril-sampleのev3rt/ev3rt-beta7-release/asp3/sdk/workspace/において、make img=athrillsampleを実行すると、athrill-syscall.cをコンパイルしようとして、見つからずにエラーになります。
これは、以下のようにMakefile.targetでathrill-syscall.oが追加されたために発生します。
$ git diff HEAD~
diff --git a/ev3rt/ev3rt-beta7-release/asp3/target/v850_gcc/Makefile.target b/ev3rt/ev3rt-beta7-release/asp3/target/v850_gcc/Makefile.target
index 01a932c..5b7096a 100644
--- a/ev3rt/ev3rt-beta7-release/asp3/target/v850_gcc/Makefile.target
+++ b/ev3rt/ev3rt-beta7-release/asp3/target/v850_gcc/Makefile.target
@@ -7,7 +7,7 @@カーネルに関する定義
KERNEL_DIRS :=
$(KERNEL_DIRS) $ (TARGETDIR)
-KERNEL_COBJS := $(KERNEL_COBJS) target_config.o tlsf.o athrill-libgcc.o
+KERNEL_COBJS := $(KERNEL_COBJS) target_config.o tlsf.o athrill-libgcc.o athrill-syscall.o
#KERNEL_ASMOBJS := $(KERNEL_ASMOBJS)
しかし、現在は、以下のようにathrillリポジトリにしかathrill-syscall.cが存在しません。
find . -name "athrill-syscall*"
./athrill/trunk/apl/src/athrill-syscall.c
athrill-syscall.cがathrill-sampleリポジトリにも存在するのが正しいのでしょうか。
ファイルシステムへの標準アクセス関数のうち、以下に対応する。
fopen
fclose
fread
fwrite
fseek
fflush
これらで作られたファイルは実行したファイルの_ev3rtfsの下に作られるようにしている。
hrp3ではlibmがデフォルトでリンクされていたので、それに合わせて対応する
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.