专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

CortexM启动流程详解(Keil)

  开发环境:
  处理器:STM32F103
  MDK:5。30
  对于我们常用的桌面操作系统而言,我们在开发应用时,并不关心系统的初始化,绝大多数应用程序是在操作系统运行后才开始运行的,操作系统已经提供了一个合适的运行环境,然而对于嵌入式设备而言,在设备上电后,所有的一切都需要由开发者来设置,这里处理器是没有堆栈,没有中断,更没有外围设备,这些工作是需要软件来指定的,而且不同的CPU类型、不同大小的内存和不同种类的外设,其初始化工作都是不同的。本文将以STMF103(基于CortexM3)为例进行讲解。
  在开始正式讲解之前,你需要了解ARM寄存器、汇编以及反编译相关的知识,这些可以参考笔者博文。
  深入理解ARM寄存器:https:bruceou。blog。csdn。netarticledetails117866186
  ARM汇编入门:https:bruceou。blog。csdn。netarticledetails117897496
  Keil反编译入门(一):https:bruceou。blog。csdn。netarticledetails118314875
  Keil反编译入门(二):https:bruceou。blog。csdn。netarticledetails118400368
  下面我们就来具体看一下用户从Flash启动STM32的过程,主要讲解从上电复位到main函数的过程。主要有以下步骤:
  1。初始化堆栈指针SPinitialsp,初始化PC指针ResetHandler
  2。初始化中断向量表
  3。配置系统时钟
  4。调用C库函数main初始化用户堆栈,然后进入main函数。
  在开始讲解之前,我们需要了解STM32的启动模式。1STM32的启动模式
  首先要讲一下STM32的启动模式,因为启动模式决定了向量表的位置,STM32有三种启动模式:
  1)主闪存存储器(MainFlash)启动:从STM32内置的Flash启动(0x080000000x0807FFFF),一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。
  以0x08000000对应的内存为例,则该块内存既可以通过0x00000000操作也可以通过0x08000000操作,且都是操作的同一块内存。
  2)系统存储器(SystemMemory)启动:系统储存器指的是STM32的内置ROM,选择该启动模式后,内置ROM的起始地址将被重映射到0x00000000地址,代码在此处开始运行。ROM中有一段出厂预置的代码,这段代码起到一个桥的作用,允许外部通过UARTCAN或USB等将代码写入STM32的内置Flash中。这段代码也被称为ISP(InSystemPrograming)代码,这种烧录代码的方式也被称为ISP烧录。
  一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的ISP程序中,提供了串口下载程序的固件,可以通过这个ISP程序将用户程序下载到系统的Flash中。
  以0x1FFFFFF0对应的内存为例,则该块内存既可以通过0x00000000操作也可以通过0x1FFFFFF0操作,且都是操作的同一块内存。
  3)片上SRAM启动:从内置SRAM启动(0x200000000x3FFFFFFF),既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。SRAM只能通过0x20000000进行操作,与上述两者不同。从SRAM启动时,需要在应用程序初始化代码中重新设置向量表的位置。该方法是在STM32的内置SRAM中启动,选择该启动模式后,内置SRAM的起始地址将被重映射到0x00000000地址,代码在此处开始运行。这种模式由于烧录程序过程中不需要擦写Flash,因此速度较快,适合调试,但是掉电丢失。
  用户可以通过设置BOOT0和BOOT1的引脚电平状态,来选择复位后的启动模式。如下图所示。
  启动模式只决定程序烧录的位置,加载完程序之后会有一个重映射(映射到0x00000000地址位置);真正产生复位信号的时候,CPU还是从开始位置执行。
  值得注意的是STM32上电复位以后,代码区都是从0x00000000开始的,三种启动模式只是将各自存储空间的地址映射到0x00000000中。2STM32的启动文件分析
  因为启动过程主要是由汇编完成的,因此STM32的启动的大部分内容都是在启动文件里。笔者的启动文件是startupstm32f103xe。s,不管使用标准库还是使用HAL库,启动文件都是差不多的。
  在分析之前,先看看需要用到的汇编指令。
  指令
  作用
  EQU
  取符号名(类似Cdefine),同义词
  AREA
  指示编译器汇编一个新段(代码段或数据段)
  SPACE
  分配内存空间并填零。〔标号〕SPACE〔表达式〕,同义词
  PRESERVE8
  按8字节对齐
  EXPORT
  声明全局,可被外部文件使用,同义词GLOBAL
  DCD
  以字为单位分配内存,要求4字节对齐且初始化该内存
  PROC
  定义子程序,与ENDP成对使用,表示子程序结束同义词FUNCTION
  WEAK
  编译器特性。弱定义,优先使用外部文件定义的标号。
  IMPORT
  声明标号来自外部文件,类似于Cextern
  B
  跳转到一个标号
  ALIGN
  编译器指令,对指令或数据存放地址进行对齐(一般跟一个立即数,缺省为4字节)
  END
  EOF,文件结束
  IF,ELSE,ENDIF
  条件分支2。1堆栈定义
  1。Stack栈
  栈的作用是用于局部变量,函数调用,函数形参等的开销,栈的大小不能超过内部SRAM的大小。当程序较大时,需要修改栈的大小,不然可能会出现的HardFault的错误。
  第33行:表示开辟栈的大小为0X00000400(1KB),EQU是伪指令,相当于C中的define。这个指令并不会生产二进制程序代码,也不会引起变量空间分配。
  第35行:开辟一段可读可写数据空间,ARER伪指令表示下面将开始定义一个代码段或者数据段。此处是定义数据段。ARER后面的关键字表示这个段的属性。段名为STACK,可以任意命名;NOINIT表示不初始化;READWRITE表示可读可写,ALIGN3,表示按照8字节对齐。
  第36行:SPACE用于分配大小等于StackSize连续内存空间,单位为字节。
  第37行:initialsp表示栈顶地址。栈是由高向低生长的。
  2。Heap堆
  堆主要用来动态内存的分配,像malloc()函数申请的内存就在堆中。
  开辟堆的大小为0X00000200(512字节),名字为HEAP,NOINIT即不初始化,可读可写,8字节对齐。heapbase表示对的起始地址,heaplimit表示堆的结束地址。2。2向量表
  向量表是一个WORD(32位整数)数组,每个下标对应一种异常,该下标元素的值则是该ESR的入口地址。向量表在地址空间中的位置是可以设置的,通过NVIC中的一个重定位寄存器来指出向量表的地址。在复位后,该寄存器的值为0。因此,在地址0(即FLASH地址0)处必须包含一张向量表,用于初始时的异常分配。
  值得注意的是这里有个另类:0号类型并不是什么入口地址,而是给出了复位后MSP的初值,后面会具体讲解。
  第55行:定义一块代码段,段名字是RESET,READONLY表示只读。
  第5658行:使用EXPORT将3个标识符申明为可被外部引用,声明Vectors、VectorsEnd和VectorsSize具有全局属性。这几个变量在Keil分散加载时会用到。
  第60行:Vectors表示向量表起始地址,DCD表示分配1个4字节的空间。作用是开辟一段空间,其意义等价于C语言中的地址符。每行DCD都会生成一个4字节的二进制代码,中断向量表存放的实际上是中断服务程序的入口地址。当异常(也即是中断事件)发生时,CPU的中断系统会将相应的入口地址赋值给PC程序计数器,之后就开始执行中断服务程序。在60行之后,依次定义了中断服务程序的入口地址。
  第138行:VectorsEnd为向量表结束地址。
  第139行:VectorsSize则是向量表的大小,向量表的大小是通过Vectors和VectorsEnd相减得到的。
  上述向量表可以在《Referencemanual》中找到的,笔者这里只截取了部分。
  2。3复位程序
  复位程序是系统上电后执行的第一个程序,复位程序也是中断程序,只是这个程序比较特殊,因此单独提出来讲解。
  第145行:定义了一个服务程序,PROC表示程序的开始。
  第146行:使用EXPORT将ResetHandler申明为可被外部引用,后面WEAK表示弱定义,如果外部文件定义了该标号则首先引用该标号,如果外部文件没有声明也不会出错。这里表示复位程序可以由用户在其他文件重新实现,这种写法在HAL库中是很常见的。
  第147148行:表示该标号来自外部文件,SystemInit()是一个库函数,在systemstm32f1xx。c中定义的,main是一个标准的C库函数,主要作用是初始化堆栈(跳转userinitialstackheap标号进行初始化堆栈),并初始化映像文件,该函数最终会调用我们自己写的main函数,从而进入C世界中。
  第149行:这是一条汇编指令,表示从存储器中加载SystemInit到一个寄存器R0的地址中。R0R3寄存器通常用于函数入参出参或子程序调用。
  第150行:汇编指令,表示跳转到寄存器R0的地址,并根据寄存器的LSE确定处理器的状态,还要把跳转前的下条指令地址保存到LR。
  第151行:和149行是一个意思,表示从存储器中加载main到一个寄存器R0的地址中。
  第152行:和150稍微不同,这里跳转到至指定寄存器的地址后,不会返回。
  第153行:和PROC是对应的,表示程序的结束。
  值得注意的是,这里的main和C语言中的main()不是一样东西,main是Clib中的函数,也就是在Keil中自带的;而main()函数是C的入口,main()会被main调用。2。4中断服务程序
  我们平时要使用哪个中断,就需要编写相应的中断服务程序,只是启动文件把这些函数留出来了,但是内容都是空的,真正的中断复服务程序需要我们在外部的C文件里面重新实现,这里只是提前占了一个位置罢了。
  这部分没啥好说的,和服务程序类似的,只需要注意‘B。’语句,B表示跳转,这里跳转到一个‘。’,即表示无线循环。2。5堆栈初始化
  堆栈初始化是由一个IF条件来实现的,MICROLIB的定义与否决定了堆栈的初始化方式。
  这个定义是在OptionsTarget中设置的。
  如果没有定义MICROLIB,则会使用双段存储器模式,且声明了userinitialstackheap具有全局属性,这需要开发者自己来初始化堆栈。
  这部分也没啥讲的,需要注意的是,ALIGN表示对指令或者数据存放的地址进行对齐,缺省表示4字节对齐。2。6其他
  第50行:PRESERVE8用于指定当前文件的堆栈按照8字节对齐。
  第51行:THUMB表示后面指令兼容THUMB指令。现在CortexM系列的都使用THUMB2指令集,THUMB2是32位的,兼容16位和32位的指令,是THUMB的超集。3STM32的启动流程实例分析3。1Bootloader的作用
  根据BOOT引脚确定了启动方式后,处理器进行的第二大步就是开始从0x00000000地址处开始执行代码,而该处存放的代码正是Bootloader。
  Bootloader,也可以叫启动文件,每一种微控制器(处理器)都必须有启动文件,启动文件的作用便是负责执行微控制器从复位到开始执行main函数中间这段时间(称为启动过程)所必须进行的工作。最为常见的51,AVR或MSP430等微控制器当然也有对应启动文件,但开发环境往往自动完整地提供了这个启动文件,不需要开发人员再行干预启动过程,只需要从main函数开始进行应用程序的设计即可。同样,STM32微控制器,无论是MDK还是IAR开发环境,ST公司都提供了现成的直接可用的启动文件。
  启动文件中首先会定义堆栈,定义中断异常向量表,而其中只实现了复位的异常处理函数ResetHandler,该函数其主要功能除了初始化时钟,FPU等,还会执行一个重要功能,那就是内存的搬移、初始化操作。
  我们知道烧录的镜像文件中包含只读代码段。text,已初始化数据段。data和未初始化的或者初始化为0的数据段。bss。代码段由于是只读的,所以是可以一直放在Flash中,CPU通过总线去读取代码执行就行,但是。data段和。bss段由于会涉及读写为了,为了更高的读写效率是要一定搬到RAM中执行的,因此Bootloader会执行很重要的一步,就是会在RAM中初始化。data和。bss段,搬移或清空相应内存区域。
  当启动方式选择的是从内置Flash启动的时候,代码依旧是在Flash中执行,而数据则会被拷贝到内部SRAM中,该过程是由Bootloader完成的。Bootloader在完成这些流程之后,就会将代码交给main函数开始执行用户代码。
  有了前面的分析,接下来就来具体看看STM32启动流程的具体内容。3。3初始化SP、PC、向量表
  当系统复位后,处理器首先读取向量表中的前两个字(8个字节),第一个字存入MSP,第二个字为复位向量,也就是程序执行的起始地址。
  这里通过JFlash打开hex文件。
  硬件这时自动从0x08000000位置处读取数据赋给栈指针SP,然后自动从0x08000004位置处读取数据赋给PC,完成了复位操作,SP0x20000400,PC0x08000145。
  初始化SP、PC紧接着就初始化向量表,如果感觉看HEX文件抽象,我们看看反汇编文件吧。
  是不是更容易些,是不是和《Referencemanual》中的向量表对应起来了。其实看反汇编文件更好理解STM32的启动流程,只是有些抽象。
  生成反汇编的方法如下。
  在KEIL的User选项中,如下图添加这两项:fromelfbinoutputSTM32F103。bin。。OutputSTM32F103。axffromelftextacoutputSTM32F103。dis。。OutputSTM32F103。axf
  然后重新编译,即可得到二进制文件STM32F103。bin(以后会分析)、反汇编文件STM32F103。dis。
  如下图所示:
  3。3设置系统时钟
  细心的朋友可能发现,PC0x08000145的地址是没有对齐的。然后在反汇编文件中却是这样的:
  这里是硬件自动对齐到0x08000145,并执行SystemInit函数初始化系统时钟。
  当然也可通过硬件调试来确认上面的分析:
  接下来就会进入SystemInit函数中。
  SystemInit函数内容如下:briefSetupthemicrocontrollersystemInitializetheEmbeddedFlashInterface,thePLLandupdatetheSystemCoreClockvariable。noteThisfunctionshouldbeusedonlyafterreset。paramNoneretvalNonevoidSystemInit(void){ResettheRCCclockconfigurationtothedefaultresetstate(fordebugpurpose)SetHSIONbitRCCCR(uint32t)0x00000001;ResetSW,HPRE,PPRE1,PPRE2,ADCPREandMCObitsifndefSTM32F10XCLRCCCFGR(uint32t)0xF8FF0000;elseRCCCFGR(uint32t)0xF0FF0000;endifSTM32F10XCLResetHSEON,CSSONandPLLONbitsRCCCR(uint32t)0xFEF6FFFF;ResetHSEBYPbitRCCCR(uint32t)0xFFFBFFFF;ResetPLLSRC,PLLXTPRE,PLLMULandUSBPREOTGFSPREbitsRCCCFGR(uint32t)0xFF80FFFF;ifdefSTM32F10XCLResetPLL2ONandPLL3ONbitsRCCCR(uint32t)0xEBFFFFFF;DisableallinterruptsandclearpendingbitsRCCCIR0x00FF0000;ResetCFGR2registerRCCCFGR20x00000000;elifdefined(STM32F10XLDVL)defined(STM32F10XMDVL)(definedSTM32F10XHDVL)DisableallinterruptsandclearpendingbitsRCCCIR0x009F0000;ResetCFGR2registerRCCCFGR20x00000000;elseDisableallinterruptsandclearpendingbitsRCCCIR0x009F0000;endifSTM32F10XCLifdefined(STM32F10XHD)(definedSTM32F10XXL)(definedSTM32F10XHDVL)ifdefDATAINExtSRAMSystemInitExtMemCtl();endifDATAINExtSRAMendifConfiguretheSystemclockfrequency,HCLK,PCLK2andPCLK1prescalersConfiguretheFlashLatencycyclesandenableprefetchbufferSetSysClock();ifdefVECTTABSRAMSCBVTORSRAMBASEVECTTABOFFSET;VectorTableRelocationinInternalSRAM。elseSCBVTORFLASHBASEVECTTABOFFSET;VectorTableRelocationinInternalFLASH。endif}
  前面部分是配置时钟的,具体参考手册吧。
  SetSysClock()函数主要配置的时钟系数,笔者使用的MCU是STM32F103ZE,因此对应的时钟配置参数如下。briefSetsSystemclockfrequencyto72MHzandconfigureHCLK,PCLK2andPCLK1prescalers。noteThisfunctionshouldbeusedonlyafterreset。paramNoneretvalNonestaticvoidSetSysClockTo72(void){IOuint32tStartUpCounter0,HSEStatus0;SYSCLK,HCLK,PCLK2andPCLK1configurationEnableHSERCCCR((uint32t)RCCCRHSEON);WaittillHSEisreadyandifTimeoutisreachedexitdo{HSEStatusRCCCRRCCCRHSERDY;StartUpCounter;}while((HSEStatus0)(StartUpCounter!HSESTARTUPTIMEOUT));if((RCCCRRCCCRHSERDY)!RESET){HSEStatus(uint32t)0x01;}else{HSEStatus(uint32t)0x00;}if(HSEStatus(uint32t)0x01){EnablePrefetchBufferFLASHACRFLASHACRPRFTBE;Flash2waitstateFLASHACR(uint32t)((uint32t)FLASHACRLATENCY);FLASHACR(uint32t)FLASHACRLATENCY2;HCLKSYSCLKRCCCFGR(uint32t)RCCCFGRHPREDIV1;PCLK2HCLKRCCCFGR(uint32t)RCCCFGRPPRE2DIV1;PCLK1HCLKRCCCFGR(uint32t)RCCCFGRPPRE1DIV2;ifdefSTM32F10XCLConfigurePLLsPLL2configuration:PLL2CLK(HSE5)840MHzPREDIV1configuration:PREDIV1CLKPLL258MHzRCCCFGR2(uint32t)(RCCCFGR2PREDIV2RCCCFGR2PLL2MULRCCCFGR2PREDIV1RCCCFGR2PREDIV1SRC);RCCCFGR2(uint32t)(RCCCFGR2PREDIV2DIV5RCCCFGR2PLL2MUL8RCCCFGR2PREDIV1SRCPLL2RCCCFGR2PREDIV1DIV5);EnablePLL2RCCCRRCCCRPLL2ON;WaittillPLL2isreadywhile((RCCCRRCCCRPLL2RDY)0){}PLLconfiguration:PLLCLKPREDIV1972MHzRCCCFGR(uint32t)(RCCCFGRPLLXTPRERCCCFGRPLLSRCRCCCFGRPLLMULL);RCCCFGR(uint32t)(RCCCFGRPLLXTPREPREDIV1RCCCFGRPLLSRCPREDIV1RCCCFGRPLLMULL9);elsePLLconfiguration:PLLCLKHSE972MHzRCCCFGR(uint32t)((uint32t)(RCCCFGRPLLSRCRCCCFGRPLLXTPRERCCCFGRPLLMULL));RCCCFGR(uint32t)(RCCCFGRPLLSRCHSERCCCFGRPLLMULL9);endifSTM32F10XCLEnablePLLRCCCRRCCCRPLLON;WaittillPLLisreadywhile((RCCCRRCCCRPLLRDY)0){}SelectPLLassystemclocksourceRCCCFGR(uint32t)((uint32t)(RCCCFGRSW));RCCCFGR(uint32t)RCCCFGRSWPLL;WaittillPLLisusedassystemclocksourcewhile((RCCCFGR(uint32t)RCCCFGRSWS)!(uint32t)0x08){}}else{IfHSEfailstostartup,theapplicationwillhavewrongclockconfiguration。Usercanaddheresomecodetodealwiththiserror}}
  SetSysClockTo72()函数配置了各个参数,最终PLL的时钟位72MHz。
  这里还需要注意以下代码:ifdefVECTTABSRAMSCBVTORSRAMBASEVECTTABOFFSET;VectorTableRelocationinInternalSRAM。elseSCBVTORFLASHBASEVECTTABOFFSET;VectorTableRelocationinInternalFLASH。endif
  默认是没有开启VECTTABSRAM,则从FLASH中启动,VTOR寄存器存放的是中断向量表的起始地址,在IAP升级会修改这里的偏移量,后面讲解IAP升级在细讲吧。3。4初始化堆栈并进入main
  执行指令LDRR0,main,然后就跳转到main程序段运行,当然这里指标准库的main函数。
  这中间初始化了栈区。
  这段代码是个循环(BCC0x0800016e),实际运行时候循环了两次。第一次运行的时候,读取加载数据段的函数的地址并跳转到该函数处运行(注意加载已初始化数据段和未初始化数据段用的是同一个函数);第二次运行的时候,读取初始化栈的函数的地址并跳转到该函数处运行。
  最后就进入C文件的main函数中,至此,启动过程到此结束。
  最后,总结下STM32从flash的启动流程。
  MCU上电后从0x08000000处读取栈顶地址并保存,然后从0x08000004读取中断向量表的起始地址,这就是复位程序的入口地址,接着跳转到复位程序入口处,初始向量表,然后设置时钟,设置堆栈,最后跳转到C空间的main函数,即进入用户程序。

怎么养好头发?这12点要多留意怎么样好头发?按照这12点做,头发变多不是梦!1戒糖戒油忌吃油腻燥热食物(肥肉油炸食品),忌吃太多糖和脂肪丰富的食物,如肝类奶油巧克力洋葱等食物。2避免太阳暴晒多注意防晒,保护头发厦门一公司支持为爱勇士拒录山东服装学院学生?劳动部门发声11月10日,山东服装职业学院,一男子为爱翻墙行为引发网友的热议,其各种网传消息也不胫而走。14日,潇湘晨报(报料微信xxcbbaoliao)记者发现,在福建,一家名为厦门美速达国厕所也可以成为学校的景点厕所也可以成为学校的景点王营(特约评论员)美丽而伟大的厕所,在孩子们共同设计下,终于初具成型。不久前,杭州西湖小学教育集团紫萱小学校区校长张冠军忍不住在朋友圈内晒起了学校的厕所,他中华帝制两千年,这些皇帝的死法一个比一个奇葩导语中国上下五千年历史,经历了许许多多的朝代,也产生了很多位皇帝,这些皇帝作为最高的统治者,享尽荣华富贵,坐拥后宫佳丽三千。许多人都羡慕他们的位置,但殊不知,皇帝这个职业也算是一种明朝奇葩皇帝之木匠皇帝朱由校木匠皇帝明熹宗朱由校,明朝第十五位皇帝,明光宗朱常洛长子。奇葩事集锦一重用大太监魏忠贤。明熹宗朱由校即位之初,就封乳母客氏为奉圣夫人,东林党人担心客氏干政,按例赶客氏出宫。后大太监湖南师范大学校地合作基地落户张家界桑植县来源华声在线华声在线11月13日讯(通讯员贺凯健)近日,湖南师范大学与张家界桑植县校地合作基地正式落户桑植。双方将展开深度合作,通过建设长征国家文化公园桑植研究基地长征国家文化公园教育最现实最有用的规律先管住学生当教育把学生当做一件珍贵的文物,不敢摸不敢碰,更不敢去修理,只能用眼睛看的时候,我想,这样的教育肯定是失败的教育。为什么呢?因为教育教学中有一条古今中外的教育都必须遵循的规律要教育适合学生党的千元机,这6款配置强高颜值,用到毕业没问题对于学生党来说,选手机不但看中手机本身的质量,同时颜值与性价比也是很重要的因素。手机不仅仅只是通讯工具,和家人视频拍照记录生活上网课游戏开黑等都离不开手机,所以学生党对手机的要求很散文意境初冬,如诗如画作者子墨绝爱初冬万瓦霜。初冬的世界,也是霜落的时节,拂面而来的北风,刚刚有个寒冷的苗头,尚不凌冽,也不狂躁。院子里,陆陆续续有各种美丽的树叶,一片一片落下,形状各异,颜色各异,也算长期喝茶,到底是养生还是养癌?实验揭露真相,涨知识了茶叶,是一种以茶树新梢上的嫩叶,或者嫩芽,为原料进行加工制作而成的饮品,茶叶的种类分为绿茶黄茶乌龙茶红茶黑茶白茶等。喝茶是很多人的习惯,并且有些人喜欢通过喝茶养生。我们不否认喝茶确两性交往,男女之间出现这些行为,关系多半都会越界前言在两性交往的过程当中,有很多事儿真的不是我们想的那么简单,我们要明白男女之间的关系在很多时候需要保持一定的距离,特别是已经结婚之后,不到万不得已尽量不要接触,不然的话你的生活会
海贼王1054话绿牛是森森果实,萨博没死,香克斯来和之国等了一个多月,海贼王漫画第1054话情报出来了,这一话除了介绍绿牛的行动外,还给我们揭晓了绿牛的果实名字,另外还有萨博的事情也已经公布了,之前报道的死的人并不是萨博,至于具体情况,四川省诗书画院创作成果福建交流展举办东南网7月20日讯(本网记者傅心婕见习记者冯韵)7月18日,由四川省诗书画院福建省画院共同主办的四川省诗书画院创作成果福建交流展于福建省画院正式开幕。福建省文联党组书记王秋梅,福建东亚杯中国队03负于韩国,技不如人正视差距东亚杯中国队03负于韩国。其实这早在意料之中,毕竟实力本来就相差许多,没出惨案已经不错。这场比赛,年轻球员表现出了拼劲,但无奈确实技不如人!上场球员中,戴伟浚表现出高出同队员一等。夏日微凉,青岛相见,带着童心去旅行,享受小资文艺的浪漫夏天夏天,是一种颜色。青岛的夏天是什么颜色的呢?青岛的夏天是蓝色的,石老人海水浴场的碧海蓝天,是孩子们最爱的乐园。青岛的夏天是红色的,五四广场,五月的风带来海风的消息。青岛的夏天是绿色国羽3项决赛全输丢冠!王祉怡不敌辛杜,黄鸭输泰国女双不敌印尼7月17日下午,2022年世界羽联巡回赛超级500新加坡公开赛进入决赛争夺,第二场混双决赛中,国羽的黄鸭组合王懿律黄东萍对决泰国组合德差波沙西丽,最终两人状态不佳,以1221172加倍购买低价石油,自产原油高价出口,沙特坐享渔翁之利?鹬蚌相争,渔人得利,聪明的沙特人,用神一般操作告诉我们,钱还可以这样赚。一直以来,得益于国内丰富的油气资源,沙特阿拉伯王国都是石油出口大国,在世界上有着举足轻重的地位,很多国家都是7年前,北京富商娶泰国人妖皇后,为她花500万买别墅,后悔吗2015年在泰国曼谷,举行了一场特殊的跨国婚礼。新郎是来自中国的北京富商鲍玺,新娘是泰国人妖妮莎。婚礼尊重了妮莎的意愿,按照泰国的仪式举行。婚礼当天,妮莎身穿缎面泰式长裙,身姿曼妙冰箱空调大降价第二波,中高端家电跳水1000以上,预算不高也能冲天气逐渐高温已经入伏了,但是一年之中最炎热潮湿的中伏时期还没驾到,很多朋友表示快遭不住了。还好618家电大促之后推出第二波跳水降价,冰箱空调等夏季常用家电的优惠都非常多,个别中高端2013年湖南女子执意嫁72岁老人,遭家人反对,婚后喜得贵子2013年4月17日,湖南省长沙市宁乡县婚姻登记处迎来了一对特殊的夫妇。新娘张凤26岁,挺着大肚。新郎文长林71岁,白发胡须。注册填表时,文长林一脸紧张,连续写错两次字。有时候周围乌克兰的手段越来越极端,对本国核电站发动袭击,想制造核爆炸?参考消息网援引俄媒消息称,扎波罗热州军民行政机构表示,三架乌军的自杀式无人机袭击了扎波罗热核电站所在区域,目前大火已经被扑灭,反应堆没有受到破坏,也没有发生辐射泄漏事故。初步判断,吸毒男星高调复出拿影帝,14亿网友滚这可能是2022年最魔幻的事昔日吸毒坐牢的劣迹艺人,如今摇身一变成了影帝。最近,昔日的某个吸毒明星在台北电影节获奖了。一边惊讶于台湾的宽容度,一边又对微博下面的评论感到离谱抛开吸毒
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网