K230 Practical Basics - Hello World#

Overview#

This document explains how to use a cross-compilation tool on a PC to compile a basic Hello World program and run it on a big core RT-Smart or a small core Linux.

Environment Preparation#

Hardware Environment#

  • K230-USIP-LP3-EVB-V1.0/K230-USIP-LP3-EVB-V1.1

  • Ubuntu PC 20.04

  • At least 2 Type-C USB cables

  • USB Type-C to Ethernet adapter (if using TFTP loading and NFS file system)

  • One Ethernet cable

  • SD card (if using SD card boot or if software needs to access the SD card)

Software Environment#

The k230_sdk provides toolchains located at the following paths.

  • Big core RT-Smart toolchain

k230_sdk/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu
  • Small core Linux toolchain

k230_sdk/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0

You can also download the toolchains from the following links:

wget https://download.rt-thread.org/rt-smart/riscv64/riscv64-unknown-linux-musl-rv64imafdcv-lp64d-20230222.tar.bz2
wget https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/resource//1659325511536/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0-20220715.tar.gz

Code Writing#

Create a C file named hello.c on Ubuntu and add the following code:

#include <stdio.h>
int main(void)
{
    printf("hello world\n");
    return 0;
}

Place hello.c in the same directory level as k230_sdk.

canaan@develop:~/work$ ls
hello.c   k230_sdk

Compiling an Executable for Small Core Linux#

k230_sdk/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin/riscv64-unknown-linux-gnu-gcc hello.c -o hello

Compiling an Executable for Big Core RT-Smart#

k230_sdk/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin/riscv64-unknown-linux-musl-gcc -o hello.o -c -mcmodel=medany -march=rv64imafdcv -mabi=lp64d hello.c

k230_sdk/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin/riscv64-unknown-linux-musl-gcc -o hello.elf -mcmodel=medany -march=rv64imafdcv -mabi=lp64d -T k230_sdk/src/big/mpp/userapps/sample/linker_scripts/riscv64/link.lds  -Lk230_sdk/src/big/rt-smart/userapps/sdk/rt-thread/lib -Wl,--whole-archive -lrtthread -Wl,--no-whole-archive -n --static hello.o -Lk230_sdk/src/big/rt-smart/userapps/sdk/lib/risc-v/rv64 -Lk230_sdk/src/big/rt-smart/userapps/sdk/rt-thread/lib/risc-v/rv64 -Wl,--start-group -lrtthread -Wl,--end-group

Running the Program#

Copy the compiled hello and hello.elf to the vfat partition of the SD card (you can see an accessible drive letter on the PC after burning the image to the SD card), or use other methods (refer to the SDK usage documentation) to copy the executables to the /sharefs directory of the small core.

  • After the development board starts, run the test program on the small core. Enter root to access the console after the small core starts.

Welcome to Buildroot
canaan login: root
[root@canaan ~ ]#cd /sharefs
[root@canaan /sharefs ]#./hello
hello world
  • Run the test program on the big core

msh /sharefs>hello.elf
hello world

Advanced Big Core Program Compilation#

When using musl-gcc to compile for the big core directly, the compilation parameters are quite extensive, which can be inconvenient and hard to understand for beginners. The current SDK provides two methods for compiling big core programs: SCons and Makefile. Here, we introduce the SCons compilation method. The Makefile compilation build is more complex and is not the official RT-Smart compilation method. Interested readers can refer to the Makefile structure in src/big/mpp/userapps/sample for compilation.

Create a folder named hello under k230_sdk/src/big/rt-smart/userapps.

cd k230_sdk/src/big/rt-smart/userapps
mkdir hello
cd hello

Create the following three files:

  • hello.c

  • SConscript

# RT-Thread building script for component

from building import *

cwd = GetCurrentDir()
src = Glob('*.c')
CPPPATH = [cwd]

CPPDEFINES = [
    'HAVE_CCONFIG_H',
]
group = DefineGroup('hello', src, depend=[''], CPPPATH=CPPPATH, CPPDEFINES=CPPDEFINES)

Return('group')
  • SConstruct

import os
import sys

# add building.py path
sys.path = sys.path + [os.path.join('..', '..', 'tools')]
from building import *

BuildApplication('hello', 'SConscript', usr_root='../')

Then return to the k230_sdk/src/big/rt-smart/ directory and configure the environment variables.

canaan@develop:~/k230_sdk/src/big/rt-smart$ source smart-env.sh riscv64
Arch         => riscv64
CC           => gcc
PREFIX       => riscv64-unknown-linux-musl-
EXEC_PATH    => /home/canaan/k230_sdk/src/big/rt-smart/../../../toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin

Go to the k230_sdk/src/big/rt-smart/userapps directory and compile the program.

canaan@develop:~/k230_sdk/src/big/rt-smart/userapps$ scons --directory=hello
scons: Entering directory `/home/canaan/k230_sdk/src/big/rt-smart/userapps/hello'
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: build/hello
CC build/hello/hello.o
LINK hello.elf
/home/canaan/k230_sdk/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin/../lib/gcc/riscv64-unknown-linux-musl/12.0.1/../../../../riscv64-unknown-linux-musl/bin/ld: warning: hello.elf has a LOAD segment with RWX permissions
scons: done building targets.

The compiled program is in the hello folder.

canaan@develop:~/k230_sdk/src/big/rt-smart/userapps$ ls hello/
build  cconfig.h  hello.c  hello.elf  SConscript  SConstruct

Afterwards, you can copy hello.elf to the small core Linux, and the big core RT-Smart can run the program via /sharefs.