HiFive1は基本的にArduino経由でプログラムを開発するようになっているが、実際に動作しているのはriscv32-gccであり、隣家スクリプトとコンパイルオプションさえ揃えれば普通にC/C++でプログラムを開発できる。
今回、そのプログラム開発フローを構築したので、githubにアップロードした。
ちなみに、Arduinoに付属しているRISC-V GCCを利用しているので、Arduino IDEのインストールと、RISC-V向けツールチェインの導入は必要だ。
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でシリアル受信状態にしておけば、受信できる。