<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[在 xr806 上用 ncnn 跑神经网络 mnist]]></title><description><![CDATA[<p dir="auto">在 xr806 上用 ncnn 跑神经网络 mnist</p>
<h1>0x0 介绍 xr806 和 ncnn</h1>
<p dir="auto"><a href="https://xr806.docs.aw-ol.com/" target="_blank" rel="noopener noreferrer nofollow ugc">https://xr806.docs.aw-ol.com/</a></p>
<p dir="auto">XR806是全志科技旗下子公司广州芯之联研发设计的一款支持WiFi和BLE的高集成度无线MCU芯片，支持鸿蒙L0系统</p>
<p dir="auto"><a href="https://github.com/Tencent/ncnn" target="_blank" rel="noopener noreferrer nofollow ugc">https://github.com/Tencent/ncnn</a></p>
<p dir="auto">ncnn是腾讯开源的高性能神经网络推理框架，无第三方依赖，跨平台，具备非常好的可移植性，允许零拷贝加载模型节省内存</p>
<p dir="auto"><a href="https://aijishu.com/e/1120000000256667" target="_blank" rel="noopener noreferrer nofollow ugc">https://aijishu.com/e/1120000000256667</a></p>
<p dir="auto">又能从极术社区白嫖开发板玩啦！</p>
<p dir="auto">这次要把 ncnn 移植到这款 MCU 芯片</p>
<p dir="auto"><strong>给白嫖就给移植，就像乐鑫科技送的 esp32c3   ^^:D</strong></p>
<p dir="auto"><img src="/assets/uploads/files/1639707580691-20211210_151829-resized.jpg" alt="20211210_151829.jpg" class=" img-responsive img-markdown" /></p>
<h1>0x1 配环境，编译，烧录</h1>
<h2>配代理</h2>
<pre><code class="language-shell">export http_proxy="http://127.0.0.1:4567"
export https_proxy="http://127.0.0.1:4567"
</code></pre>
<h2>下载 repo 工具，配 PATH</h2>
<pre><code class="language-shell">mkdir -p bin
curl https://storage.googleapis.com/git-repo-downloads/repo &gt; bin/repo
chmod a+rx bin/repo
PATH="`pwd`/bin:$PATH"
</code></pre>
<h2>下载 hb 工具，配 PATH</h2>
<pre><code class="language-shell">pip install --user ohos-build
PATH="$HOME/.local/bin:$PATH"
</code></pre>
<h2>下载 openharmony 源码</h2>
<p dir="auto">有时候会遇到错误 <code>error.GitError: manifest rev-list ('^e263a2d3e4557381c32fa31ce24384048d07d682', 'HEAD', '--'): fatal: bad object HEAD</code>，多次重试即可</p>
<pre><code class="language-shell">repo init -u https://gitee.com/openharmony-sig/manifest.git -b OpenHarmony_1.0.1_release --no-repo-verify -m devboard_xr806.xml
repo sync -c
repo forall -c 'git lfs pull'
</code></pre>
<h2>下载 arm toolchain</h2>
<pre><code class="language-shell">wget -c https://developer.arm.com/-/media/Files/downloads/gnu-rm/10-2020q4/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2
tar -xf gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2
</code></pre>
<h2>更新 toolchain 信息</h2>
<p dir="auto">不要用最新版本的工具链，会编译失败</p>
<pre><code class="language-shell">sed -i "s@~/tools/gcc-arm-none-eabi-10-2020-q4-major/bin/arm-none-eabi-@`pwd`/gcc-arm-none-eabi-10-2020-q4-major/bin/arm-none-eabi-@g" device/xradio/xr806/liteos_m/config.gni
sed -i "s@~/tools/gcc-arm-none-eabi-10-2020-q4-major/bin@`pwd`/gcc-arm-none-eabi-10-2020-q4-major/bin@g" device/xradio/xr806/xr_skylark/gcc.mk
</code></pre>
<h2>修正 SDKconfig.gni 生成，修正 copy 脚本</h2>
<pre><code class="language-shell">sed -i "s@open('\.{0}/@open('{0}/@g" device/xradio/xr806/xr_skylark/config.py
sed -i "s@open('\.{0}/@open('{0}/@g" device/xradio/xr806/libcopy.py
</code></pre>
<h2>编译默认的固件</h2>
<p dir="auto">menuconfig 直接 EXIT，后面再选择 wifi_skylark</p>
<pre><code class="language-shell">cd device/xradio/xr806/xr_skylark
cp project/demo/audio_demo/gcc/deconfig .config
make build_clean
make menuconfig
make lib -j
cd -
hb set
hb build -f
</code></pre>
<h2>烧录固件</h2>
<p dir="auto">usb 连接 xr806 开发板，此时会出现 /dev/ttyUSB0 设备（多个设备也可能是别的编号）</p>
<p dir="auto">打开 <code>device/xradio/xr806/xr_skylark/tools/settings.ini</code>，修改固件路径，默认是 <code>strImagePath = ../out/xr_system.img</code>，iBaud 保持默认 <code>iBaud = 921600</code></p>
<p dir="auto">root 权限执行 phoenixMC 工具，开始烧录</p>
<pre><code class="language-shell">cd device/xradio/xr806/xr_skylark/tools
su
./phoenixMC
</code></pre>
<h2>串口查看输出</h2>
<p dir="auto">root 权限执行 tio，添加 <code>-m INLCRNL</code> 参数将 <code>\n</code> 自动调整为 <code>\r\n</code> 防止输出乱掉</p>
<pre><code class="language-shell">su
tio -m INLCRNL /dev/ttyUSB0
</code></pre>
<p dir="auto">按下 xr806 上的 reset 按钮（usb接口右边的按钮），tio 里会输出信息</p>
<h1>0x2 编译出 hello world</h1>
<p dir="auto">打开 <code>device/xradio/xr806/BUILD.gn</code>，启用 deps += <code>"ohosdemo:ohosdemo"</code></p>
<p dir="auto">打开 <code>device/xradio/xr806/ohosdemo/BUILD.gn</code>，启用 deps = <code>"hello_demo:app_hello"</code></p>
<p dir="auto">重新上一节<strong>编译默认的固件</strong>操作，串口会每秒打印 <code>hello world</code></p>
<h1>0x3 精简和编译 ncnn</h1>
<h2>配置 cmake toolchain</h2>
<p dir="auto">下载最新 ncnn 源码</p>
<pre><code class="language-shell">git clone https://github.com/Tencent/ncnn.git
</code></pre>
<p dir="auto">在 toolchains 目录新建 <code>xr806.toolchain.cmake</code>，设置 toolchain 目录和编译器路径</p>
<p dir="auto">为避免引入架构相关的代码，处理器设为 <code>xtensa</code></p>
<p dir="auto">从前面生成的 <code>device/xradio/xr806/liteos_m/SDKconfig.gni</code> 中摘抄有用的目标编译参数，设为默认编译参数</p>
<pre><code class="language-c">set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR xtensa)

set(CMAKE_C_COMPILER "/home/nihui/osd/xr806/gcc-arm-none-eabi-10-2020-q4-major/bin/arm-none-eabi-gcc")
set(CMAKE_CXX_COMPILER "/home/nihui/osd/xr806/gcc-arm-none-eabi-10-2020-q4-major/bin/arm-none-eabi-g++")

set(CMAKE_FIND_ROOT_PATH "/home/nihui/osd/xr806/gcc-arm-none-eabi-10-2020-q4-major/arm-none-eabi")

set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

set(CMAKE_C_FLAGS "-mcpu=cortex-m33 -mtune=cortex-m33 -march=armv8-m.main+dsp -mfpu=fpv5-sp-d16 -mfloat-abi=softfp -mcmse -mthumb -fno-common")
set(CMAKE_CXX_FLAGS "-mcpu=cortex-m33 -mtune=cortex-m33 -march=armv8-m.main+dsp -mfpu=fpv5-sp-d16 -mfloat-abi=softfp -mcmse -mthumb -fno-common")

# cache flags
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "c flags")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "c++ flags")
</code></pre>
<h2>精简 ncnn 功能，减小二进制体积</h2>
<p dir="auto">参考文档 <a href="https://github.com/Tencent/ncnn/wiki/build-minimal-library" target="_blank" rel="noopener noreferrer nofollow ugc">https://github.com/Tencent/ncnn/wiki/build-minimal-library</a> 在 <code>xr806.toolchain.cmake</code> 追加 ncnn cmake 编译选项</p>
<p dir="auto">去除 bf16，int8，图像处理，文件加载模型，多线程，平台相关功能，C接口，c++ rtti exception</p>
<p dir="auto">去除 mnist 模型中用不到的算子</p>
<p dir="auto">开启 NCNN_SIMPLESTL 以便在没有 c++ stl 的 xr806 上使用 c++ stl 特性</p>
<pre><code class="language-c">option(NCNN_INSTALL_SDK "" ON)
option(NCNN_PIXEL_ROTATE "" OFF)
option(NCNN_PIXEL_AFFINE "" OFF)
option(NCNN_PIXEL_DRAWING "" OFF)
option(NCNN_BUILD_BENCHMARK "" OFF)
option(NCNN_BUILD_TESTS "" OFF)
option(NCNN_BUILD_TOOLS "" OFF)
option(NCNN_BUILD_EXAMPLES "" OFF)
option(NCNN_DISABLE_RTTI "" ON)
option(NCNN_DISABLE_EXCEPTION "" ON)
option(NCNN_BF16 "" OFF)
option(NCNN_INT8 "" OFF)
option(NCNN_THREADS "" OFF)
option(NCNN_OPENMP "" OFF)
option(NCNN_STDIO "" OFF)
option(NCNN_STRING "" OFF)
option(NCNN_C_API "" OFF)
option(NCNN_PLATFORM_API "" OFF)
option(NCNN_RUNTIME_CPU "" OFF)

option(NCNN_SIMPLESTL "" ON)

option(WITH_LAYER_absval "" OFF)
option(WITH_LAYER_argmax "" OFF)
option(WITH_LAYER_batchnorm "" OFF)
option(WITH_LAYER_bias "" OFF)
option(WITH_LAYER_bnll "" OFF)
option(WITH_LAYER_concat "" OFF)
option(WITH_LAYER_convolution "" ON)
option(WITH_LAYER_crop "" OFF)
option(WITH_LAYER_deconvolution "" OFF)
option(WITH_LAYER_dropout "" OFF)
option(WITH_LAYER_eltwise "" OFF)
option(WITH_LAYER_elu "" OFF)
option(WITH_LAYER_embed "" OFF)
option(WITH_LAYER_exp "" OFF)
option(WITH_LAYER_flatten "" ON)
option(WITH_LAYER_innerproduct "" ON)
option(WITH_LAYER_input "" ON)
option(WITH_LAYER_log "" OFF)
option(WITH_LAYER_lrn "" OFF)
option(WITH_LAYER_memorydata "" ON)
option(WITH_LAYER_mvn "" OFF)
option(WITH_LAYER_pooling "" ON)
option(WITH_LAYER_power "" OFF)
option(WITH_LAYER_prelu "" OFF)
option(WITH_LAYER_proposal "" OFF)
option(WITH_LAYER_reduction "" OFF)
option(WITH_LAYER_relu "" ON)
option(WITH_LAYER_reshape "" ON)
option(WITH_LAYER_roipooling "" OFF)
option(WITH_LAYER_scale "" OFF)
option(WITH_LAYER_sigmoid "" OFF)
option(WITH_LAYER_slice "" OFF)
option(WITH_LAYER_softmax "" OFF)
option(WITH_LAYER_split "" ON)
option(WITH_LAYER_spp "" OFF)
option(WITH_LAYER_tanh "" OFF)
option(WITH_LAYER_threshold "" OFF)
option(WITH_LAYER_tile "" OFF)
option(WITH_LAYER_rnn "" OFF)
option(WITH_LAYER_lstm "" OFF)
option(WITH_LAYER_binaryop "" ON)
option(WITH_LAYER_unaryop "" OFF)
option(WITH_LAYER_convolutiondepthwise "" OFF)
option(WITH_LAYER_padding "" ON)
option(WITH_LAYER_squeeze "" OFF)
option(WITH_LAYER_expanddims "" OFF)
option(WITH_LAYER_normalize "" OFF)
option(WITH_LAYER_permute "" OFF)
option(WITH_LAYER_priorbox "" OFF)
option(WITH_LAYER_detectionoutput "" OFF)
option(WITH_LAYER_interp "" OFF)
option(WITH_LAYER_deconvolutiondepthwise "" OFF)
option(WITH_LAYER_shufflechannel "" OFF)
option(WITH_LAYER_instancenorm "" OFF)
option(WITH_LAYER_clip "" OFF)
option(WITH_LAYER_reorg "" OFF)
option(WITH_LAYER_yolodetectionoutput "" OFF)
option(WITH_LAYER_quantize "" OFF)
option(WITH_LAYER_dequantize "" OFF)
option(WITH_LAYER_yolov3detectionoutput "" OFF)
option(WITH_LAYER_psroipooling "" OFF)
option(WITH_LAYER_roialign "" OFF)
option(WITH_LAYER_packing "" ON)
option(WITH_LAYER_requantize "" OFF)
option(WITH_LAYER_cast "" ON)
option(WITH_LAYER_hardsigmoid "" OFF)
option(WITH_LAYER_selu "" OFF)
option(WITH_LAYER_hardswish "" OFF)
option(WITH_LAYER_noop "" OFF)
option(WITH_LAYER_pixelshuffle "" OFF)
option(WITH_LAYER_deepcopy "" OFF)
option(WITH_LAYER_mish "" OFF)
option(WITH_LAYER_statisticspooling "" OFF)
option(WITH_LAYER_swish "" OFF)
option(WITH_LAYER_gemm "" ON)
option(WITH_LAYER_groupnorm "" OFF)
option(WITH_LAYER_layernorm "" OFF)
option(WITH_LAYER_softplus "" OFF)
option(WITH_LAYER_gru "" OFF)
option(WITH_LAYER_multiheadattention "" OFF)
option(WITH_LAYER_gelu "" OFF)
option(WITH_LAYER_convolution1d "" OFF)
option(WITH_LAYER_pooling1d "" OFF)
option(WITH_LAYER_convolutiondepthwise1d "" OFF)
option(WITH_LAYER_convolution3d "" OFF)
option(WITH_LAYER_convolutiondepthwise3d "" OFF)
option(WITH_LAYER_pooling3d "" OFF)
</code></pre>
<h2>进一步精简 ncnn 代码，减小二进制体积</h2>
<p dir="auto">打开 <code>src/layer/fused_activation.h</code>，删除除 relu 激活外的其他激活函数实现，避免调用 exp log 等 xr806 上没有的数学函数</p>
<p dir="auto">打开 <code>src/layer/binaryop.cpp</code>，删除 forward 中除 ADD 外的其他二元操作，减小 binaryop 算子二进制体积</p>
<h2>编译 xr806 平台的 ncnn</h2>
<pre><code class="language-shell">mkdir build-xr806
cd build-xr806
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/xr806.toolchain.cmake -DCMAKE_BUILD_TYPE=Release ..
make -j4
make install
</code></pre>
<p dir="auto">编译出的 ncnn 库和头文件在 build-xr806/install 中，libncnn.a 大小约为 234KB</p>
<h1>0x4 实现 mnist 手写数字识别</h1>
<h2>配置 c++ 工程</h2>
<p dir="auto">仿照前面 hello world demo，新建 ncnn demo 工程，main.c 重命名为 main.cpp</p>
<p dir="auto">将前面编译出的 build-xr806/install 目录拷贝到 ncnn_demo 中</p>
<p dir="auto"><a href="http://BUILD.gn" target="_blank" rel="noopener noreferrer nofollow ugc">BUILD.gn</a> 中新加 cflags_cc 是 C++ 编译参数，include_dirs 增加 ncnn 头文件目录</p>
<pre><code class="language-python">import("//device/xradio/xr806/liteos_m/config.gni")

static_library("app_ncnn") {
    configs = []

    sources = [
        "src/main.cpp",
    ]

    cflags = board_cflags
    cflags_cc = board_cflags

    include_dirs = board_include_dirs
    include_dirs += [
        "//kernel/liteos_m/kernel/arch/include",
        "src/ncnn/include",
    ]
}
</code></pre>
<h2>实现 ncnn mnist</h2>
<p dir="auto">参考 <a href="https://github.com/Tencent/ncnn" target="_blank" rel="noopener noreferrer nofollow ugc">https://github.com/Tencent/ncnn</a> 的相关教程，从训练的模型转换出 ncnn 模型</p>
<p dir="auto">使用 ncnnoptimize 优化模型架构，使用 ncnn2mem 将模型转换为可嵌入程序的静态数组</p>
<p dir="auto">为了后续能直接引用加载模型，使用 fp32 类型</p>
<pre><code class="language-shell">ncnnoptimize mnist_1.param mnist_1.bin mnist_1_opt.param mnist_1_opt.bin 0
ncnn2mem mnist_1_opt.param mnist_1_opt.bin mnist_1.id.h mnist_1_bin.h
</code></pre>
<p dir="auto">引用加载模型，直接使用程序 rodata 数据，<strong>加载不会再申请堆内存</strong>，适合 xr806 这样的运行内存较小的设备</p>
<pre><code class="language-cpp">#include "ncnn/benchmark.h"
#include "ncnn/cpu.h"
#include "ncnn/net.h"
#include "ncnn/mat.h"

#include "mnist_1_bin.h"

ncnn::Net net;
net.load_param(mnist_1_opt_param_bin);
net.load_model(mnist_1_opt_bin);
</code></pre>
<p dir="auto">预先读取 28x28 灰度图的像素数据，存放在 <code>const unsigned char IN_IMG[]</code> 数组中</p>
<p dir="auto">在推理前后使用 <code>ncnn::get_current_time</code> api 获得当前 ms 时间戳，算出推理耗时</p>
<pre><code class="language-cpp">ncnn::Mat in = ncnn::Mat::from_pixels(IN_IMG, ncnn::Mat::PIXEL_GRAY, 28, 28);
ncnn::Mat out;

double start = ncnn::get_current_time();

ncnn::Extractor ex = net.create_extractor();
ex.input(0, in);
ex.extract(17, out);

double end = ncnn::get_current_time();

float time_ms = end - start;
</code></pre>
<p dir="auto">输出 10 分类结果，找到概率最高的识别结果</p>
<pre><code class="language-cpp">int gussed = -1;
float guss_exp = -10000000;

for (int i = 0; i &lt; 10; i++)
{
    printf("%d: %.2f\n", i, out[i]);
    if (out[i] &gt; guss_exp)
    {
        gussed = i;
        guss_exp = out[i];
    }
}

printf("I think it is number %d!\n", gussed);
</code></pre>
<p dir="auto">以上代码封装好后，在 main.cpp MainThread 调用</p>
<h1>0x5 编译含有 ncnn mnist 的固件，新的问题和应对</h1>
<h2>链接失败，找不到 operator new 等 C++ 底层实现</h2>
<p dir="auto">menuconfig 中的 <code>C++ support</code> 其实并没什么用，只要编译 ncnn 时开启 NCNN_SIMPLESTL 选项即可</p>
<h2>链接失败，找不到 exp pow log 等数学函数实现</h2>
<p dir="auto">似乎是没有 libm，就直接把 ncnn 中使用的代码删除吧，主要就是 <code>src/fused_activation.h</code> 的 sigmoid 这些，模型没用到就不需要</p>
<h2>链接失败，找不到 ncnn 的实现</h2>
<p dir="auto">没有链接 libncnn.a，应该是 <a href="http://BUILD.gn" target="_blank" rel="noopener noreferrer nofollow ugc">BUILD.gn</a> 没写好，但我也不知道怎么写，于是直接修改 <code>device/xradio/xr806/libcopy.py</code></p>
<p dir="auto">在 <code>APPlib = filenames_filter(FnList,'libapp_','.a')</code> 后面添加</p>
<pre><code class="language-python">os.system("cp /home/nihui/osd/xr806/device/xradio/xr806/ohosdemo/ncnn_demo/src/ncnn/lib/libncnn.a /home/nihui/osd/xr806/device/xradio/xr806/xr_skylark/lib/ohos/")
APPlib.append("libncnn.a")
</code></pre>
<h2>修复 image map</h2>
<p dir="auto">在重复前面编译过程时，发生 bin0 bin1 重叠问题，打开 <code>device/xradio/xr806/xr_skylark/project/demo/wlan_ble_demo/image/xr806/image_wlan_ble.cfg</code>，将自动生成的 <code>device/xradio/xr806/xr_skylark/project/demo/wlan_ble_demo/image/xr806/image_auto_cal.cfg</code> 文件内容覆盖前者，再次编译解决</p>
<h2>无法烧录，救活 xr806</h2>
<p dir="auto">在烧录含有 ncnn mnist 固件后，加载 mnist 模型发生 malloc 失败，此后出现 cpu exception 6 并显示一大堆崩坏的指针，死机，也无法烧录新固件</p>
<p dir="auto">参考 <a href="https://xr806.docs.aw-ol.com/study/soft_flash/" target="_blank" rel="noopener noreferrer nofollow ugc">https://xr806.docs.aw-ol.com/study/soft_flash/</a> 最后的方法，用镊子接触 GNB 和 PN2，并按下 reset 按钮，再烧录即可成功</p>
<h2>去除 wifi 蓝牙模块</h2>
<p dir="auto">因为资源实在紧张，要去除 wifi 蓝牙</p>
<p dir="auto">又因为对 openharmony 不熟悉，于是暴力删除 <code>device/xradio/xr806/adapter/hals/communication</code> 文件夹</p>
<p dir="auto">此时编译出错，找到 <code>build/lite/config/component/lite_component.gni</code></p>
<p dir="auto">修改，不让添加 communication/wifi_lite</p>
<pre><code class="language-python"># add component features
foreach(feature_label, features) {
    print(feature_label)
    if (feature_label != "//device/xradio/xr806/adapter/hals/communication/wifi_lite/wifiservice:wifiservice") {
        deps += [ feature_label ]
    }
}
</code></pre>
<p dir="auto">menuconfig 去掉 wifi 蓝牙的相关功能</p>
<p dir="auto">再次编译解决，烧录固件后，不再 malloc 失败，可以正常推理 ncnn mnist</p>
<h1>0x6 xr806 ncnn mnist 推理实测</h1>
<p dir="auto">整理的项目 <a href="https://github.com/nihui/ncnn_on_xr806" target="_blank" rel="noopener noreferrer nofollow ugc">https://github.com/nihui/ncnn_on_xr806</a> <a href="https://github.com/nihui/ncnn_on_esp32" target="_blank" rel="noopener noreferrer nofollow ugc">https://github.com/nihui/ncnn_on_esp32</a></p>
<p dir="auto">耗时非常稳定，测得算力几乎持平 esp32c3</p>
<p dir="auto"><img src="/assets/uploads/files/1639707596042-photo_2021-12-17_10-24-25.jpg" alt="photo_2021-12-17_10-24-25.jpg" class=" img-responsive img-markdown" width="585" height="590" /></p>
<p dir="auto"><img src="/assets/uploads/files/1639707601275-photo_2021-12-17_10-23-27.jpg" alt="photo_2021-12-17_10-23-27.jpg" class=" img-responsive img-markdown" width="1080" height="1241" /></p>
]]></description><link>https://bbs.aw-ol.com/topic/802/在-xr806-上用-ncnn-跑神经网络-mnist</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Jul 2026 21:49:14 GMT</lastBuildDate><atom:link href="https://bbs.aw-ol.com/topic/802.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 17 Dec 2021 02:20:56 GMT</pubDate><ttl>60</ttl></channel></rss>