×

创建自定义Kria KV260加速ML应用程序

消耗积分:0 | 格式:zip | 大小:0.01 MB | 2023-06-26

申换换

分享资料个

描述

介绍

Xilinx 推出 Kria SOM 令人兴奋!KV260 Vision AI 入门套件是用于开发和原型设计加速算法的绝佳平台,包括但不限于机器学习、计算机视觉和信号处理。Kria App Store中有几个预建的加速应用程序,可以下载并在 KV260 上运行。Xilinx 的智能相机和 NLP-SmartVision 应用程序使用 AR1335 图像传感器和 AP1302 ISP(AR1335 传感器包含在KV260 配件包中,并且是图像处理应用程序的一个很好的补充)。在测试了一些预构建的应用程序之后,您可能会问,“我如何创建自己的应用程序”。该项目将描述可用于创建用于加速 ML 推理任务的基本设计的步骤。

在我们开始之前,回顾一些 KV260 术语会很有帮助

  • 平台:用作基础设计的 Vitis 平台。定义与片外组件(如图像传感器)的物理接口。还定义了加速器时钟和内存接口。
  • Overlay:加速应用程序的秘方。这是我们添加 ML 加速器(即 DPU)以及我们需要的任何其他加速器的地方。使用术语“覆盖”是因为我们将这些加速器覆盖在平台上。

该项目将为支持 AR1335 传感器的平台创建自定义叠加层。

要求

  • KV260 入门套件,带电源和基本附件包
  • Linux构建机器
  • 葡萄2020.2.2
  • PetaLinux 2020.2.2

项目成立

对于这个项目,我们将从 KV260 BSP 和一些参考设计开始。从那里我们将修改 BSP 和参考设计以创建我们的自定义加速 ML 推理应用程序。

  • 从这里下载KV260 2020.2.2 BSP ,保存到~/Downloads 目录
  • 在 Linux 构建机器上创建一个项目目录。以下命令将创建一个名为kv260_ml_accel
mkdir ~/kv260_ml_accel
export PROJ_DIR=~/kv260_ml_accel
  • 使用以下命令从 GitHub克隆示例项目KV260-Vitis
cd $PROJ_DIR
git clone https://github.com/xilinx/kv260-vitis
cd kv260-vitis
git checkout release-2020.2.2_k26
  • Vitis-AI从 GitHub克隆存储库。Vitis-AI 存储库将用于将深度学习处理单元 (DPU) 添加到设计中。
cd $PROJ_DIR
git clone https://github.com/xilinx/Vitis-AI
cd Vitis-AI
git checkout v1.3

注意:DPU 是位于 KV260 SOM 上的 Xilinx Zynq UltraScale+ MPSoC 芯片中 ARM A53 处理器复合体的软 CNN 协处理器。

  • 从 GitHub 克隆 Vitis_​​Libraries 存储库。Vitis Vision 库将用于添加 ML 预处理加速器(图像大小调整)
cd $PROJ_DIR
git clone https://github.com/Xilinx/Vitis_Libraries
cd Vitis_Libraries
git checkout 2020.2
  • 获取 Vitis 和 PetaLinux 环境设置脚本。如果关闭这些脚本的源终端,则需要在新终端中重复此步骤
source /2020.2/settings64.sh
source /2020.2.2/settings.sh

注意:前面命令中显示的设置脚本位于工具安装目录中,例如 Vitis 可能安装在/tools/Xilinx/Vitis/2020.2您机器上的目录中。

  • 下载 KV260 板文件(如果尚未完成)。以下命令中显示的脚本将在$XILINX_VIVADO/data/boards/board_files目录中安装板文件。
cd $PROJ_DIR
wget https://www.hackster.io/code_files/543211/download -O get_kv260_boards.sh
dos2unix get_kv260_boards.sh
sh ./get_kv260_boards.sh

创建平台

NLP-SmartVision 平台提供基本时钟(100、300、600 MHz)和内存连接,用于向 PL 添加加速器。该平台还提供与 AR1335 和 AP1302 接口所需的捕获管道。这将是该项目的基础平台。

修改平台以删除捕获管道中的标量 IP。如果需要执行传感器数据缩放,可以使用 AP1302 ISP 完成。此修改对于适合 KV260 设备 URAM 资源是必要的。

cd $PROJ_DIR/kv260-vitis/platforms/vivado/kv260_ispMipiRx_DP/scripts
cp config_bd.tcl config_bd.tcl.orig
sed -i 's/C_TOPOLOGY {0}/C_TOPOLOGY {3}/g' config_bd.tcl
sed -i '132i\ \ \ CONFIG.C_CSC_ENABLE_WINDOW {false} \\' config_bd.tcl
sed -i 's/v_proc_ss_0\/aclk_axis/v_proc_ss_0\/aclk/g' config_bd.tcl
sed -i 's/\[get_bd_pins v_proc_ss_0\/aclk_ctrl\]//g' config_bd.tcl
sed -i 's/v_proc_ss_0\/aresetn_ctrl/v_proc_ss_0\/aresetn/g' config_bd.tcl

以下命令将构建平台:

cd $PROJ_DIR/kv260-vitis
make platform PFM=kv260_ispMipiRx_DP

平台构建完成后,输出将位于$PROJ_DIR/kv260-vitis/platforms/xilinx_kv260_ispMipiRx_DP_202022_1

编译 ML 预处理加速器

在大多数情况下,传感器数据需要先降低分辨率,然后才能执行 ML 推理。输入捕获管道设置为捕获最大 4K 的图像大小,但大多数 ML 网络不支持这么大的输入大小。为了在 ML 推理之前缩放图像,我们将使用 Vitis Vision 库将图像缩放器 IP 添加到 PL 作为加速器。

  • 修改默认调整大小加速器配置以支持彩色 (RGB) 图像
cd $PROJ_DIR/Vitis_Libraries/vision/L2/examples/resize
sed -i 's/RGB 0/RGB 1/g' build/xf_config_params.h
sed -i 's/GRAY 1/GRAY 0/g' build/xf_config_params.h
  • 使用 Vitis v++ 命令编译 Vitis Vision 库调整大小功能
v++ -c -t hw xf_resize_accel.cpp \
--platform $PROJ_DIR/kv260-vitis/platforms/xilinx_kv260_ispMipiRx_DP_202022_1/kv260_ispMipiRx_DP.xpfm \
--kernel_frequency 300 \
-I../../../L1/include \
-I./build \
--save-temps \
-k resize_accel \
-o resize_accel.xo
  • 编译过程的输出是 Xilinx 目标文件 ( resize_accel.xo),这是我们将加速器添加到我们的 PL 覆盖层所需要的。

创建 ML 推理加速叠加层

我们将使用 Vitis-AI DPU-TRD 将 DPU IP 添加到设计中。DPU 是用于加速 CNN 推理任务的 IP。对于这个项目,我们将使用最大的 DPU——B4096 DPU。

  • 导航到 DPU-TRD 目录
cd $PROJ_DIR/Vitis-AI/dsa/DPU-TRD/prj/Vitis
  • 更新dpu_conf.vh文件以使用 UltraRAM。以下sed命令将更新dpu_conf.vh文件以启用 UltraRAM
sed -i 's/^`define URAM_DISABLE/`define URAM_ENABLE/' dpu_conf.vh
  • 使用配置文件定义 DPU 时钟和内存连接。这个项目提供了一个配置文件。以下命令将下载配置文件并将其放置在 DPU-TRD 项目中。
cd config_file
mv prj_config prj_config.orig
wget https://www.hackster.io/code_files/542906/download -O prj_config
cd ..
  • 修改 DPU-TRD 项目 Makefile 以包含预处理加速器 ( resize_accel.xo)
sed -i '53i kernel_xo += ${PROJ_DIR}/Vitis_Libraries/vision/L2/examples/resize/resize_accel.xo' Makefile
  • 使用以下命令构建 DPU-TRD 以将 DPU 和调整大小加速器添加到平台
export SDX_PLATFORM=$PROJ_DIR/kv260-vitis/platforms/xilinx_kv260_ispMipiRx_DP_202022_1/kv260_ispMipiRx_DP.xpfm
make binary_container_1/dpu.xclbin KERNEL=DPU DEVICE=kv260

构建完成后,您将看到位于目录中的dpu.xclbin文件$PROJ_DIR/Vitis-AI/dsa/DPU-TRD/prj/Vitis/binary_container_1和位于$PROJ_DIR/Vitis-AI/dsa/DPU-TRD/prj/Vitis/binary_container_1/link/vivado/vpl/prj/prj.runs/impl_1目录中的位文件。

  • 将构建文件复制到工作目录
mkdir -p $PROJ_DIR/overlay_files
cd binary_container_1
cp dpu.xclbin $PROJ_DIR/overlay_files
cp link/vivado/vpl/prj/prj.runs/impl_1/*.bit $PROJ_DIR/overlay_files/kv260-ml-accel.bit

从 BSP 创建 PetaLinux 项目

在项目设置部分,我们从 Xilinx 下载站点下载了 BSP。我们将使用下载的 BSP 创建 PetaLinux 项目。以下命令将从 BSP 创建项目。

cd $PROJ_DIR
petalinux-create -t project -s ~/Downloads/xilinx-k26-starterkit-v2020.2.2-final.bsp 
cd xilinx-k26-starterkit-2020.2.2
echo 'BOARD_VARIANT = "kv"' >>  project-spec/meta-user/conf/petalinuxbsp.conf
petalinux-config --silentconfig

将包含 DPU 的自定义 PL 覆盖添加到 PetaLinux 项目

自定义 PL 覆盖将被打包为 PetaLinux 项目中的应用程序,并添加到目标根文件系统。这允许 xmutil 实用程序在 Linux 在 KV260 上启动后将自定义覆盖加载为“加速应用程序”。

  • 从 GitHub 下载 kv260_ispMipiRx_DP 平台的平台设备树定义
wget https://raw.githubusercontent.com/Xilinx/kv260-firmware/release-2020.2.2_k26/nlp-smartvision/kv260-nlp-smartvision.dtsi -O $PROJ_DIR/overlay_files/kv260-ml-accel.dtsi
  • 修改设备树以更改颜色空间转换块的驱动程序(需要,因为我们修改了平台以删除缩放功能)
cd $PROJ_DIR/overlay_files
sed -i 's/scaler-2.2/csc/g' kv260-ml-accel.dtsi
sed -i 's/clock-names = "aclk_axis", "aclk_ctrl"/clock-names = "aclk"/g' kv260-ml-accel.dtsi
  • 从设备树中删除标量特定属性,因为我们从捕获管道中删除了缩放功能(注意:如果需要,AP1302 ISP 仍然能够执行缩放)。
sed -i 's/clocks = <\&misc_clk_2>, <\&misc_clk_2>/clocks = <\&misc_clk_2>/g' kv260-ml-accel.dtsi
sed -i '/xlnx,num-hori-taps = <6>;/d' kv260-ml-accel.dtsi
sed -i '/xlnx,num-vert-taps = <6>;/d' kv260-ml-accel.dtsi
  • 创建 PetaLinux 应用配方。这将创建将我们的自定义覆盖添加到 PetaLinux 项目所需的文件/目录。
cd $PROJ_DIR/xilinx-k26-starterkit-2020.2.2
petalinux-create -t apps --template fpgamanager --name kv260-ml-accel --enable --srcuri "$PROJ_DIR/overlay_files/kv260-ml-accel.bit $PROJ_DIR/overlay_files/kv260-ml-accel.dtsi $PROJ_DIR/overlay_files/dpu.xclbin"

该应用程序将在中创建$PROJ_DIR/xilinx-k26-starterkit-2020.2.2/project-spec/meta-user/recipes-apps/kv260-ml-accel.如果您需要更新比特流、设备树或 xclbin,则只需替换位于该目录中的文件即可。但是,请确保保留相同的名称,因为 .bb 文件正在寻找特定的名称。

创建配方添加配套软件包

向项目添加额外的软件包将创建一个目标根文件系统,其中包含用于 ML 推理的必要库。这些库包括 Vitis-AI 和 OpenCV 以及其他各种实用程序。此外,还有用于编程 AP1302 ISP 的固件文件也需要添加到项目中。

以下命令会将包添加到项目中:

mkdir -p project-spec/meta-user/recipes-core/packagegroups

echo '
DESCRIPTION = "KV260 ML inference app related packages"

inherit packagegroup

KV260_ML_ACCEL_PACKAGES = " \
      ap1302-ar1335-single-firmware \
      dnf \
      e2fsprogs-resize2fs \
      parted \
      resize-part \
      packagegroup-petalinux-vitisai \
      packagegroup-petalinux-vitisai-dev \
      packagegroup-petalinux-gstreamer \      
      cmake \
      libgcc \
      gcc-symlinks \
      g++-symlinks \
      binutils \
      xrt \
      xrt-dev \
      zocl \
      opencl-clhpp-dev \
      opencl-headers-dev \
      packagegroup-petalinux-opencv \
      packagegroup-petalinux-opencv-dev \
      packagegroup-petalinux-v4lutils  \
      "

RDEPENDS_${PN} = "${KV260_ML_ACCEL_PACKAGES}"

COMPATIBLE_MACHINE = "^$"
COMPATIBLE_MACHINE_k26-kv = "${MACHINE}"
PACKAGE_ARCH = "${BOARDVARIANT_ARCH}"

' > project-spec/meta-user/recipes-core/packagegroups/packagegroup-kv260-ml-accel.bb
  • 将自定义包组添加到根文件系统配置
echo "CONFIG_packagegroup-kv260-ml-accel" >> project-spec/meta-user/conf/user-rootfsconfig
echo "CONFIG_packagegroup-kv260-ml-accel=y" >> project-spec/configs/rootfs_config

构建 PetaLinux 项目并创建 SD 卡 wic 映像

以下命令将构建 PetaLinux 项目,然后将输出文件打包为 wic 映像,可以将其写入 SD 卡。

  • 构建项目
petalinux-build
  • 生成wic镜像文件
petalinux-package --wic --bootfiles "ramdisk.cpio.gz.u-boot boot.scr Image system.dtb"

将 wic 映像写入 SD 卡

可以使用 BalenaEtcher 等映像实用程序或在 Linux 上使用命令将 wic 映像文件写入 SD 卡dd可以在 Linux 机器上使用以下命令将 wic 映像写入 SD 卡。在继续之前,请务必阅读以下免责声明:

pYYBAGPjNbiAEtm3AADMxsAGnMI463.png
 
  • 将 SD 卡映像写入空白 SD 卡。以下命令可用于使用 Linux 写入 SD 卡映像:
sudo dd if=images/linux/petalinux-sdimage.wic of=/dev/sdstatus=progress

注意:上面提到的 SD 卡/dev/sd对于您的系统将是唯一的。您需要将 替换为sd适合您系统的驱动器映射。例如,sd可能等于sdasdbsdc等,具体取决于您的系统如何枚举 SD 卡设备。确保在of=上面的参数中指定的名称是设备名称,而不仅仅是一个分区(即of=/dev/sd正确,但of=dev/sd1不正确)。

  • 当 SD 卡写入过程完成后,您可以使用以下命令弹出设备
sudo eject /dev/sd

注意:上一步中关于 SD 卡设备枚举的说明也适用于此步骤。

设置 KV260

KV260 应按照位于https://www.xilinx.com/products/som/kria/kv260-vision-starter-kit/kv260-getting-started/connecting-everything.html的入门指南中的描述进行连接

poYBAGPjNbqAVmuFAAAy0gNVA3Q321.png
 

启动 KV260

将上一节镜像中的micro-SD卡插入KV260 micro-SD卡槽,给板子上电。该板应该开始启动,完成后您将看到登录提示。使用用户名“petalinux”登录,然后根据提示更改密码。有关串行端口控制台示例,请参见下图。

poYBAGPjNcOAcPVDAABGlaXxCKE022.png
KV260登录提示
 

从 Xilinx Vitis-AI Model Zoo 下载预编译的 DenseBox 人脸检测模型

Xilinx Vitis-AI Model Zoo 具有针对 B4096 DPU 架构的预编译模型。我们正在创建的示例应用程序使用 DenseBox 人脸检测模型。以下命令将下载预训练和预编译的模型,然后将其安装在 KV260 根文件系统中。请在 KV260 上执行以下命令。

cd /home/petalinux
wget https://www.xilinx.com/bin/public/openDownload?filename=densebox_640_360-zcu102_zcu104-r1.3.0.tar.gz -O densebox_640_360-zcu102_zcu104-r1.3.0.tar.gz
sudo mkdir -p /usr/share/vitis_ai_library/models

提取模型:

sudo tar -xvzf densebox_640_360-zcu102_zcu104-r1.3.0.tar.gz -C /usr/share/vitis_ai_library/models

下载示例应用程序代码

以下命令将下载并提取示例应用程序代码

wget https://hacksterio.s3.amazonaws.com/uploads/attachments/1393631/face_detect_px1rBmdftj.zip -O face_detect.zip
unzip face_detect.zip

示例应用程序代码使用编译 ML 预处理加速器部分中创建的硬件加速器执行图像缩放DenseBox 人脸检测模型的输入层大小为 640x360,但捕获分辨率为 1920x1080。调用硬件加速器以使用 OpenCL API 调整图像大小。硬件加速器管理由头文件中定义的类处理。resize_accel.hpp

编译应用程序

在我们编译应用程序之前,我们必须加载 kv260-ml-accel Kria 应用程序。在 KV260 上执行以下命令将卸载默认应用程序,然后加载 kv260-ml-accel 应用程序。

sudo xmutil unloadapp
sudo xmutil loadapp kv260-ml-accel

加载 kv260-ml-accel 后,您应该在终端中看到以下内容

poYBAGPjNdeAMkl6AAT36roLB3o891.png
kv260-ml-accel 应用加载
 

加载应用程序后,您可能需要按键盘上的“返回或输入”以返回提示。执行以下命令来设置 MIPI 捕获管道。

cd /home/petalinux/face_detect
./setup_media_pipe.sh

运行脚本后,如果您将 MIPI 摄像头连接到连接器 J7,您应该会看到类似于以下内容的输出。

pYYBAGPjNduAMoElAAA7XtYqiMc761.png
 

该值将需要作为参数传递给示例应用程序。

执行以下命令来运行应用程序。您应该会看到 1920x1080 的捕获图像以及覆盖在 HDMI 监视器上的人脸检测。

cd /home/petalinux/face_detect
./facedetect.exe /dev/video2

请注意,这是一个非常简单的示例应用程序,并未针对性能进行优化(即它是单线程的)。

image_raVvNmrb91.GIF?auto=compress%2Cformat&gifq=35&w=740&h=555&fit=max
1080p MIPI 摄像头输入人脸检测
 

概括

该项目为 Kria KV260 Vision AI 入门套件创建了自定义机器学习加速应用程序。加速应用程序包括与 B4096 DPU CNN 和图像缩放加速器的叠加。

我希望你喜欢这个项目。 请关注我,以便及时了解我的最新项目。我正在开展一个项目,该项目描述了如何将此加速应用程序添加到Xilinx Kria KV260 Vision AI 入门套件的认证 Ubuntu 映像中。

更新2/9/2022 - 请查看我的其他项目,该项目使用 KV260 的官方 Canonical Ubuntu 映像 -使用 Xilinx Kria KV260 在 Ubuntu 上轻松进行机器学习


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'创建自定义Kria KV260加速ML应用程序',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);