Git Product home page Git Product logo

athrill-sample's People

Contributors

esm-tmori avatar hisatsugushiine avatar ryoto-takashima avatar takasehideki avatar ytoi avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

athrill-sample's Issues

通信仕様5/17版対応

通信仕様の変更に対応

MOTOR_ANGLE_Xは原実装に合わせて仕様を変更
バッテリ関係の追加
Athrill側からの通信にジャイロリセットを追加。ジャイロリセットは一度設定したら(UDPパケットが飛んだら)すぐに戻す(flushした際にこのデータをクリアする)。このため、mmap形式では対応できないものとなるが、ひとまずこれで運用。

ETロボコンシミュレータ通信仕様.xlsx

hrp3のcfgファイルを修正しないとaspでコンパイルエラーが出る

ETロボコンのサンプルプログラムをそのまま使うと、app.cfgをcfg1_out.cをコンパイルした際にTPRI_INIT_TASKがないと言われる。

common/ev3api/api.cfg.h でev3.hがincludeされていないため。これは単にインクルードすれば良い。

また、app.cfgでtecsgen.cfgを読み込まないといけないため、テンポラリのcfgファイルを作る対応が必要。

これらを

ev3_serial_open_file()に対応する

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側と同時に変える必要あり

ev3apiのディレクトリ関数に対応する

以下の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をシステムコールとして提供する。

ev3rt/asp3の起動時間が遅い

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領域は不要となったため削除する.

asp3のカーネル管理内割り込み開始時に,cpuのロックフラグを解除する必要がある

理由は以下の通り.

以下のタスク終了関数(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);
}

EV3RT起動ログの変更

現状,「EV3RT Powered by TOPPERS/HRP2 RTOS」になっているけれど,以下に変更する.
EV3RT Powered by TOPPERS/ASP3 RTOS of Hakoniwa

素のlibc.aが使えるようにする

現状の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()を呼ぶとハングする

ev3_ultrasonic_sensor_listen()で用意している領域とuart_dri_get_data_ultrasonic()で設定するデータサイズに差分があった。
get_distance()はint16だが、listenはbool_t。bool_tが1バイトではなさそう。

signal_time()でassertされて、スタックオーバーフローとなることがある

周期を短くしたタスクを動作させた場合に

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が走り、というループを繰り返してスタックあふれが発生すると思われる。

dso_handleの多重定義

C++でコンパイルすると最終リンクでdso_handleの多重定義が出ることがある。

target/v850_gcc/athrill/athrill-libgcc.cで定義してあったので、これを削除する。

cの場合でも大丈夫だったので、大丈夫と思われる。

ev3_color_sensor_get_color()を実行するとassertされる

新さんのテストより

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が対応していない

memory.txtとdevice.txtを共通ファイルにする

OBJ/memory.txtとOBJ/device.txtをcommonの下に持っていき、それをアプリ共通で使うように修正する。

合わせてC++の動作でmallocが失敗していた修正として、MALLOC領域をmemory.txtに追加。

最終リンクで__dtors/__dtors_endの未定義が出る

自分の環境だとこれが出てしまってエラーになることがある。
ev3_newlib.cでabortあたりからリンクされている。
もしかすると自分の環境だけかもしれないが、ev3_newlib.cにダミーの関数を用意しておく。
本当はweakにしておいた方が良いが。

libc の __impure_ptr が初期化されていない

原因は,以下と考えています.
.sdataの初期化が行われていない.
.sdataの初期化が行われていないのは,スタートアップルーチンで.sdataの初期値コピー処理が行われていないため.

また,.sdataのROM領域の設定がリンカスクリプトにも漏れている.
一旦,.sdataのROM領域を以下のように定義する.
INTSROM(raxi) : org = 0x00200000, len = 512k

これと併せて,athrillのmemory.txtも修正する.

ev3_motor_stop()を呼んだ時にset_power()を呼び出してPWM値を0にする

現在motor_stop()を呼ぶとUnity側で強制的に止まるのようになっているが、一度brake=trueでstop()を呼び出すとその後再開できなくなっていた。
Unity側ではSTOPを使って停止させることはせず、ev3rt側からPWM0を送る。
Unity側ではfloat/brakeの動作を実現する

OBJの下のファイル削除

新workspaceではhrp3と同様に、OBJの下はテンポラリで使われるようになるため、git管理下のファイルは削除する。

C++のstlが使えるようにする

vectorなどのstlが使えない状態であった。
hrp3ではMakefileでC11を使えるようにしていたので、それに合わせて対応する

新workspaceのC++対応

HRP3のMakefile.imgを持ってきたが、C++でうまく動作しないところがあり、修正。

これに合わせてMakefile.img内に定義していたev3関係のオブジェクト追加はMakefile.imgではなく、target/v850_gcc/Makefile.ev3を定義してそこから持ってくることにした。

libcpp-ev3をコンパイルするために、ALL_LIBSにAPPL_LIBSを反映するように修正

__muldi3を読んでいる最中に割り込みが発生すると戻ってきた時に例外が発生

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を用意し、上記のスタックのおかしな動作をしないものを作成して組み込む。

app.cdlをathrillの共通ファイルとして使用する

athrill-sampleにあるログなどを司るcdlファイルはathrillのアプリで共通で使用するものとして、アプリ側ではなく、common/athrill_common.cdlと定義する。

common/Makefile.workspaceを修正し、ファイルを移動する

athrill-sampleに存在しないathrill-syscall.cをコンパイルしようとしてエラーになる。

私の環境では、以下のような3つのリポジトリが存在します。

  1. athrilll
    18fa538 (HEAD -> master, origin/master, origin/HEAD) Merge pull request #17 from ytoi/master

  2. athrill-target
    63234d3 (HEAD -> master, origin/master, origin/HEAD) Merge pull request #23 from ytoi/master

  3. 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の下に作られるようにしている。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.