FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

HiFive1におけるシリアル通信

HiFive1を使って、PCとのシリアル通信を実行する。

やり方は非常に簡単だ。プログラムはArduinoのサンプルからコピーしてきた。

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  Serial.print("RISC-V HiFive1 Start\r\n");
}

void loop() {
  // put your main code here, to run repeatedly:
  int c;

  if (Serial.available() > 0) {
    c = Serial.read();
 
    Serial.write(c);
  }
}

HiFive1のバグか、そもそも仕様なのか、setup()内で大量にprintをしていると途中で固まる気がする。

f:id:msyksphinz:20170314221807p:plain

asciinema.org

これ、最初はあまり気が付かなかったのだけれども、そのままC++のプログラムなんだな。

loop()main()内で何度も動作しているし、setup()main()の最初で動作している。 Serialはクラスとして定義されており、Serial.print()はクラスのメンバ関数として定義されている。

~/.arduino15/packages/sifive/hardware/riscv/1.0.2には、HiFive1用の各種関数群などが用意されている。

23:#include "HardwareSerial.h"
25:class UARTClass : public HardwareSerial
class HardwareSerial : public Stream
class Stream : public Print
class Print
{
...

    size_t print(const __FlashStringHelper *);
    size_t print(const String &);
    size_t print(const char[]);
    size_t print(char);
    size_t print(unsigned char, int = DEC);
    size_t print(int, int = DEC);
    size_t print(unsigned int, int = DEC);
    size_t print(long, int = DEC);
    size_t print(unsigned long, int = DEC);
    size_t print(double, int = 2);
    size_t print(const Printable&);
...
};