【S100-MCU-UseGuide】-1- 环境准备与开发流程

 本文致力于站在入门开发者角度,深入挖掘RDK S100 MCU的社区用户适配度,为所有RDK S100 MCU开发者提供一套详尽教程。

一、前言

大部分MCU开发需要经过以下几个流程:

环境安装 ---> SDK安装 ---> 代码编写 ---> 程序编译 ---> 程序烧录 ---> MCU启动

其中,环境安装SDK安装一般是只需要进行一次的动作,其他步骤是开发中需要循环反复的动作。


拿较为常见的使用keil5开发STM32 HAL库举例:

  1. 环境安装:指安装keil5和GCC相关软件;

  2. SDK安装:下载对应芯片的软件包并正确设定路径等;

  3. 代码编写:编写测试代码;

  4. 程序编译:使用keil5软件编译代码,生成可执行文件;

  5. 程序烧录:将可执行文件搬运到MCU的flash中;

  6. MCU启动:复位重启MCU,开始运行程序。


许多开发者对S100这颗算控一体化SoC的MCU开发方式有较大疑问,本文将量化说明以上6个动作放在S100的MCU开发中具体是指哪些操作。

二、环境安装

2.1.系统环境

根据S100官方手册,交叉编译MCU程序推荐使用Ubuntu 22.04操作系统,能够尽可能减少因版本差异产生的依赖问题,但大部分同学的PC机是Windows系统,重装系统或买新电脑成本太高,装双系统容易崩Nvidia显卡驱动,虚拟机外设映射太麻烦,这里推荐大家使用WSL2,微软官方工具,安装成功率极高,将Ubuntu 22.04作为子系统安装在Windows系统下,后续的所有教程也将基于这一前提,使用其他方式实现Ubuntu 22.04系统的同学若参考本系列教程需要自行类比;

参考:安装WSL


2.2.软件环境

按照S100官方手册,进入Ubuntu 22.04操作系统命令行中,复制以下命令并安装即可,只要网络通畅、镜像源正确,基本不会出现问题

sudo apt-get install -y build-essential make cmake libpcre3 libpcre3-dev bc bison \
                        flex python3-numpy mtd-utils zlib1g-dev debootstrap \
                        libdata-hexdumper-perl libncurses5-dev zip qemu-user-static \
                        curl repo git liblz4-tool apt-cacher-ng libssl-dev checkpolicy autoconf \
                        android-sdk-libsparse-utils mtools parted dosfstools udev rsync python3-pip scons

pip install "scons>=4.0.0"
pip install ecdsa
pip install tqdm

另外,对于S100的MCU开发,将使用S100 CPU命令作为工具之一,涉及到文件的无线传输,因此建议一定要有SSH连接的手段,推荐以下方式:

  1. 通过网口共享局部IP连接:参考RDK S100手册:网络连接

  2. 安装无线网卡,通过wifi共享局部IP连接:参考RDK S100手册:ssh

  3. 通过闪连共享局部IP连接:参考S100闪连方法


三、SDK安装(源码获取)

S100的社区版SDK代码包获取路径为在这里,注意辨别Linux镜像和MCU代码包,将代码包解压并放置到对应路径即可,这块没有太多讲究,编译工具都用的相对路径,只要环境没问题都能编译成功。


建议保留SDK的tar.gz压缩包,放在工作目录中,这样可以保证SDK不被自己误修改,需要新建一个S100MCU工程时再将其解压改名;

这里我将SDK压缩包改名并加上了版本号,需要新建一个HelloWorld工程,将SDK解压后再改名为项目名称。


四、代码编写

在v4.0.4版本的MCU软件包中,默认编译的主函数位于./Target/Target-hobot-lite-freertos-mcu1/target/main.c路径下,我们写的代码一般也放在同一目录中。


根据手册,在该目录下的文件:

  • main.c:为主函数

  • HorizonISR.c:定义了所有中断回调函数

  • HorizonTask.c:定义了所有FreeRTOS任务函数,根据手册相关内容可以知道哪些任务是用户可用的

其他文件的具体内容可以查看源码或查阅手册。


4.1.编写HelloWorld

S100的SDK提供了LogSync()函数,我们可以用它打印输出S100MCU的日志,以便在CPU中查看MCU的日志文件;

此外,还可以使用LogNotice()函数,将日志同时输出到终端控制台和系统日志中

打开./Target/Target-hobot-lite-freertos-mcu1/target/HorizonTask.c,来到200行左右的OsTask_SysCore_BSW_10ms任务,添加以下语句让MCU每1000ms输出一次HelloWorld,然后保存;

TASK(OsTask_SysCore_BSW_10ms)
{
    #ifdef SHELL_ENABLE
        Shell_Handler();
    #endif

    static uint8_t count = 0;
    if(count++ >= 99)
    {
        count = 0;
        LogSync("Hello World!\r\n");
    }
}

五、程序编译

编写完程序后,我们需要编译程序,S100的SDK提供了编译脚本,确保环境安装完整,来到目录Build/FreeRtos_mcu1_community下,键入python3 build_freertos.py s100_sip_B release以编译程序,也可以使用python3 build_freertos.py s100_sip_B debug编译debug版,首次编译会从网上下载Gcc工具链,需要保存网络通畅;

看到编译信息最后输出build finished则表示编译成功,编译产物位于./output/release/S100_MCU_SIP_V2.0目录下,其中S100_MCU_RELEASE.elf是MCU的可执行文件,debug版类似。


六、程序烧录

在其他MCU的开发中,拿到可执行文件后,我们一般使用各类芯片厂商提供烧录工具将文件烧录到MCU的flash中,在S100MCU开发中应该用什么工具做这个动作?

两个字母: mv


不需要什么工具,将可执行文件移动到S100的Ubuntu系统中对应文件目录下即可,用U盘或SSH(推荐)等任一方式,将.elf移动到S100的Ubuntu系统中;

这里我使用S100闪连,在VSCode中通过SSH登陆到板子上了,所以直接拖拽就好了,然后在S100中mv S100_MCU_RELEASE.elf /lib/firmware/,将可执行文件移动到firmware文件夹下,也可以顺便改个名字,这里我改为S100_MCU_HelloWorld.elf

这样就完成了MCU的程序烧录动作。


七、MCU启动

7.1.启动MCU1

其他MCU在程序烧录完成后,一般是由软件自动复位重启MCU,或者开发者手动按下硬件复位键重启MCU,然后MCU才会开始执行新烧录的程序,S100的MCU也同样如此,但是S100MCU不支持硬件复位,换句话说:即使硬件重启了板卡,也需要软件驱动才能启动MCU;

cd /sys/class/remoteproc/remoteproc_mcu0来到MCU0目录下;

echo [可执行文件名] > firmware来指定MCU1的启动程序,注意指定的可执行文件必须位于/lib/firmware/目录下;

echo start > state启动MCU1;

如果没有报错,MCU1将会被正常启动;


7.2.查看日志

然后键入cd /sys/class/remoteproc/remoteproc_mcu1来到MCU1目录下,键入cat log可以查看MCU1日志信息,发现程序已经开始按照我们的设定每秒输出了一次Hello World


7.3.关闭MCU1

回到/sys/class/remoteproc/remoteproc_mcu0键入echo stop > state关闭MCU1


八、一键烧录

几乎所有MCU开发工具都支持一键build and flash,在开发S100的过程中我们也可以编写脚本一键编译、烧录并启动MCU

直接贴脚本文件: build_and_flash.sh


使用方法:下载该.sh文件,并将其放置在SDK的Build目录中,然后来到Build目录中;

  • 键入build_and_flash.sh -name test_sample仅编译mcu1可执行文件

  • 使用-flash选项,键入build_and_flash.sh -name sample -flash device_ip可以编译并将固件转移到S100的/lib/firmware目录中,必须指定S100的ip

  • 使用-flash选项和-reset选项,键入build_and_flash.sh -name sample -flash device_ip -reset可以并将固件转移到设备,然后复位

  • 以上默认编译release版本,如需debug版本,通过-debug选项切换


九、LAST

至此,我们已经完成了RDK S100 MCU开发环境安装与开发流程规范了


2 个赞