【优化代码】教你7招简单实现代码的“小而美”

前言

上周,RT-Thread 在 ART-Pi 直播间举行了一场挑战赛—— 【比一比】RT-Thread直播间挑战赛,看看谁能裁剪出最小系统!https://club.rt-thread.org/ask/question/428858.html

评选出固件最小的三名,奖励:第一名:多媒体扩展板 + 工业扩展板、第二名:多媒体扩展板、第三名:工业扩展板。

目前,社区小伙伴正在积极投稿参赛中,也欢迎更多小伙伴踊跃报名。活动截至时间:11月12日-18:00(下周四)。

直播回看链接:

https://www.moore8.com/courses/3163(请复制至外部浏览器打开)

在这里主要提供优化固件的一些可参考的方向,旨在抛砖引玉,大家有任何比较好的方法都可以发帖到论坛讨论,我们会基于反馈意见来进一步优化这篇文档。

为何优化固件尺寸

使用 RT-Thread-Studio 进行工程构建时,为了实现业务需求,我们常常会增加驱动文件、组件或者软件包等等,并且在调试代码时也可能需要使能调试相关的功能(例如打开 ulog 功能 )或者自行打印一些调试的信息。因此,我们会编译得到一个稍微冗余的固件。对于 MCU 的 Flash 比较紧张时,我们需要考虑代码体积的优化,使其尽量精简,这样的代码在之后的迭代开发中才可以实现小而美的目标。

下面是几个可以去考虑的优化的方向:

  • 裁剪

  • 选择合适的优化等级

  • 开启 newlib-nano 选项

  • 使用 Map File 分析工具

  • readelf 命令分析 ELF 文件

  • 更换 libc 库

  • 更换同类型 Flash 较大的硬件平台

需要注意的是,并不是所有的优化都是行之有效的,如果收效甚微的优化却造成了系统性能的大幅衰减,这是非常不可取的,所以优化的时候要认真分析,综合考虑,不可能一蹴而就。

01

裁剪

裁剪是优先需要考虑的方向,这种方式操作简单,也最为见效。

以下是基于 stm32l475-atk-pandora BSP 进行裁剪的例子,该示例使用 RT-Thread 4.0.3 版本,优化等级 -O0。

MCU:STM32L475VET6,512KB FLASH ,128KB RAM

在做了一系列配置之后(模拟项目工程),该 BSP 现已有资源为:

  • 内核:信号量、互斥量、事件集、邮箱、消息队列;main 线程、tshell 线程、idle 线程

  • 组件:文件系统(fatfs)、Finsh 组件、UART 框架、GPIO 框架、SFUD 组件、QSPI 框架

  • 外设驱动:片上 UART、GPIO、QSPI、板上 QSPI FLASH、NRF24L01、LCD、PWM、ADC等

其中关系为:

  1. main 中的 led 闪烁:PIN 驱动、PIN 框架

  2. FinSH 控制台:使用 UART 驱动、UART 框架、FinSH 组件

  3. 文件系统(板上 QSPI FLASH):使用 QSPI 驱动、QSPI 框架、文件系统组件 Fatfs、FAL 软件包

  4. Ulog:ulog 组件

  5. 其他硬件板载设备驱动:LCD、TIMER、PWM、ADC、RTC、Audio

利用 RT-Thread Setting 的图形界面,我们可以比较直观的看到使能了哪些软件包、驱动和组件。

当前系统体积大小如下所示:

1   text       data     bss     dec     hex filename
2 260932       1648    5388  267968   416c0 rtthread.elf
3              Used Size(B)           Used Size(KB)
4Flash:         262580 B              256.43 KB
5RAM:             7036 B                6.87 KB

可以看到当前系统体积大小 256KB,下面对该BSP进行裁剪,打开工程的 RT-Thread Settings 配置界面:

裁剪 Ulog 组件(-3.8KB)

去除异步日志功能后

1   text       data     bss     dec     hex filename
2 257000       1648    5120  263768   40658 rtthread.elf
3              Used Size(B)           Used Size(KB)
4Flash:         258648 B              252.59 KB
5RAM:             6768 B                6.61 KB

裁剪文件系统及 Flash 设备(-83.2KB)

由于系统使能了 FAL 软件包,如下图

除能 FAL 软件包

关闭 QSPI Flash 设备,在Hardware选项中,将已经适配好的 QSPI FLASH相关设备除能。

QspiFlash

由于系统不再使用 QSPI 设备,那么相对应的 QSPI设备驱动框架,也是可以取消掉的。这点在裁剪系统时候很重要,因为我们开发中经常 使能/除能 一些总线上的设备,却常常忘记关 总线/设备驱动框架 造成系统体积上的损耗。

关闭 QSPI Flash 设备框架

最后将虚拟文件系统 DFS 关闭。

1   text       data     bss     dec     hex filename
2 172148       1308    3556  177012   2b374 rtthread.elf
3              Used Size(B)           Used Size(KB)
4Flash:         173456 B              169.39 KB
5RAM:             4864 B                4.75 KB

裁剪外设驱动(-101.8KB)

关闭 LCD、Audio 设备(由于SPI无其他设备挂载,因为可以裁剪掉SPI BUS)( -75KB)

关闭LCD和Audio设备驱动

1   text       data     bss     dec     hex filename
2  95204       1260    2864   99328   18400 rtthread.elf
3              Used Size(B)           Used Size(KB)
4Flash:          96464 B               94.20 KB
5RAM:             4124 B                4.03 KB

裁剪掉 TIMER、PWM、ADC、RTC 外设驱动  (-26.6KB)

裁剪掉TIMER、PWM、ADC、RTC外设驱动

1   text       data     bss     dec     hex filename
2  68856        384    2524   71764   11854 rtthread.elf
3              Used Size(B)           Used Size(KB)
4Flash:          69240 B               67.62 KB
5RAM:             2908 B                2.84 KB

裁剪 FinSH(-13K)

1   text       data     bss     dec     hex filename
2  55500        384    2240   58124    e30c rtthread.elf
3              Used Size(B)           Used Size(KB)
4Flash:          55884 B               54.57 KB
5RAM:             2624 B                2.56 KB

裁剪内核 IPC(体积几乎不变)

关闭事件集、邮箱、消息队列

1   text       data     bss     dec     hex filename
2  54888        336    2232   57456    e070 rtthread.elf
3              Used Size(B)           Used Size(KB)
4Flash:          55224 B               53.93 KB
5RAM:             2568 B                2.51 KB

检查 RT-Thread Setting 和 rtconfig.h 配置文件

经过以上的裁剪步骤,差不多裁剪了十之八九了,接下来就要检查还有什么地方在裁剪的过程中被忽略了,然后再按照上面的步骤做深入的裁剪,在此不再一一演示,仅作展示说明为主。

打开 RT-Thread Setting 图形化界面如下图所示:

可以看到目前系统有使用到 libc 组件、Serial 驱动、Pin 设备驱动、Soft I2C 驱动。例如现在除能 libc 组件,直接单击 libc 按钮去除使能即可。

另外,我们也可以根据 rtconfig.h 文件查看各个宏定义信息,避免遗漏。下面是 rtcopnfig.h 的部分配置信息。

 1#ifndef RT_CONFIG_H__
 2#define RT_CONFIG_H__
 3
 4/* Generated by Kconfiglib (https://github.com/ulfalizer/Kconfiglib) */
 5
 6/* RT-Thread Kernel */
 7
 8#define RT_NAME_MAX 8
 9#define RT_ALIGN_SIZE 4
10#define RT_THREAD_PRIORITY_32
11#define RT_THREAD_PRIORITY_MAX 32
12#define RT_TICK_PER_SECOND 1000
13#define RT_USING_OVERFLOW_CHECK
14#define RT_USING_HOOK
15#define RT_USING_IDLE_HOOK
16#define RT_IDLE_HOOK_LIST_SIZE 4
17#define IDLE_THREAD_STACK_SIZE 256
18#define RT_DEBUG                         //DEBUG相关还可以再优化掉
19#define RT_DEBUG_COLOR                   //DEBUG相关还可以再优化掉
20
21/* Inter-Thread communication */
22
23#define RT_USING_SEMAPHORE
24#define RT_USING_MUTEX
25/* end of Inter-Thread communication */
26
27/* Memory Management */
28
29#define RT_USING_MEMPOOL                  //内存池还可以再优化掉
30#define RT_USING_SMALL_MEM
31#define RT_USING_HEAP
32/* end of Memory Management */
33
34/* Kernel Device Object */
35
36#define RT_USING_DEVICE
37#define RT_USING_CONSOLE
38#define RT_CONSOLEBUF_SIZE 256
39#define RT_CONSOLE_DEVICE_NAME "uart1"
40/* end of Kernel Device Object */
41#define RT_VER_NUM 0x40003
42/* end of RT-Thread Kernel */
43#define ARCH_ARM
44#define RT_USING_CPU_FFS
45#define ARCH_ARM_CORTEX_M
46#define ARCH_ARM_CORTEX_M4
47
48#endif


02

选择合适的优化等级

RT-Thread-Studio 使用的是 GCC 编译器,GCC 编译器对代码的编译优化有一系列的配置项,大体分为五个优化等级:-O0、-O1、-O2、-O3 和 -Os。

-O0:关闭所有优化选项,是 GCC 默认的等级,目的是让编译器减少编译时间并使调试产生预期的结果。在 RT-Thread-Studio 中,默认也是配置的该选项,如果编译的代码尺寸较大,我们建议更换优化等级(一般我们会选择 O2 等级)。

-O1:这是最基本的优化等级。编译器会在不花费太多编译时间的同时试图生成更快更小的代码。这些优化是非常基础的,但一般这些任务肯定能顺利完成。

-O2:O1 的进阶。这是推荐的优化等级,除非你有特殊的需求。O2 会比 O1 启用更多的优化选项。当设置了 O2 等级后,编译器会试图增加编译的时间和提升生成代码的性能(我们一般选用此优化等级完成编译任务)。

-O3:这是最高的优化等级,O3 开启了 O2 指定的所有优化,并启用了更多的优化选项。例如构建用于保存变量的伪寄存器网络(使得调试更加困难)、优化循环执行过程等。开启 O3 优化不一定会减少代码尺寸,有可能会为了减少代码执行时间反而增加代码体积。一般我们不使用此优化等级。

-Os:该这个等级用来优化代码尺寸。其中启用了 O2 中不增加目标文件大小的优化选项。这对于磁盘空间极其紧张或者 CPU 缓存较小的机器非常有用。一般使用 O2 等级之后发现生成的目标文件尺寸偏大,可以尝试使用 Os 等级进一步的优化。下表是GCC 优化等级列表。

gcc -O option flag

+increase ++increase more +++increase even more -reduce --reduce more ---reduce even more

RT-Thread-Studio 默认选择的是 -O0(关闭所有优化)等级,按照上一章节,系统最后的裁剪的尺寸为 53.93KB,下面开启 O2 优化等级,代码尺寸缩小为 38.14 KB:

开启-O2优化等级

1   text       data     bss     dec     hex filename
2  38724        336    2232   41292    a14c rtthread.elf
3              Used Size(B)           Used Size(KB)
4Flash:          39060 B               38.14 KB
5RAM:             2568 B                2.51 KB

下面开启 -Os 优化等级,代码尺寸缩小为 34.64 KB:

开启-Os化等级

1   text       data     bss     dec     hex filename
2  35140        336    2232   37708    934c rtthread.elf
3              Used Size(B)           Used Size(KB)
4Flash:          35476 B               34.64 KB
5RAM:             2568 B                2.51 KB


03

开启newlib-nano 选项

RT-Thread-Studio 默认使用的 libc,提供了 printf、scanf 等很多标准库函数,但是这些库函数相对都比较大(在嵌入式平台上),而且很可能一些复杂的功能,我们在项目中并没有使用到,这样会造成代码体积的增大。

因此 newlib 提供了一个精简功能的版本,将一些标准库函数进行简化,仅仅实现一些简单常用的功能,这样便可以使得编译的代码轻量化,更适合嵌入式平台使用。(但是如果我们使用了标准库的一些复杂的功能,而 newlib-nano 并没有完备的实现这些功能,那么可能会造成一些意外的运行结果,我们在使用时要注意这些。)

如下图所示,我们在RT-Thread-Studio 中便可以开启该选项。

newlib_nano

另外,开启 newlib-nano 时,对于 printf 和 scanf 等的使用是默认不带浮点运算的,如果使用浮点的话,则需要开启对应选项,如上图中 Use float with nano printfUse float with nano scanf 选项框。

04

对Map File进行分析优化(使用 Amap.exe 工具)

在进行裁剪之后,我们还可以使用 Amap.exe 工具{( map 文件分析工具)[http://www.sikorskiy.net/prj/amap/]}

使用该工具只是辅助性的分析函数调用所占字段大小,从而针对各个组件和函数进行优化裁剪等。

Amap工具分析图示

05

使用readelf命令分析ELF文件

与 Amap 工具类似,我们也可以使用 readelf 命令分析系统生成的 elf 文件。详细命令介绍见 readelf - Linux man page,或者直接 readelf --help查看用法。

使用 readelf -all rtthread.elf 可以查看 elf 的所有信息。

例举ELF的头信息

依据生成的符号表 ( Symbol table ) ,可以看到生成的字段信息,例如类型为 GLOBAL 代表全局符号,OBJECT 代表数据对象,比如变量数组,FUNC 代表函数等等。我们可以利用这些这些信息,分析具体的段对应的大小。

例举ELF的符号表信息

06

如有必要,可以更换libc库

目前 RT-Thread-Studio 在使用 libc 时,默认使用的是 newlib,也有 minilibc 库支持,这个主要是提供给 gcc 编译器的,minilibc 可以不需要再链接 GCC 自带的 libc 库。newlib 则是用于链接到 GCC 自带的 libc 库。newlib 提供的底层c库接口相对 minilibc 库更全面,而 minilibc 库在实现上可以使得代码体积更小。

如果我们项目上需要用到 C 库时,可以按照具体需求选择更换 C 库,甚至有能力的开发者可以自行设计优化 C 库代码使得编译尺寸减小的同时,又不会造成性能上的损失。

07

更换同类型Flash较大的硬件平台

最后还要提一点的是,当系统经过优化后仍然无法满足需求,如果有必要的话,建议更换成同类型 Flash 较大的硬件平台,这样可以在软件和硬件完全不需要修改的情况下完成项目功能,达到预期目标。

你可以添加微信17775982065为好友,注明:公司+姓名,拉进 RT-Thread 官方微信交流群!

RT-Thread


让物联网终端的开发变得简单、快速,芯片的价值得到最大化发挥。Apache2.0协议,可免费在商业产品中使用,不需要公布源码,无潜在商业风险。

长按二维码,关注我们

 点击阅读原文进入官网

你点的每个“在看”,我都认真当成了喜欢

RTThreadIoTOS
关注 关注
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
博客
RT-Thread Smart正式上线:源代码已开放下载
11-19 3342
官方消息,RT-Thread Smart已正式上线,目前源代码可在Github、Gitee下载,采用Apache License 2.0。????源码下载链接:https://githu...
博客
RT-Thread Smart微内核操作系统重磅发布!开源!
09-04 2063
9月1日,由上海睿赛德电子科技有限公司举办的RT-Thread Smart微内核操作系统发布会于北京圆满落幕,发布会以“见微”为主题,邀请到中国工程院院士、产业专家、高校教授及行业从业人...
博客
【20201127期嵌入式AI周报】NanoDet 目标检测模型、移植 ncnn到 RISC-V等!
11-27 1607
导读:本期为 AI 简报 20201127 期,将为您带来 8 条相关新闻,希望对您有所帮助~一共2000+字,全篇看完需要5~7分钟1. NanoDet:轻量级(1.8MB)、超快速(...
博客
C语言、嵌入式中几个非常实用的宏技巧
11-27 968
宏打印函数 在我们的嵌入式开发中,使用printf打印一些信息是一种常用的调试手段。但是,在打印的信息量比较多的时候,就比较难知道哪些信息在哪个函数里进行打印。特别是对于异常情况的打印,...
博客
RT-Thread Smart 上手指南
11-26 1万+
RT-Thread Smart(简称rt-smart)是基于RT-Thread操作系统衍生的新分支,面向带MMU,中高端应用的芯片,例如ARM Cortex-A系列芯片,MIPS芯片,带...
博客
下载调试接口 SWD 和 JTAG的区别
11-26 2757
作为嵌入式软件工程师,下载调试器都应该知道,但你真正了解其SWD 和 JTAG接口的含义和区别吗?今天分享一篇公众号【嵌入式专栏】整理的关于 SWD 和 JTAG的文章。嵌入式专栏1什么...
博客
【0基础入门课程】实战入门柿饼UI,带你实现动感汽车仪表盘、APP Store等
11-25 1630
关于柿饼UI:柿饼UI是一款专注于嵌入式领域,由C/C++语言构建,为用户提供类安卓效果的GUI解决方案。为用户提供了设计器+JavaScript语言的开发模式,用户只需拖拽UI控件,写...
博客
宋宝华:深入理解cache对写好代码至关重要(上)
11-25 662
There are only two hard things in Computer Science: cache invalidation and naming things.-- ...
博客
【RT-Thread专题连载2】RT-Thread启动过程分析
11-24 695
本文来源:微联智控工作室在一些不使用操作系统的单片机软件工程里面,除了汇编启动文件之外,普遍认为程序入口就是main函数,很多程序代码都是从main函数开始进行分析的。而对于RT-Thr...
博客
报名有奖|相约2020 RT-Thread 开发者大会RDC
11-23 792
每年一度的 RDC (RT-Thread Developer Conference,RT-Thread 开发者大会)为众多开发者展示了 RT-Thread 的最新开发和生态建设成果,...
博客
自己动手撸个简单的LCD驱动框架吧!
11-23 1131
今天看到大佬肖遥兄分享的一篇文章:【架构篇】嵌入式编程中如何给代码的结构分层提到了高内聚,低耦合,软件分层等等的概念。之前又有小伙伴在后台留言说让我分享一篇这样的文章,所以今天它来了!废...
博客
太赞了!工程师总结的Linux笔记,提供下载
11-21 397
最近很多小伙伴找我要一些Linux 基础资料,于是我翻箱倒柜,把这份大牛总结的 Linux 归纳笔记找出来,免费共享给大家!据说有小伙伴靠这份笔记顺利进入 BAT 哦,所以一定要好好学...
博客
【20201120期嵌入式AI周报】 M1808 AI 核心板搭载5G模、嵌入式视觉应用开发详解!...
11-20 959
导读:本期为 AI 嵌入式简报 20201120 期,将为您带来 8 条相关新闻,希望对您有所帮助~今日推送干货多多,为关注嵌入式AI的你量身定制~1. 澎峰科技CEO张先轶详解利用AI...
博客
RT-Thread10月社区简报
11-18 811
1024程序员节9 大操作系统掌门人聚首长沙,针对国内操作系统的发展现状、系统软件的生态建设、未来的机遇等展开了激烈对话。大佬们普遍认为国内操作系统已经迎来了最好的发展机遇,同样群雄割据...
博客
哇哦!?固件裁剪到1.82K? 他们是怎么做到的?
11-18 812
还记得之前的挑战赛,看看谁能裁剪出最小系统!吗?我们先来回顾下目标:使用 RT-Thread( V3.1.2以上版本)的 IPC 机制实现 LED 以 1HZ 频率闪烁的功能前提下,尽可...
博客
问卷有礼| 您希望RT-Thread的软件包/组件如何优化?
11-16 588
hey~RT-Thread社区的小伙伴们相信你们都用过RT-Thread平台上的软件包/组件一直没有机会问过大家的使用体验今天,让我们敞开聊一聊吧????致亲爱的你们○RT-Thread...
博客
多款优秀的支持C、C++等多种语言的网络在线编译器
11-16 1064
作者 | strongerHuang微信公众号|嵌入式专栏作为程序员,使用编译器是必备技能,但是从入门到放弃,基本上就是在开发环境安装、配置这一步。。。大家可能体会过,使用编译器不是...
博客
2020RT-Thread开发者大会RDC来了~
11-13 2775
每年一度的 RDC (RT-Thread Developer Conference,RT-Thread 开发者大会)为众多开发者展示了 RT-Thread 的最新开发和生态建设成果,并携...
博客
RT-Thread出席紫光展锐市场峰会,首次披露PersimWear穿戴平台
11-12 1396
11月9日、10日,以“象由芯生·科技服务人民”为主题的2020紫光展锐市场峰会隆重举行,广大生态合作伙伴共聚一堂,共话数字世界新未来。作为中国集成电路设计产业的龙头企业,紫光展锐是全球...
博客
【双十一】ART-Pi 扩展板首发预售!
11-11 1915
扩展板-首发2020.11.11 coming soon1. Industry_IO1.Industry_IO新品预售¥109Industry_IO:是 ART-Pi 设计团队推出的扩...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 如何在 GitHub 上找到你要的代码? 34408
  • RT-Thread Smart 上手指南 19942
  • RT-Thread团队回应社区关切:鸿蒙OS带来的影响-合作远远大于竞争 6354
  • STM32 上使用 USB Host 读写 U 盘 6112
  • RT-Thread设备框架使用指南——ADC 设备 5995

分类专栏

  • RT-THREAD 18篇
  • IOTOS 7篇

最新评论

  • 通过 VSCode RT-Thread 插件使用 Python 为物联网系统编写程序

    羽墨青: 为什么我没有那些按钮了

  • 通过 VSCode RT-Thread 插件使用 Python 为物联网系统编写程序

    清湖水: mac下显示未搜到设备,这个是因为什么呢

  • 基于RT-Thread的蓝牙遥控平衡小车

    葳_人生_蕤: 因为我们正在准备嵌入式芯片设计竞赛,设计内容和您的比较相关,因而想要参考一下您的这个项目,故求一份源码,希望作者可以同意一下

  • RT-Thread进阶之文件系统

    爱出名的狗腿子: 引用「检查elm文件系统是否已经挂载在文件系统表中」 此处应该是检查此目录下是否挂载有文件系统,而不是检查elm是否有被挂载在文件系统中

  • RT-Thread4.0正式发布了,还支持SMP (内附源代码下载地址)

    m0_63540353: 请问方便再发一次吗?之前的网盘显示过期了,谢谢。

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • C语言、嵌入式中几个非常实用的宏技巧
  • 【20201127期嵌入式AI周报】NanoDet 目标检测模型、移植 ncnn到 RISC-V等!
  • 下载调试接口 SWD 和 JTAG的区别
2020年207篇
2019年74篇
2018年10篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司东莞seo排名深圳网站排名优化吕梁网站优化排名多少钱商丘百度seo价格佛山SEO按天扣费公司淮南模板网站建设报价飞来峡关键词排名报价宿迁网络营销价格莆田网站优化排名哪家好石家庄百度关键词包年推广公司木棉湾网络营销公司阳泉SEO按天收费价格安顺英文网站建设推荐呼和浩特网站建设设计价格德宏网站优化推广报价铜陵SEO按天计费推荐鹤壁建网站亳州百度seo公司吕梁网站设计模板哪家好黔东南网站排名优化推荐中卫百度关键词包年推广黄山品牌网站设计报价晋中百搜标王推荐鹰潭网络营销多少钱阿坝SEO按天扣费报价桂林百度竞价包年推广推荐酒泉营销网站多少钱玉溪网页设计多少钱迁安外贸网站建设价格宿迁如何制作网站公司歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化