浅谈嵌入式MCU软件开发之S32K1xx系列MCU启动过程及重映射代码到RAM中运行方法详解

4 篇文章 17 订阅
订阅专栏

内容提要

注:本文摘自NXP工程师胡恩伟的微信公众号"汽车电子expert成长之路",大家感兴趣可以关注一下。

引言

1. S32K1xx系列MCU启动过程详解(startup_S32K144.S)

① 关闭CPU全局中断

②清零CPU内核寄存器R1~R12

③初始化SRAM的ECC

④初始化堆栈

⑤系统初始化

⑥RAM初始化

⑦打开CPU全局中断

⑧跳转到应用程序main()函数

2. 重映射代码/函数到RAM中运行的方法和步骤

①分析应用工程链接文件(S32K144_64_flash.ld)

②将想要重映射的代码/函数通过__attribute__ ((section(".code_ram")))指定到.code_ram段

③在应用工程编译结果map文件中查看重映射结果

Tips:需要注意是关键词-- __attribute__ ((section(".code_ram"))) 添加的位置,每个需要指定的函数都要添加这个关键词,因此,可以将其定义为一个宏比如CODE_RAM使用:

总结

 

    引言

 

之前,在我的公众号文章中已经介绍了如何在CodeWarrior 5.x IDE(方法适用于S08、S12(X)以及MagniV S12Z系列MCU)以及S32DS for Power IDE(方法适用于Qorivva MPC57xx和S32R系列MCU)中如何实现用户代码重映射(remap)到RAM中运行,具体请参考如下文章(直接点击文章标题即可跳转阅读):

浅谈嵌入式MCU软件开发之startup过程详解(在CodeWarrior 5.1 中实现RAM自定义初始化)》;

《 浅谈嵌入式MCU软件开发之startup过程详解(从复位向量到main函数之前的准备工作)》;

《 S32DS使用Tips--S32DS for Power V1.2 链接文件和启动过程详解》;

《 CodeWarrior IDE使用Tips之如何通过prm文件指定汇编代码函数、全局变量和常量的储存地址》

 

最近很多读者朋友问我在S32DS for ARM IDE中如何才能把S32K1xx系列MCU的应用工程的用户代码重映射到RAM中运行?

 

为此,本文将以S32DS for ARM v2018.R1中基于S32K14x SDK v1.9的S32K144应用工程为例,详细介绍S32K1xx系列MCU启动过程及重映射代码到RAM中运行的具体方法和详细步骤。

 

 

Tips:本文介绍使用的SDK版本为S32 SDK S32K14x BETA 1.9.0,请大家到NXP官网下载安装:

 

Tips:在S32DS for ARM v2018.R1 IDE中,新建工程时,需要选择Toolchain为ARM Bare-Metal 32-bit Target Binary Toolchain(其使用的编译器为GCC v.6.3),才能选择和使用S32 SDK S32K14x BETA 1.9.0:

 

 

默认的Toolchain为Standard S32DS toolchain for ARM,其使用的编译器为GCC v.4.9:

 

 

1. S32K1xx系列MCU启动过程详解(startup_S32K144.S)

 

由于S32K1xx系列MCU都是使用的ARM Cortex M系列内核,其SRAM和Flash使用同样的IP,它们的启动过程都是相同的,只是SRAM和Flash的memory大小不同。所以这里仅以S32K144为例进行介绍。

 

在S32DS for ARM v2018.R1 IDE中新建的S32K144应用工程如下,在其工程浏览器(Project Explorer)窗口中Project_Settings-->Startup_Code目录下的存放着整个工程的启动文件----startup_S32K144.S:

 

 

通过阅读这个启动文件,可以知道每次MCU复位后,从其复位向量--Reset_Handler开始运行到用户程序的main()函数之前,CPU启动过程还做了如下准备工作:

 

① 关闭CPU全局中断

 

通过汇编指令“cpsid   i”,关闭CPU全局中断的目的是避免启动过程中中断的影响;因为此时中断向量表还未建立好,无法响应外设中断;

 

②清零CPU内核寄存器R1~R12

 

每次复位后,CPU内核寄存器的值是随机不确定的,所以需要将其清零;

 

③初始化SRAM的ECC

 

由于S32K1xx系列MCU除4KB FlexRAM外的SRAM带有ECC功能,所以必须在使用之前对其进入任意写操作以产生正确的ECC结果,从而完成ECC初始化;

 

④初始化堆栈

 

ARM Cortex M系列CPU内核有MSP和PSP两个32-bit的堆栈,由于中断和异常处理时使用MSP所以必须在发生中断/异常之前将其初始化,其初始化值来自默认向量表的0地址偏移,即0x0000地址存放的4个字节;

 

⑤系统初始化

 

在完成了以上堆栈初始化之后,CPU就可以运行C代码了,所以此时通过调用定义在工程SDK-->platform-->device-->S32K144-->startup目录下的system_S32K144.c中的系统初始化函数--SystemInit():

 

根据工程配置完成:①CPU内核FPU配置和使能(如果创建应用工程时选择浮点数运算使用硬件FPU)、②关闭看门狗(默认配置)和③使能CPU内核指令缓冲(I-Cache)等MCU硬件平台配置:

 

 

Tips:system_S32K144.c是按照ARM Cortex M系列MCU的软件接口标准--CMSIS实现的,在任意基于ARM Cortex M系列内核的MCU软件SDK中都有相同的函数,除了以上介绍的MCU硬件平台初始化函数SystemInit()外,还包含MCU系统时钟更新API函数--SystemCoreClockUpdate()和MCU软件复位API函数--SystemSoftwareReset():

 

 

 

⑥RAM初始化

 

接下来,启动文件会调用定义在SDK-->platform-->devices目录下startup.c中的init_data_bss()函数完成应用工程运行所需的RAM初始化:

 

 

在startup.c中通过申明外部变量(extern)的方式,可以引用定义在工程链接文件中的__DATA_ROM、__DATA_RAM、__DATA_END、__CODE_RAM、__CODE_ROM、__CODE_END、__BSS_START和__BSS_END符号,获得工程链接结果中.data段(有初始化值)、.bss段(未初始化和初始化值为0)的全局变量以及重定向到RAM中运行的.code段代码/函数在Flash和RAM中的起始地址和长度(结束地址-开始地址):

 

 

然后再通过数据指针的方式实现全局变量初始化值和重映射代码从Flash到RAM中的拷贝以及.bss段的清零:

 

具体包括:①初始化.data段、②初始化.code段、③初始化.bss段,以及④将中断向量表从Flash拷贝到RAM中并⑤初始化CPU系统中断向量偏移地址,使其指向RAM中新的中断向量表(如果编译目标为debug,编译结果存储在Flash中):

 

 

⑦打开CPU全局中断

 

在完成RAM初始化和中断向量表初始化后,就可以打开CPU全局中断,响应外设中断了;

 

打开ARM Cortex M系列CPU内核的全局中断通过汇编语句--“cpsie   i”完成。

 

⑧跳转到应用程序main()函数

 

在完成以上准备工作之后,启动过程的最后一步是跳转到应用程序main()函数;

 

2. 重映射代码/函数到RAM中运行的方法和步骤

 

通过上面的分析可知,在S32K1xx系列MCU的启动过程,会自动将定义在.code段中的代码/函数从其Flash储存地址拷贝到RAM中的运行时地址。

 

①分析应用工程链接文件(S32K144_64_flash.ld)

 

具体来看在应用工程的连接文件中,对.code段的定义如下 :

 

 

Tips:只有将用户代码分配到Flash中的编译目标,即使用S32K1xx_xx_flash.ld链接文件的编译目标才存在代码重映射。若是将应用工程编译结果代码分配到RAM的编译目标(使用S32K1xx_xx_ram.ld链接文件),其编译的函数/代码本身就是储存在RAM中的,所以无需重映射。

 

②将想要重映射的代码/函数通过__attribute__ ((section(".code_ram")))指定到.code_ram段

 

由于在应用工程链接文件中已经将用户段.code_ram放置在了.code段中,所以,我们只需要在C代码中,将想要重映射的代码/函数通过__attribute__ ((section(".code_ram")))指定到.code_ram段即可。

 

比如下面就是将main()函数指定到.code_ram段的具体实现:

 

int __attribute__ ((section(".code_ram"))) main(void)

 

 

 

③在应用工程编译结果map文件中查看重映射结果

 

完成以上指定后,重新编译应用工程即可在应用工程的编译结果map文件中看到main()函数已经被成功重定向了,其长度为0x20字节,在Flash中的存储地址(也称作加载地址--load address)为0x000005bc,而在RAM中的重映射运行时地址为0x1fff8404:

 

 

Tips:在S32DS IDE应用工程中,一个函数若没有特别指定,其将分配到.text代码段,如果没特别指定(默认情况下)的main()函数编译结果如下:

 

 

 

Tips:需要注意是关键词-- __attribute__ ((section(".code_ram"))) 添加的位置,每个需要指定的函数都要添加这个关键词,因此,可以将其定义为一个宏比如CODE_RAM使用:

 

#define  CODE_RAM  __attribute__ ((section(".code_ram")))

 

然后,再将CODE_RAM放在定义的函数名前即可;

 

比如demo工程中,将CodeRemapToRAM.c中的delay_ms()、Toggle_Onboard_LED()和System_Clock_and_Pinmux_Config()三个函数通过指定到.code_ram段:

 

 

这样重新编译demo工程即可看到重映射的结果如下:

 

 

总结

 

本文详细介绍了S32K1xx系列MCU的启动过程和重映射代码/函数到RAM的方法和步骤,希望对大家有所帮助。

 

为了方便大家学习,现将S32K1xx系列MCU的启动过程流程图整理如下:

S32K1xx系列MCU应用指南之EEPROM模块使用详解.pdf
01-06
“本应用笔记主要介绍 S32K1xx EEPROM 功能特性和用法。 S32K1xx EEPROM 允许用户将片上某些 Flash 全部或部分配置为模拟 EEPROM。”【本笔记来源于网络,如侵权请告知删除。】
S32K1xx 系列 MCU 应用指南之 CSEc 硬件加密模块使用手册
09-16
S32K1xx 系列 MCU 应用指南之 CSEc 硬件加密模块使用手册 S32K1xx 的 CSEc 模块是一个硬件加密模块, 全称 Cryptographic Service Engine – Compressed, 符合HIS-SHE specification 1.1 rev 439 和 GM-SHE+ 安全...
S32K3学习笔记—链接文件及启动代码相关
Abler_xaing的博客
10-22 3012
S32K3启动文件及链接文件相关
mcu 芯片的启动过程
最新发布
ygyglg的专栏
04-09 366
MCU(微控制器单元)的启动过程,也称为引导或启动序列,是微控制器从上电状态到开始执行用户程序的过程。
S32DS IDE使用Tips--参考汽车电子expert成长之路
woshizuopie的博客
01-24 1万+
①S32 DS IDE for Arm®:面向S32K1、S32V、KEA和MAC57D54H器件的集成开发环境(IDE); ②S32 DS IDE for Power Architecture®:面向S32R、MPC57xx和MPC56xx器件的集成开发环境(IDE); ③S32 DS IDE for Vision:面向S32V的集成开发环境(IDE); ④S32 DS:面向S32平台和S32V的集成开发环境(IDE)。 PEMicro系列调试器包括以下接口类型: USB Multilink/FX, O.
小猫爪:S32K3学习笔记01-S32K3 RTD【MCAL&SDK】的使用和环境搭建
热门推荐
Oushuwen的博客
09-08 2万+
S32K3学习笔记01-SDK&MCAL开发环境搭建1 前言2 准备工作3 安装3.1 安装EB3.2 安装MCAL3.2 安装S32DS4 SDK开发示例4.1 SDK包安装4.2 导入一个Demo4.3 新建一个工程5 MCAL开发示例5.1 MCAL软件包组成5.2 通过EB配置MCAL并生成代码5.3 编译配套的MCAL Demo 1 前言   NXP最近又推出了新的GPIS系列MCU S32K3,也就是S32K1的升级版,虽然是升级版,但是性能提升的不是一点半点,那是贼凶啊,接下来一段时刻
S32K1xx SDK(版本:S32_SDK_S32K1xx_RTM_4.0.3 )详细介绍
luobeihai的博客
07-23 2405
下面是引用自NXP官网对S32K1xx SDK的介绍:S32K1的S32软件开发工具包(SDK)提供了性价比高且使用便捷的完整解决方案,可与S32K1整个系列微控制器的连接、电机控制和安全库堆栈相匹配。S32K1系列的S32SDK非常适合汽车领域的所有应用。特征包含在S32 Design StudioProcessor Expert图形配置集成的恩智浦软件:电机控制库(AMMCLib)、结构核心自检(sCST)、SBC间件。
cmake编译S32K144的bin文件(1)
weixin_45482959的博客
07-16 871
一、软件安装 S32DS软件功能强大,但太过复杂,编译时间长,打开慢,本人遇到过许多坑,在大佬的指点下搭建vscode+cmake+arm-none-eabi的编译环境,编译时间短,方便快捷。 1 vscode安装 2 gnu arm安装 下载地址 https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm 安装,主要是要将软件加入环境变量,也可以通过
S32K1xx系列MCU应用指南之WDOG看门狗模块使用详解.pdf
03-13
STM32 独立看门狗和窗口看门狗 使用说明
S32K1xx系列MCU应用指南之CSEc硬件加密模块使用手册_v2.2.pdf
11-11
该文档详细描述了CSEC功能,并且描述了相关寄存器的操作方法,对于S32K的内部加密的使用有很大帮助
S32K1xx MCU Family Reference Manual (REV 9).pdf
02-13
S32K1xx Series Reference Manual Supports S32K116, S32K118, S32K142, S32K144, S32K146, and S32K148
S32K144基于S32DS2018开发环境的启动文件/链接脚本详细分析
01-16
自己详细总结启动文件和连接脚本的分析,很详细,结合工程的实际地址数据来分析,可以很清楚的知道工作流程;
S32K144带bootload的运行过程
此处的彼声的博客
01-04 1463
S32K144带bootload的运行过程
未初始化全局变量
liuqiaoyu080512的专栏
12-31 1万+
未初始化全局变量   为下一篇介绍进程内存分布做准备,这一篇先来介绍一下未初始化全局变量:   未初始化全局变量,这名字就很直白,就是 C 程序定义成全局作用域而又没有初始化的变量,我们知道这种变量在程序运行后是被自动初始化为 全0 的。编译器编译的时候会将这类变量收集起来集放置到 .bss 段,这个段只记录了段长,没有实际上的内容(全是0,没必要存储),在程序被装载时操作系统会为它分
S32K1XX系列单片机 ——用Keil编译官方提供的AUTOSAR OS
weixin_42967006的博客
12-14 4168
1. 概述 NXP官方提供了AUTOSAR OS代码,并且可以用EB进行配置,但官方的例程不能直接适用于Keil,本文就来介绍下如何在Keil上编译官方的AUTOSAR OS源码。 之前我们已经介绍过如何在Keil上编译S32系列的MCAL,需要的朋友可以翻一下我之前的文章,本文默认在Keil上已经可以编译调试S32的MCAL(只需要Port和Dio这俩基础模块)。 2. AUTOSAR OS的安装 可以从下面的连接下载NXP提供的AUTOSAR OS,如果要结合MCAL一起用的话,也要同时下载相同AUTO
NXP S32K3xx Fast Wakeup 与 Normal Wakeup 的区别与配置
HeFlyYoung的博客
04-17 1064
fast wake起来,我们需要定义一个向量表,让代码从这里开始执行,0x20408000为栈地址的开始,然后我们可以定义一个用户函数FastWkup_EntryAddress,来执行一些比较紧急的事,比如发送个CAN报文出去(需要直接操作寄存器,初始化CAN,因为这个时候什么都还没有初始化),还包括失能pad keeping功能,改变时钟为FIRC等。对于fast wakeup的配置,在S32K3的SDK前期的版本是通过直接写寄存器配置的,而非使用EB生成。跳转到正常的MCU启动代码,重新开始。
S32DS for ARM 2018.R1 链接文件(linker file)学习笔记
北极熊的脖子(16605192620@163.com)
03-24 6018
S32DS for ARM 2018.R1 链接文件(linker file)学习笔记 在S32DS for ARM 2018.R1自带的例程有两个链接文件,分别为S32K1xx_flash.ld和S32K1xx_ram.ld,前者针对的是程序在flash运行的链接文件,后者是在ram运行程序所需要的链接文件。以下以S32K144的flash.ld文件为例,进行简单的分析 /* Entry ...
S32DS.ld(链接)文件学习
studyingdda的博客
06-28 7695
程序代码(.s 和 .c)源文件会经过预编译、编译、汇编、链接最后生成目标可执行文件,.ld文件是作用在链接过程。链接的作用是:合并各个.obj文件的section,合并符号表,进行符号解析;符号地址重定位;生成可执行文件。linker_flash.ld:Flash和SRAM内存分配,为Flash构建目标分配代码段和数据段;linker_ram.ld:SRAM内存分配,为RAM构建目标分配代码段和数据段。可以利用.ld文件将函数和变量放置到自定义的地址。ENTRY命令:运行一个程序时第一个被执行到的指令的
S32K144-使用EB MCAL配置 Keil开发、编译、烧录 过程遇到的若干问题
小胡同学的工程师学习之路
03-26 1641
具体的环境搭建流程,这里不再多说,需要的可以参考下面的博客:http://t.csdn.cn/rkCFO下面是我在测试过程遇到的一些问题:因为S32K144官网是有DFP包的,所以我们直接下载安装,然后新建S32K144工程,勾选动态库就可以了。进入DFP安装目录,这两个文件就是启动文件:然后在keil配置里,选它就好按照惯例,自己用什么模块,就拷贝对应的文件夹就行因为没有OS,所以咱们需要SchM来配合进行管理,但你会发现现在的MCAL包里没有这个文件夹。因为现在这些东西都被放在了Rte_TS_T40
s32k1xx 系列 mcu 应用指南之 eeprom 模块使用详解
05-13
S32K1XX系列MCU是一款高性能、低功耗的微控制器,内置EEPROM模块,用于数据的存储和读取。本文将详细介绍S32K1XX系列MCU的EEPROM模块的使用方法。 EEPROM是一种可编程的非易失性存储器,其在MCU应用广泛使用。S32K1XX系列MCU的EEPROM模块提供了一个4K字节的存储单元。此外,它还提供了读、写、擦除和锁定等操作。 使用EEPROM模块需要注意以下几点: 1. 写入前需要将所需数据写入至特定的寄存器,如EEPROM_MCR和EEPROM_EEAR。 2. 写入数据时需要使用修正字节,可通过EEPROM_EPAR对应的修正字节寄存器进行设置。 3. 在执行写入或擦除操作前,需要先进行解锁操作,否则将会出现错误。 4. EEPROM模块具有擦除次数限制,谨慎使用擦除操作。 5. 可以通过EEPROM_EESIZE寄存器对EEPROM模块进行分区,减少擦除的次数。 6. 为了保证数据的安全性,可以使用EEPROM_EPOPUP和EEPROM_ELOCK寄存器进行保护设置。 在实际应用,可以根据需要选择使用S32K1XX系列MCU的EEPROM模块。对于需要频繁写入、读取和保存数据的应用场景,使用EEPROM模块不仅具有高效性能和低功耗特性,还能有效减少外接存储器的占用空间和成本。

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

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

热门文章

  • #define用法集锦(非常全) 81556
  • c语言程序设计流程图详解 78133
  • CAN BusOff相关知识点 48109
  • 细说汽车电子通信总线之LIN总线协议详解 30994
  • CAPL 编程实例 30833

分类专栏

  • CP Autosar Configuration 付费 18篇
  • MATLAB&Simulink 付费 18篇
  • 汽车功能安全(FUSA) 5篇
  • 信息安全(Cyber Security) 18篇
  • 智能驾驶 13篇
  • Aurix2G TC3xx芯片模块详解 11篇
  • Adaptive Autosar 15篇
  • google test 6篇
  • QNX操作系统
  • UDS 8篇
  • CANoe&CAPL 23篇
  • MQTT 1篇
  • bootloader 6篇
  • 计算机视觉 5篇
  • AutoSar Module Introduction 45篇
  • FreeRTOS 3篇
  • Golang 6篇
  • JavaSe 1篇
  • 算法 24篇
  • C 36篇
  • STM32/STM8 8篇
  • C51 3篇
  • 工作随笔 9篇
  • C++ 5篇
  • 硬件 7篇
  • Android 1篇
  • Linux 11篇
  • 车载总线 8篇
  • Python 7篇
  • 其他 10篇
  • UML/SYSML 3篇
  • 数学基础 2篇
  • NXP 4篇

最新评论

  • 英飞凌Aurix2G TC3XX EVADC模块详解

    king110108: 不就是EB吗?

  • 英飞凌Aurix2G TC3XX EVADC模块详解

    月下无人江自流: 请教一下,配置用到的软件是什么?英飞凌官方的吗?名称是? 谢谢!

  • Autosar Configuration(十七)以太网诊断DoIP配置

    king110108: 你方便把你的配置错误截图出来看下吗?

  • Autosar Configuration(十七)以太网诊断DoIP配置

    king110108: 可以自行定义的

  • Autosar Configuration(十七)以太网诊断DoIP配置

    king110108: 晚上我看下配置,再回复你

大家在看

  • 【多种改进粒子群算法进行比较】基于启发式算法的深度神经网络卸载策略研究【边缘计算】(Matlab代码实现)
  • 考虑灵活性供需平衡的电力系统优化调度模型研究(Matlab代码实现)
  • Langchain的向量存储 - Document示例代码里的疑问
  • springboot网上商城购物系统
  • 基于人工神经网络(ANN)的高斯白噪声的系统识别(Matlab代码实现)

最新文章

  • 基于功能安全的示例AUTOSAR软件系统
  • AUTOSAR的四种功能安全机制
  • 功能安全之通用软件安全要求
2024年28篇
2023年57篇
2022年46篇
2021年52篇
2020年15篇
2019年24篇
2018年37篇
2017年32篇
2016年21篇
2015年19篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

PHP网站源码文山阿里店铺运营推荐红河网站优化排名哪家好揭阳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次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化