当前位置: 首页 > news >正文

一个虚拟主机可以做几个网站网站推广途径有哪些

一个虚拟主机可以做几个网站,网站推广途径有哪些,深圳企业网站建设价格,wordpress主体开源多少钱笔者在接着聊一下bootloader#xff0c;主要针对MCU的Bootloader。 笔者之前介绍过一篇Bootloader文章#xff0c;主要是其概念、一些升级包的格式和升级流程#xff0c;本次接着来说一下。 1、MCU代码运行方式 之前文章也介绍过#xff0c;MCU的代码运行方式有两种… 笔者在接着聊一下bootloader主要针对MCU的Bootloader。 笔者之前介绍过一篇Bootloader文章主要是其概念、一些升级包的格式和升级流程本次接着来说一下。 1、MCU代码运行方式 之前文章也介绍过MCU的代码运行方式有两种 XIP方式Excute In Place在位置上执行即在存储地址上执行代码如果是这样则对存储芯片有要求则要求是支持memory map的方式把存储空间当做是CPU的memory一样可以通过总线获取到code指令然后执行。 内部ROM Code会跳转到Code中然后Flash中的Code就会执行接着把data段和bss段进行分散加载到对应的ram然后就可以执行STM32就是这种方式。 RAM方式一般情况下MCU Boot会把代码从存储空间搬到RAM上去运行例如一些SPI Flash或者Nand Flash无法直接执行指令需要搬到RAM方式执行然后再跳到RAM地址执行RAM地址执行还有个好处是速度执行更快相对Flash上面执行。 下图以NXP的LPC54016为例进行展示Boot将代码从SPI Flash搬到SRAMX然后再将执行权交给SRAMX至此代码就在Sramx上面执行最后同样需要进行分散加载将bss段和data段搬到Sram0-3上面执行。 分散加载可以参考笔者本篇文章。 2、NXP单片机运行方式修改 以NXP LPC54016单片机为例笔者来介绍一下如何从RAM方式切到XIP方式。 2.1 代码启动流程 首先需要看一下手册研究一下如何支持XIP方式MCU的code都是rom code搬出来的如果要执行XIP方式则不搬code所以需要看相关的配置 开始笔者想着是相关的寄存器设置可以让ROM Code中的boot不搬代码但是实际看手册没有找到相关的寄存器信息。 找到了相关的流程图通过引脚来决定怎么启动 OTP BOOT SRC 引脚被设置则会从外部flashParallel Mmeory搬数据512Byte到SRAM通过该512Byte来决定在怎么启动XIP还是RAM方式 如果OTP BOOT SRC没有被设置则有ISP的引脚来决定进入ISP模式下载数据到SRAM然后BOOT还是从外部Flash Boot搬移。 这里有个AUTO BOOT的方式首先寻找有效的Image0x0/0x20000000 within internal SRAM (SRAMX or SRAM0) or 0x10000000 for SPIFI XIP and 0x80000000 for parallel flash XIP image如果地址都没找到则进入ISP模式等待命令下载代码。 如何确定有效的Image呢NXP巧妙的利用了中断向量表的信息来装载NXP特有的Mark从而确定是否有效的代码。 中断向量表中有几个位置是保留且中断向量表处于代码开始放置方便确认可参考笔者之前文章ARM学习5 异常模式学习CortexM3/M4从0x20的位置确定是否是0xEDDC94BD从0x24的位置确定真正NXP的Image Header位置信息从而跳转过去找到Image Header决定走XIP还是SRAM等 NXP LPC单片机有自己的Image Header可以设置一些属性通过链接脚本的方式包括分散加载的地址也是链接脚本里面指定。 Image Type选择ram方式还是xip方式 Load_adderess加载地址SRAMX还是SPIFI地址CRC check选择设置是否进行CRC 校验 经过这些研究就可以知道XIP的设置和RAM的设置表了主要关心的还是 Image Type和Loadaddress。 2.2 链接脚本修改 中断向量表 extern void (* const g_pfnVectors[])(void); extern void * __Vectors attribute ((alias (“g_pfnVectors”))); WEAK extern void __imghdr_loadaddress(); WEAK extern void __imghdr_imagetype(); void (* const g_pfnVectors[])(void) {// Core Level - CM4_vStackTop, // The initial stack pointerResetISR, // The reset handler.......,0, // ECRP(void (*)(void))0xEDDC94BD, // Reserved(void (*)(void))0x160, // Reserved.....,(void (*)(void))0xFEEDA5A5, // Header Marker0x160__imghdr_imagetype, // (0x04) Image Type__imghdr_loadaddress, // (0x08) Load_address(void (*)(void))(((unsigned)_image_size) - 4), // (0x0C) load_length, exclude 4 bytes CRC field.从上面中断向量表中可以看出NXP LPC单片机在中断向量表中做了手脚设置了一些参数和启动方式结合起来包括还可以知道ImageSize等。 注意观察其声明是一个虚函数的方式如果链接脚本里面没指定也可以链接过符合中断向量表数组的定义其实际是链接脚本里面指定的数据。 RAM方式的链接脚本 memory 布局定义外部Flash地址SRAMXSRAM0-3地址在链接脚本指定布局时可以指定其位置。 MEMORY {/* Define each memory region */BOARD_FLASH(rwx) : ORIGIN 0x10000000, LENGTH 0x1000000 /* 16M bytes (alias RAM) */ SRAMX (rwx) : ORIGIN 0x0, LENGTH 0x30000 /* 192K bytes (alias RAM) */ SRAM_0_1_2_3 (rwx) : ORIGIN 0x20000000, LENGTH 0x28000 /* 160K bytes (alias RAM2) */ USB_RAM (rwx) : ORIGIN 0x40100000, LENGTH 0x2000 /* 8K bytes (alias RAM3) */ }/* Define a symbol for the top of each memory region */__base_SRAMX 0x0 ; /* SRAMX */ __base_RAM 0x0 ; /* RAM */ __top_SRAMX 0x0 0x30000 ; /* 192K bytes */ __top_RAM 0x0 0x30000 ; /* 192K bytes */ __base_SRAM_0_1_2_3 0x20000000 ; /* SRAM_0_1_2_3 */ __base_RAM2 0x20000000 ; /* RAM2 */ __top_SRAM_0_1_2_3 0x20000000 0x28000 ; /* 160K bytes */ __top_RAM2 0x20000000 0x28000 ; /* 160K bytes */ __base_USB_RAM 0x40100000 ; /* USB_RAM */ __base_RAM3 0x40100000 ; /* RAM3 */ __top_USB_RAM 0x40100000 0x2000 ; /* 8K bytes */ __top_RAM3 0x40100000 0x2000 ; /* 8K bytes */ 中断向量表定义可看到在其前面定义了一些信息data段的信息data ram和data ram3都没有用到我们就不考虑了 “AT xxxx”加载地址 “ xxx”执行地址 分散加载做的就是将加载地址数据搬到执行地址如果本身两者地址一样则无需处理。 /* MAIN TEXT SECTION */.text : ALIGN(4){FILL(0xff)__vectors_start__ ABSOLUTE(.) ;KEEP(*(.isr_vector))/* Global Section Table */. ALIGN(4) ;__section_table_start .;__data_section_table .;LONG((LOADADDR(.data_RAM) - LOADADDR(.text)) __base_SRAMX);LONG( ADDR(.data_RAM));LONG( SIZEOF(.data_RAM));LONG((LOADADDR(.data) - LOADADDR(.text)) __base_SRAMX);LONG( ADDR(.data));LONG( SIZEOF(.data));LONG((LOADADDR(.data_RAM3) - LOADADDR(.text)) __base_SRAMX);LONG( ADDR(.data_RAM3));LONG( SIZEOF(.data_RAM3));__data_section_table_end .;__bss_section_table .;LONG( ADDR(.bss_RAM));LONG( SIZEOF(.bss_RAM));LONG( ADDR(.bss));LONG( SIZEOF(.bss));LONG( ADDR(.bss_RAM3));LONG( SIZEOF(.bss_RAM3));__bss_section_table_end .;__section_table_end . ;/* End of Global Section Table */*(.after_vectors*)} SRAMX AT SRAMX从上面脚本来分析目前代码段的加载地址就处于SRAMX所以直接写LOADADDR(.data)也行看图2加载地址和图1是一样的 加载地址其实就是存放的位置相对代码段的位置但是却不是执行的地址。 代码段的定义其加载地址和执行地址一样均是SRAMX同时一些只读数据和const数据也存放在代码段。 .text : ALIGN(4){*(.text*)*(.rodata .rodata.* .constdata .constdata.*). ALIGN(4);} SRAMX AT SRAMX_etext .;data段的定义加载地址和执行地址不一样前者是执行地址后者是加载地址说明其正式执行的时候在SRAM0-3加载的时候在SRAMX。 加载地址和存储地址也不是一个概念存储地址是真正存放代码的位置程序运行需要再特殊的地方比如内存所以肯定需要搬到对应的位置BOOT做的就是这个事情。搬到对应的位置后就是真正执行的地址吗也不竟然BOOT通常是做很简单的事情整体都搬过去包括代码和数据但是代码和数据往往要分开所以就有了分散加载。 /* Main DATA section (SRAM_0_1_2_3) */.data : ALIGN(4){FILL(0xff)_data . ;PROVIDE(__start_data_RAM2 .) ;PROVIDE(__start_data_SRAM_0_1_2_3 .) ;*(vtable)*(.ramfunc*)KEEP(*(CodeQuickAccess))KEEP(*(DataQuickAccess))*(RamFunction)*(.data*). ALIGN(4) ;_edata . ;PROVIDE(__end_data_RAM2 .) ;PROVIDE(__end_data_SRAM_0_1_2_3 .) ;} SRAM_0_1_2_3 ATSRAMXBSS段又不一样其不用存储加载地址和执行地址一样只要初始化成0就行。 /* MAIN BSS SECTION */.bss : ALIGN(4){_bss .;PROVIDE(__start_bss_RAM2 .) ;PROVIDE(__start_bss_SRAM_0_1_2_3 .) ;*(.bss*)*(COMMON). ALIGN(4) ;_ebss .;PROVIDE(__end_bss_RAM2 .) ;PROVIDE(__end_bss_SRAM_0_1_2_3 .) ;PROVIDE(end .);} SRAM_0_1_2_3 AT SRAM_0_1_2_3堆栈区域存放于SRAMX区域堆后面预留了栈的4K空间如果空间最后不够链接脚本会报错。 .stack区域指明了栈的起始地址没预留空间由上面那个空间预留保证很巧妙解决了栈递减的空间逻辑。 SECTIONS {/* Reserve and place Heap within memory map */_HeapSize 0x1000;.heap : ALIGN(4){_pvHeapStart .;. _HeapSize;. ALIGN(4);_pvHeapLimit .;} SRAMX_StackSize 0x1000;/* Reserve space in memory for Stack */.heap2stackfill :{. _StackSize;} SRAMX/* Locate actual Stack in memory map */.stack ORIGIN(SRAMX) LENGTH(SRAMX) - _StackSize - 0: ALIGN(4){_vStackBase .;. ALIGN(4);_vStackTop . _StackSize;} SRAMX最后这些都是符号不占用任何空间size如果程序用到了直接将对于的数据连接进入而不是变量进行加载。 如果确实是运行态的数据就需要占用空间size。 /* ## Create checksum value (used in startup) ## */PROVIDE(__valid_user_code_checksum 0 - (_vStackTop (ResetISR 1) (NMI_Handler 1) (HardFault_Handler 1) (( DEFINED(MemManage_Handler) ? MemManage_Handler : 0 ) 1) /* MemManage_Handler may not be defined */ (( DEFINED(BusFault_Handler) ? BusFault_Handler : 0 ) 1) /* BusFault_Handler may not be defined */ (( DEFINED(UsageFault_Handler) ? UsageFault_Handler : 0 ) 1) /* UsageFault_Handler may not be defined */) );/* Provide basic symbols giving location and size of main text* block, including initial values of RW data sections. Note that* these will need extending to give a complete picture with* complex images (e.g multiple Flash banks).*/_image_start LOADADDR(.text);_image_end LOADADDR(.data) SIZEOF(.data);_image_size _image_end - _image_start;/* Provide symbols for LPC540xx parts for startup code to use* to set image to be plain load image or XIP.* Config : Plain load image true*/__imghdr_loadaddress ADDR(.text);__imghdr_imagetype 1; }XIP方式链接脚本
http://www.pierceye.com/news/621088/

相关文章:

  • 专业的免费网站建设哪家如何优化网站图片
  • 网站开发哪个更专业国家企业信用信息系统(全国)
  • 中小企业网站制作不了国外网站用什么dns
  • word网站的链接怎么做的网页设计大赛网站开发
  • dede网站模板 音响海外酒店 网站建设
  • 深圳 网站建设公司南宁网站忧化
  • 做油和米的网站山西省网站备案
  • 做网站有陪标现象吗成都建设网站专业公司
  • 莱阳 网站建设博罗做网站公司
  • 简易个人网站模板推广一款app的营销方案
  • 小城镇建设有关网站起飞页怎么做网站
  • 网站影响seo的标签网站用国外的服务器打不开
  • 仿站 做网站网站备案 图标
  • 网站怎么做留言提交功能wordpress个人支付接口
  • 有哪些做室内设计好用的网站廊坊网站制作推广
  • 做村易通网站站长要收费吗?elegant wordpress
  • 网站建设专业培训网站开发网页加载缓慢查询数据库慢
  • 网站开发中 视频播放卡做soho建立网站
  • 面试网站开发员安徽建工集团网站
  • 公司制作网站价格表app系统开发费用
  • 网站建设需要学什么h5海报是怎么做出来的
  • 西平企业网站建设美媒中国或已建立了51区
  • 柯城区住房和城乡建设局网站免费搭建淘宝客网站
  • 低价机票 网站建设网站模板
  • 手机网站建设的教程视频做的网站怎么放在网上
  • 做视频网站视频空间设计是什么
  • 怎么把网站推广wordpress 百万数据
  • 乐陵市人力资源中心网站网站的内容和功能
  • wordpress网站搬家图片路径做网站的算什么行业
  • 个人网站logo重庆网络优化平台