FPGA開発日記

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

HiFive1向けのC/C++言語プログラムを開発するフロー構築

HiFive1は基本的にArduino経由でプログラムを開発するようになっているが、実際に動作しているのはriscv32-gccであり、隣家スクリプトコンパイルオプションさえ揃えれば普通にC/C++でプログラムを開発できる。

今回、そのプログラム開発フローを構築したので、githubにアップロードした。

ちなみに、Arduinoに付属しているRISC-V GCCを利用しているので、Arduino IDEのインストールと、RISC-V向けツールチェインの導入は必要だ。

github.com

main()内に好きなプログラムを書けば、それを実行できる。 以下はuart_print()関数を定義し、シリアルに対して出力を行った結果。

  • main.cpp
/*
 * \brief Main entry point of Arduino application
 */
int main( void )
{
  //   init();
  // Compute F_CPU inverse, used for millis and micros functions.
  calc_inv(F_CPU/1000, &f_cpu_1000_inv);
  calc_inv(F_CPU/1000000, &f_cpu_1000000_inv);
  freedom_e300_specific_initialization();
  setup();

  uart_print ("Hello World\r\n");

  do {
    loop();
...
  • serial.c
void uart_print (uint8_t *str)
{
  while (*str != '\0') {
    uart_putchar(*str);
    str++;
  }

  return;
}


void uart_putchar (uint8_t a)
{
  const int blocking = 1;

  volatile uint32_t *val = UART_REGP(UART_REG_TXFIFO);
  uint32_t busy = (*val) & 0x80000000;
  if (blocking) {
    while (*val & 0x80000000);
  } else if (busy) {
    return;
  }
  UART_REG(UART_REG_TXFIFO) = a;

  return;
}

9600baudでシリアル受信状態にしておけば、受信できる。

f:id:msyksphinz:20170320235540p:plain