RISC-V大赛开发套件详解(一):D1哪吒开发板Helloworld与闪灯

简介: RISC-V大赛开发套件详解(一):D1哪吒开发板Helloworld与闪灯

编辑语:

为助力“玄铁杯”RISC-V应用创新大赛的顺利进行,协助参赛者快速上手操作大赛提供的RISC-V开发套件,OCC推出RISC-V大赛开发套件解析系列内容,从硬件特点到例程开发为开发者详细解读大赛开发套件。


2022“玄铁杯”RISC-V应用创新大赛不仅为广大开发者提供了技术交流的平台,还为参赛者准备了两套不同操作系统的RISC-V开发套件,即【D1 哪吒开发板】和【D1 Dock Pro开发板】。为帮助开发者快速熟悉上手大赛开发套件,从本期内容开始我们将为大家带来这两套开发套件的上手教程。本文是关于【D1 哪吒开发板】上手的首篇教程,将介绍Helloworld和闪灯例程的操作。


RISC-V应用创新大赛报名正在进行中,感兴趣的小伙伴赶快点击→这里参与报名吧。


01

Helloworld

1.1 概述

本章节介绍helloworld程序如何编译以及如何在D1上运行。


1.2 部署Linux应用程序开发环境

开发应用程序前需要先部署开发编译环境。部署完成后,工具链和基础库会在sysroots目录下。


$ tar xz d1-sysroots-sdk.tar.xz
$ cd  d1-sysroots-sdk
$ ./oecore-x86_64-riscv64-toolchain-nodistro.0.sh


使用前只需要source一下环境变量即可,每个终端启动后都需要执行一遍。


$ source /usr/local/oecore-x86_64/environment-setup-riscv64-oe-linux
### 查看CC变量,如下说明部署成功。
$ echo $CC
riscv64-linux-gcc -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=/usr/local/oecore-x86_64/sysroots/riscv64-oe-linux --no-sysroot-suffix


1.3 编译helloworld程序

  • 在 PC 机编写代码: helloworld.c


#include <stdio.h>
int main(int argc, char **argv)
{
    printf("Hello world!\n");
    return 0;
}


  • 编译


### 每个终端启动后都需要执行一遍。
$ source /usr/local/oecore-x86_64/environment-setup-riscv64-oe-linux
$ $CC helloworld.c -O2 -g -o helloworld


1.4 安装应用

  • 安装应用


# 将程序推送到开发板 / 目录
$ adb push helloworld /.
helloworld: 1 file pushed, 0 skipped. 26.0 MB/s (11736 bytes in 0.000s)


adb 工具可在 SDK 工具目录下找到相应平台的安装文件。ubuntu下可以通过 sudo apt install adb 命令安装


  • 在 D1 上运行 helloworld 程序:

在 console 串口,或执行 adb shell 即可:


# cd /
# ./helloworld
Hello world!


  • 调试hellowrold程序:


02

闪灯

2.1 概述

本章节介绍在 D1 哪吒开发板上如何进行闪灯操作。


闪灯的实现分为命令行点亮 RGB LED(WS2812C-2020)和编写代码实现 LED 的闪烁。该灯在板子上的位置如图1所示。

image.gif图片.png

图1:点亮的LED灯


2.2 命令行点亮 WS2812C-2020

每个RGB LED在 /sys/class/leds/ 目录下对应的有三个 led_classdev 设备目录,分别如下:


/sys/class/leds/sunxi_led[n]r
/sys/class/leds/sunxi_led[n]g
/sys/class/leds/sunxi_led[n]b


其中n 表示LED 的编号,n 最小值为0,最大值为11,本文档以n = 0为例进行闪灯应用的开发;r代表红灯,g代表绿灯,b代表黄灯。


2.1 使用led brightness点亮WS2812C-2020

在 console 串口,或执行 adb shell

  • 点亮第0个灯的红灯echo 250 > /sys/class/leds/sunxi_led0r/brightness
  • 点亮第0个灯的绿灯echo 250 > /sys/class/leds/sunxi_led0g/brightness
  • 点亮第0个灯的黄灯echo 250 > /sys/class/leds/sunxi_led0b/brightness


其中250表示灯的亮度,可选值为0-250(0灭,250最亮)。


2.2 使用led trigger实现WS2812C-2020的闪烁

Trigger 类型有:rfkill-any rfkill-none rfkill0 mmc0 timer rfkill1 rfkill2。


以timer为例实现第0个灯的红灯闪烁在 console 串口,或执行 adb shell echo timer > /sys/class/leds/sunxi_led0r/trigger


2.3 编写代码实现 WS2812C-2020 的闪烁

2.3.1 编译闪灯程序

  • 在 PC 机上编写代码:led_example.c


#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#define LOOP_NUM 2
int main(int argc, char **argv)
{
    size_t size_write = 0;
    int fd_r = 0;
    int fd_g = 0;
    int fd_b = 0;
    char *val_high = "250";
    char *val_low = "0";
    char *file_led0r = "/sys/class/leds/sunxi_led0r/brightness";
    char *file_led0g = "/sys/class/leds/sunxi_led0g/brightness";
    char *file_led0b = "/sys/class/leds/sunxi_led0b/brightness";
    fd_r = open(file_led0r, O_WRONLY | O_TRUNC, 0);
    if (fd_r < 0) {
        printf("open file_led0r failed\n");
        return -1;
    }
    fd_g = open(file_led0g, O_WRONLY | O_TRUNC, 0);
    if (fd_g < 0) {
        printf("open file_led0g failed\n");
        return -1;
    }
    fd_b = open(file_led0b, O_WRONLY | O_TRUNC, 0);
    if (fd_b < 0) {
        printf("open file_led0b failed\n");
        return -1;
    }
    int loop = LOOP_NUM;
    while ( loop-- ) {
        size_write = write(fd_r, val_high, 3);
        if ( size_write < 0 ) {
            printf("write file_led0r highfailed\n");
            return -1;
        }
        sleep(1);
        size_write = write(fd_r, val_low, 1);
        if ( size_write < 0 ) {
            printf("write file_led0r low failed\n");
            return -1;
        }
        sleep(1);
        size_write = write(fd_g, val_high, 3);
        if ( size_write < 0 ) {
            printf("write file_led0g high failed\n");
            return -1;
        }
        sleep(1);
        size_write = write(fd_g, val_low, 1);
        if ( size_write < 0 ) {
            printf("write file_led0g low failed\n");
            return -1;
        }
        sleep(1);
        size_write = write(fd_b, val_high, 3);
        if ( size_write < 0 ) {
            printf("write file_led0b high failed\n");
            return -1;
        }
        sleep(1);
        size_write = write(fd_b, val_low, 1);
        if ( size_write < 0 ) {
            printf("write file_led0b low failed\n");
            return -1;
        }
        sleep(1);
    }
    close(fd_r);
    close(fd_g);
    close(fd_b);
    return 0;
}


  • 编译


### 每个终端启动后都需要执行一遍。
$ source /usr/local/oecore-x86_64/environment-setup-riscv64-oe-linux
$ $CC led_example.c -O2 -g -o led_example


2.3.2 安装应用

  • 安装应用


# 将程序推送到开发板 /usr/bin
$ adb push led_example /usr/bin
./led_example: 1 file pushed. 2.3 MB/s (18016 bytes in 0.007s)


  • 在D1上运行闪灯程序

在 console 串口,或执行 adb shell


led_example


  • 调试闪灯程序
相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
Linux 开发工具 内存技术
国产之路:复旦微zynq调试笔记2--PL网口
PL侧的网口需求相较于PS部分还是有一定区别的,主要需要添加axi ethernet 的移植
2576 0
|
传感器 物联网 调度
天啊!鹅厂都开始做开发板了?网红腾讯物联网开发板终极开箱评测,让我们一睹为快!
天啊!鹅厂都开始做开发板了?网红腾讯物联网开发板终极开箱评测,让我们一睹为快!
253 2
|
存储 人工智能 JavaScript
RISC-V大赛开发套件详解(五):D1哪吒开发板Haas-UI视频播放
RISC-V大赛开发套件详解(五):D1哪吒开发板Haas-UI视频播放
565 1
RISC-V大赛开发套件详解(五):D1哪吒开发板Haas-UI视频播放
|
监控 开发工具 git
RISC-V大赛开发套件详解(九):D1 Dock Pro开发板快速上手教程
通过上文介绍,相信各位开发者已经对D1 Dock Pro开发板各项硬件功能有了更清晰的认识。本期我们将在上期的基础上,着重为大家讲解D1 Dock Pro开发板的开发环境搭建,并基于Helloworld例程演示通过剑池CDK下载代码、编译和运行的过程。
900 0
RISC-V大赛开发套件详解(九):D1 Dock Pro开发板快速上手教程
|
JavaScript 网络协议 Linux
RISC-V大赛开发套件详解(六):D1哪吒开发板HaaS-UI FOTA 升级
本期内容是HaaS-UI实战教学部分的最后一篇,同时也是D1 哪吒开发板上手教学的完结篇。我们将手把手教大家在D1 哪吒开发板上实现HaaS-UI的FOTA升级功能。
525 0
RISC-V大赛开发套件详解(六):D1哪吒开发板HaaS-UI FOTA 升级
|
存储 Linux 测试技术
RISC-V大赛开发套件详解(八):D1 Dock Pro开发板用户指南
通过上期介绍,相信各位开发者已经对D1 Dock Pro开发板有了初步的认识。本期我们将在此基础上,为大家带来D1 Dock Pro开发板用户指南,讲解说明开发板规格和各个接口,最后带大家上手搭建开发环境。
659 0
RISC-V大赛开发套件详解(八):D1 Dock Pro开发板用户指南
|
Linux 开发者 芯片
RISC-V大赛开发套件详解(七):D1 Dock Pro开发板介绍
Sipeed D1 Dock Pro开发板是2022“玄铁杯”RISC-V应用创新大赛为广大参赛者准备的另一RISC-V开发套件。目前,广大参赛者已经进入上手开发阶段。为了让选择这一开发套件的开发者能快速上手开发,本期内容开始我们将为大家分享D1 Dock Pro开发板的上手教程。本文主要介绍的是该开发板的性能特点,旨在带各位开发者初步了解该RISC-V开发套件。
751 0
RISC-V大赛开发套件详解(七):D1 Dock Pro开发板介绍
|
编解码 缓存 NoSQL
RISC-V大赛开发套件详解(二):D1哪吒开发板Yocto介绍
RISC-V大赛开发套件详解(二):D1哪吒开发板Yocto介绍
1689 2
|
人工智能 自然语言处理 JavaScript
RISC-V大赛开发套件详解(四):D1哪吒开发板Haas-UI语音AI
RISC-V大赛开发套件详解(四):D1哪吒开发板Haas-UI语音AI
671 0
RISC-V大赛开发套件详解(四):D1哪吒开发板Haas-UI语音AI
|
算法 物联网 Linux
Hi3516开发笔记(一):海思HI3516DV300芯片介绍,入手开发板以及Demo测试
Hi3516开发笔记(一):海思HI3516DV300芯片介绍,入手开发板以及Demo测试
Hi3516开发笔记(一):海思HI3516DV300芯片介绍,入手开发板以及Demo测试