UARTからの受信を取りこぼしまくる問題
from マルチサイクル RISC-V CPU を作成したい
手打ちでデータを入力してる時はちゃんと受信してくれていたUARTだが、レイトレのSLDファイルをUARTへ一気に流し込むと受信の取りこぼしが発生するようになった。
本当はUARTへバッファをもたせると良いのだろうけど対応が大変なので、libmincaml.S へSLDファイルを埋め込み、そこからSLDデータを読み込むことで問題に対応した。
修正箇所
まず、SLDファイルをアセンブリへ変換するスクリプトを作成し...
code:sld2asm.rb
puts " .text"
puts " .align 4"
puts " .globl sld_data"
puts "sld_data:"
ARGF.read.each_byte do |b|
puts " .word #{b} // '#{ b == 10 ? '\n' : b.chr }'"
end
SLDファイルから firmware/sld_data.s を作成して...
code:Makefile
...
SLD_FILE = firmware/min-rt/contest.sld
firmware/sld_data.s: $(SLD_FILE) Makefile
ruby firmware/bin/sld2asm.rb $(SLD_FILE) > firmware/sld_data.s
...
libmincaml.S で sld_data.s をインクルードして...
code:libmincaml.S
...
//---------------------------------------------------------
// SLD データ
//---------------------------------------------------------
// sld_data.S をインクルード
.text
.align 4
.globl sld_data
sld_data:
.include "firmware/sld_data.s"
...
min_caml_read_byte2 を使って添付データから1バイトを読み込むようにした
code:libmincaml.S
...
//---------------------------------------------------------
// 添付データから1バイト読み込み
//---------------------------------------------------------
.text
.globl min_caml_read_byte2
min_caml_read_byte2:
// ra をスタックへ退避
addi s10, s10, 4
sw ra, 0(s10)
// SLD データインデックスを読み込み
la t0, sld_data_index
lw t1, 0(t0)
// SLD データを読み込み
la t0, sld_data
add t0, t0, t1
lw a0, 0(t0)
// SLD データインデックスをインクリメント
la t0, sld_data_index
lw t1, 0(t0)
addi t1, t1, 4
sw t1, 0(t0)
// ra レジスタの値を復元
lw ra, 0(s10)
addi s10, s10, -4
ret
...
sld_data_index:
.int 0
//---------------------------------------------------------
// SLD インデックスの初期化
//---------------------------------------------------------
.text
.globl min_caml_init_sld_data_index
min_caml_init_sld_data_index:
la t0, sld_data_index
sw zero, 0(t0)
ret
最後に、read_byte の代わりに read_byte2 を使って、添付データからSLDデータを読み込む。
https://gyazo.com/5e45766ed13348842aa7e720896e9ab3
関連コミット
添付データから read_int できることを確認した
https://github.com/thata/odeeen/commit/c9f03f523a608e8a43db2575e583c424b185b1eb
添付したデータから read_byte できるようにした
https://github.com/thata/odeeen/commit/51e7af35bad0be9190e928ff49527fa0547b478a#diff-76ed074a9305c04054cdebb9e9aad2d818052b07091de1f20cad0bbac34ffb52