本文致力于站在入门开发者角度,深入挖掘RDK S100 MCU的社区用户适配度,为所有RDK S100 MCU开发者提供一套详尽教程。
一、前言
大部分MCU开发需要经过以下几个流程:
环境安装 ---> SDK安装 ---> 代码编写 ---> 程序编译 ---> 程序烧录 ---> MCU启动
其中,环境安装和SDK安装一般是只需要进行一次的动作,其他步骤是开发中需要循环反复的动作。
拿较为常见的使用keil5开发STM32 HAL库举例:
-
环境安装:指安装keil5和GCC相关软件; -
SDK安装:下载对应芯片的软件包并正确设定路径等; -
代码编写:编写测试代码; -
程序编译:使用keil5软件编译代码,生成可执行文件; -
程序烧录:将可执行文件搬运到MCU的flash中; -
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连接的手段,推荐以下方式:
-
通过网口共享局部IP连接:参考RDK S100手册:网络连接
-
安装无线网卡,通过wifi共享局部IP连接:参考RDK S100手册:ssh
-
通过闪连共享局部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开发环境安装与开发流程规范了




