当前位置: 首页 > 编程日记 > 正文

基于S3C4510B的一个简单BSP的开发报告

系统环境

(一)  硬件环境

CPU:S3C4510B

SDRAM:W981216DH 16M

FLASH:MX29LV160AB 2M

(二)  软件环境

tornado2.01 for arm(AKA的FTP上有tornado2.2需要的可以自己去下载:))

(三)  调试环境

TRACE32`

 

TRACE32

(一)利用TRACE32调试vxWorks

S3C4510B在系统上电时,CPU寄存器的基地址为0X3FF0000,利用TRACE32直接对CPU进行初始化,分配内存布局,初始化SDRAM,然后再加载vxWorks.st进行系统调试。

脚本如下:

; t32initial script for s3c4510b

; initial s4510b sdram and flash

d.s 0x03ff0000 %l 0x87ffffa0

d.s 0x03ff3010 %l 0x00003001

d.s 0x03ff3014 %l 0x12040060

d.s 0x03ff3018 %l 0x60

d.s 0x03ff301c %l 0x60

d.s 0x03ff3020 %l 0x60

d.s 0x03ff3024 %l 0x60

d.s 0x03ff3028 %l 0x60

d.s 0x03ff302c %l 0x10000398

d.s 0x03ff3030 %l 0x00

d.s 0x03ff3034 %l 0x00

d.s 0x03ff3038 %l 0x00

d.s 0x03ff303c %l 0xce2983fd

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; s3c4510b board - load coff file TRACE32 script file

  B::

  sYmbol.RESet

 

; load coff file

d.load.coff e:/s4510b_bsp/vxWorks.st /spath /lpath

  r.s pc 0x1000

; load symbol path

  y.spath + e:/s3c4510b_bsp/

  y.spath + d:/tor_arm/target/src/netwrs

  y.spath + d:/tor_arm/target/src/netinet

 

  ENDDO

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

1:初始化CPU

   

d.s 0x03ff0000 %l 0x87ffffa0 二进制为1000,0111,1111,1111,1111,1111,1010,0000

[05:04] = 10b 为8-Kbyte SRAM 0-Kbyte Cache

[15:06] = 1111111110b = 0x3FE SRAM的起始地址为0x3FE0000

[25:16] = 1111111111b = 0x3FF CPU寄存器基地址为0x3FF0000

[31] = 1b SDRAM

2:初始化内存布局

d.s 0x03ff3010 %l 0x00003001二进制为 0000,0000,0000,0000,0011,0000,0000,0001

[01:00] = 01b FLASH bank0数据总线为BYTE(8-BIT)

[13:12] = 11b SDRAM bank0 数据总线为 DWORD(32-BIT)

其他全部disable

d.s 0x03ff3014 %l 0x12040060二进制为 0001,0010,0000,0100,0000,0000,0110,0000

[01:00] = 00b NormalROM

[03:02] = 00b 5 cycles ( Page address access time (t PA ) )

[06:04] = 110b 7 cycle ( Programmable access cycle (t ACC ) )

[19:10] = 0100000000b = 0x100 FLASH bank0基地址为0x1000000

[29:20] = 0100100000b = 0x120 FLASH bank0 结束地址为 0x1200000-1

d.s 0x03ff302c %l 0x10000398 二进制为 0001,0000,0000,0000,0000,0011,1001,1000

[00:00] = 00b Normal SDRAM

[02:01] = 00b 1 cycle ( CAS strobe time (tCS) )

[03:03] = 01b 2 cycles(CAS pre-charge time (tCP))

[07:07] = 01b 2 cycles (RAS to CAS delay (tRC or tRCD))

[09:08] = 11b 4 cycles (RAS pre-charge time (tRP))

[19:10] = 0000000000b = 0x00 SDRAM bank0 基地址为 0x000000

[29:20] = 0100000000b = 0x100 SDRAM bank0 结束地址为 0x1000000-1

[31:30] = 00b 8bits ( Number of column address bits in DRAM bank0 )

d.s 0x03ff303c %l 0xce2983fd 二进制为 1100,1110,0010,1001,1000,0011,1111,1101

[09:00] = 1111111101b = 0x3FD External I/O bank0 的基地址为 0x3FD0000

其他各位意义请对照datasheet

内存初始化完毕后系统内存布局为:

00-16M 为 SDRAM

16-18M 为 FLASH

0x3FD0000开始64K为External I/O

0x3FE0000 开始8K为SRAM

0x3FF0000 开始64K 为CPU寄存器

3:加载vxWorks.st

d.load.coff e:/s4510b_bsp/vxWorks.st /spath /lpath 将vxWorks.st 加载到SDRAM中去

r.s pc 0x1000 设置pc指针到RAM_LOW_ADRS(0x1000)

这时就可以使用TRACE32设置断点进行调试了。

(二)利用TRACE32烧写bootrom

1:FLASH的擦除

; s3c4510b - flash erase TRACE32 script file

; flash type : AM29F100

; Erase flash by TRACE32

flash.reset

flash.create 0x1000000--0x10fffff AM29F100 WORD

flash.erase 0x1000000--0x1001fff

flash.erase 0x1002000--0x1003fff

flash.erase 0x1004000--0x1005fff

flash.erase 0x1006000--0x1007fff

flash.erase 0x1008000--0x1009fff

flash.erase 0x100a000--0x100bfff

flash.erase 0x100c000--0x100dfff

flash.erase 0x100e000--0x100ffff

…………………………………….

ENDDO

2:bootrom的烧写

;s3c4510b flash write TRACE32 script file

; flash type : AM29F100

; Write flash by TRACE32

B::

flash.reset

flash.create 0x1000000--0x10fffff AM29F100 word

flash.program all

; download *.bin file

d.load.binary E:/s4510b_bsp/bootrom.bin 0x1000000

flash.program off

 

  ENDDO

 

BSP的开发流程

(一)  vxWorks的执行流程

在系统开发期,我们通常利用调试工具将编译好的带调试符号的vxWorks下载到SDRAM中进行调试,所有功能调试结束后才编译生成bootrom.bin将其烧写的FLASH中。所以vxWorks有从ROM中启动和SDRAM中启动之分。

1:从SDRAM中启动vxWorks

利 用TRACE32将vxWorks.st下载到SDRAM中,这时根据TRACE32脚本设置,pc指针指向0x1000,这是sysInit ()的入口点。VxWorks在正常重启下调用该函数,在sysALib.s中定义,它禁止缓存器,初始化系统中断表、系统故障表,清除所有等待的中断, 调用usrInit(bootType)。

UsrInit() 是vxWorks下首先运行的C程序,它需要完成创建初始任务usrRoot()所需要的工作。它首先调用bzero (edata, end - edata);清除系统bss段,保存启动类型,调用intVecBaseSet ((FUNCPTR *) VEC_BASE_ADRS); 设置中断向量表,调用excVecInit ();设置异常向量,调用sysHwInit ();初始化系统硬件,调用usrKernelInit ();配置Wind内核,最后调用kernelInit ()开始系统根任务usrRoot;

UsrRoot是运行在多任务环境下的第一个任务,它完成最后的初始化,并且启动其他任务。UsrRoot()按照configAll.h和config.h中的配置来初始化I/O系统,安装驱动程序,创建设备,设置网络等等。

在 开发过程中,我们可以利用TRACE32对每一步执行进行跟踪,观察程序的执行行为,检查相关寄存器的内容;也可以写一些测试函数,对完成的相关的功能进 行简单的测试,例如当我们完成了串口在轮询模式下工作的驱动程序后,我们可以写一个echo程序对串口的输入输出进行简单的检查。

2:从ROM中启动vxWorks

当我们利用TRACE32 调试好一个BSP以后,这时就需要修改rominit.s这个文件了,这个文件中的romInit()是冷启动时的入口点,它将启动类型入栈,禁止中断, 初始化CPU,配置SDRAM、FLASH,并转移到bootinti.c中的romStart(),它将(文本段和)数据段复制到SDRAM中的 RAM_HIGH_ADRS处,并最终调用usrInit(bootType)。

在开发过程中,我们需要利用烧录工具或者调试工具将编译生成的bootrom.bin 下载到FLASH之中,当系统上电时,CPU将FLASH镜像到地址0x00000000处,并开始执行,当romInit()执行完必要的操作后,它将 跳转到FLASH的真实地址0x01000000处,并执行SDRAM、FLASH的初始化,这时再将SDRAM映射到0x00000000至 0x00ffffff处(0-16M),将FLASH映射到0x01000000至0x011fffff(16-18M)处完成其他的执行。

(二)  CPU的体系结构

S3C4510B 是使用ARM7TDMI核的CPU,因此需要对ARM7TDMI有一定的了解,需要注意的是32位精简指令集的CPU对数据的操作是按一个字长(4- BYTE)进行的,所以我们在gcc的编译开关中需要用—pack-struct来消除结构体间的空白,在强制类型转换时也需要特别的注意,因为一旦一个 奇数地址被解释成一个short(16-bit)或int(32-bit)类型地址时将产生异常。

(三)  利用调试工具辅助开发

在开发BSP时,有得心应手的调试工具将事半功倍。在这个项目中,我使用了TRACE32,它界面简洁,十分容易上手。

在开发初期,我们需要编写脚本文件来对CPU、 SDRAM、FLASH进行初始化,为了检验初始化结果是否正确,我们可以通过对SDRAM中的地址进行读写,看看结果与我们期望的是否一致。经过了这一 步,再将vxWorks.st下载到SDRAM中,通过单步运行检查代码执行是否正常,定位出错误的代码位置,反复修改直到系统正常运行为止。

 

硬件初始化

(一)   VxWorks的行为

vxWorks 在usrInit()中调用sysHwInit(),它设置所有设备进入安静状态,屏蔽所有可屏蔽的中断。sysHwInit调用 sysSerialHwInit();来初始化串口设备,并且在uartDevInit()中配置串口相关寄存器,设置波特率,置串口工作模式为轮询模 式。

usrRoot() 中调用sysClkConnect(),sysClkConnect立即调用sysHwInit2()来完成sysHwInit()中不能完成的工作, (因为在调用sysHwInit()时还没有初始化系统内存池,所以不能调用malloc相关的函数,例如intConnect())它调用 intLibInit()初始化中断库,调用irqDevIcnit()初始化中断控制器,然后用intConnect()挂接时钟中断,调用 sysSerialHwInit2()将串口设置成中断工作模式。

(二)  SC34510B的中断描述

SC34510B拥有21个中断源,如下表所示:

  

在这个例子中我用到了[4]、[5]、[10] 这三个中断源,分别为串口0发送中断、串口0接收中断、定时器0中断。在初始化中断控制器时我们需要设置INTMOD寄存器,将中断源配置在我们需要的工 作模式下,这里我将他们配置成普通中断模式(IRQ),即将[20:00]位清零。INTMOD寄存器如下图所示:

INTPND中断未决寄存器,它包含每个中断源的未决中断,需要在中断服务程序中通过对相应的位置一来清除该未决的中断。寄存器如下图所示:

INTMSK中断掩码寄存器,它包含每个中断源的中断掩码,当相应的位被置一时,该中断将被屏蔽。寄存器如下图所示:

在这个例子中,我没有改变系统中各个中断源的优先级顺序,即从0开始到第21,0的优先级最高,依次递减。

(三)  中断驱动程序

在irqDevIcnit()中初始化中断控制器,它初始化中断驱动程序结构,初始化中断控制器寄存器。

irqcLvlVecChk()中检查并返回当前优先级最高的未决中断。在这期间它设置当前中断优先级为这个未决中断的优先级,来确保在中断服务期间只允许优先级比它高的中断产生。

irqcLvlVecAck()中重新设置当前中断为前一个中断级别。

irqcLvlChg()中设置新的当前中断级别,所用优先级比当前中断低的(包括当前中断)将被屏蔽掉,所有比当前中断优先级高的且被允许中断的将被打开。

irqcLvlEnable()允许指定中断产生。

irqcLvlDisable()屏蔽一个指定中断。

(四)  串口中断

uartDevInit()中初始化串口控制器,设置波特率,初始化串口驱动程序。在期间需要配置的寄存器如下:

ULCON0寄存器,其值设为0x03,8-bit数据位,无停止位,无奇偶位。

UCON0寄存器,其值设为0x00,设置接收和发送中断无效。

UBRDIV0 寄存器,设置波特率除数因子,这里我设置的波特率为38400根据公式可以计算出该寄存器的值应该为0x270。公式为(fMCLK_MHz/(32* (_rate)) - 1)这里CPU的频率为50MHZ,_rate为38400,所以CNT0的值为0x27,采用除一的方式,所以CNT1为0000b,所以该寄存器的结 果为0x270。

uartPollInput()串口在轮询模式下输入处理程序。

UartPollOutput()串口在轮询模式下输出处理程序。

UartTxStartup()串口启动一个中断输出。

UartIntRX()输人中断服务程序,注意要清除输入中断相应的中断未决位。

UartIntTX()输出中断服务程序,注意要清除输出中断相应的中断未决位。

在以上几个函数中需要用到一下几个寄存器USTAT0、URXBUF0、UTXBUF0,大家自己查资料吧:)。

(五)  时钟中断

sysClkInt()为时钟中断的服务程序,在中断驱动程序初始化之后调用intConnect()注册的。

SysClkEnable()启动一个定时器,它计算每次时钟中断发生的时间间隔,并根据公式((fMCLK_MHz)/(sysClkTicksPerSecond)-1)算出TDATA0的值。设置TMOD为0x03,开启timer0,打开时钟中断。

SysClkDisable()停止一个定时器。它设置TMOD为0x00,关闭时钟中断。相关寄存器如下:

sysClkRateSet()设置每秒钟tick数,并通过连续调用SysClkDisable(),SysClkEnable()来更新设置。

SysClkRateGet()获取每秒钟tick数。

 

RomInit.s文件分析

当我们利用TRACE32 开发调试完一个在RAM中运行的vxWorks后,需要修改romInit.s和bootInti.c,编译连接生成bootrom.bin,然后利用工 具烧录到FLASH之中。以下是我针对S3C4510B这款CPU修改的romInit.s文件,代码及注释如下:

 

/* romInit.s - ARM PID ROM initialization module */

/* Copyright 1996-1999 Wind River Systems, Inc. */

.data

.globl _copyright_wind_river

.long _copyright_wind_river

 

/*

modification history

--------------------

;*****************************************************************************/

 

#define _ASMLANGUAGE

#include "vxWorks.h"

#include "arch/arm/arm.h"

#include "regs.h"

#include "sysLib.h"

#include "config.h"

#include "s4510b.h"

 

/* internals */

 

.globl _romInit /* start of system code */

.globl _sdata /* start of data */

 

/* externals */

 

.extern _romStart /* system initialization routine */

 

_sdata:

.asciz "start of data"

.balign 4

 

.text

.balign 4

 

/*******************************************************************************

*

* romInit - entry point for VxWorks in ROM

*

* romInit

* (

* int startType /@ only used by 2nd entry point @/

* )

* INTERNAL

* sysToMonitor examines the ROM for the first instruction and the string

* "Copy" in the third word so if this changes, sysToMonitor must be updated.

*/

_romInit:

romInit:

cold:

mov r0, #BOOT_COLD /* fall through to warm boot entry */

warm:

b start

/* copyright notice appears at beginning of ROM (in TEXT segment) */

.ascii "Copyright 2000-2001 STM / Cap Gemini."

.balign 4

 

start:

nop

nop

nop

nop

/*Part 1*/

/****************************************************************/

/*disable interrupts in CPU and switch to SVC32 mode*/

mrs r0, cpsr

bic r0, r0, #MASK_MODE

orr r0, r0, #MODE_SVC32

orr r0, r0, #I_BIT

orr r0, r0, #F_BIT

msr cpsr, r0

 

ldr r2, =ARM7_INTMASK /*R2->interrupt controller*/

mvn r1, #0 /*&FFFFFFFF*/

str r1, [r2] /*disable all interrupt soucres*/

ldr r2, =ARM7_INTPEND /*R2->interrupt pend register.*/

mvn r1, #0 /*&FFFFFFFF*/

str r1, [r2] /*clear all interrupt flags.*/

/*Part 2*/

/*****************************************************************/

ldr r0, =ARM7_SYSCFG

ldr r1, =0x87ffffA0 /*config SYSCFG*/

str r1, [r0] /*Cache & WB disabled*/

/*part 3*/

/****************************************************************/

/*jump to flash addr exec @16M*/

 

ldr lr, L$_HiPosn /* load lr with the ROM address where */

/* to jump after remap (this is an */

/* address after 0x20000000) */

mov pc, lr /* jump to address stored in lr */

 

/*Part 4*/

/****************************************************************/

/*Initalize the memory as followa:*/

/* FLASH @ 16 ~ 18 M*/

/* SDRAM @ 0 ~ 16M*/

HiPosn:

 

ldr r1, =rEXTDBWTH /*EXTDBWTH */

ldr r2, =rROMCON0 /*ROMCON0 @ 16M ~ 18M */

ldr r3, =rROMCON1 /*ROMCON1 @ DISABLED */

ldr r4, =rROMCON2 /*ROMCON1 @ DISABLED */

ldr r5, =rROMCON3 /*ROMCON1 @ DISABLED */

ldr r6, =rROMCON4 /*ROMCON1 @ DISABLED */

ldr r7, =rROMCON5 /*ROMCON1 @ DISABLED */

ldr r8, =rSDRAMCON0 /*SDRAMCON0 @ 0M ~ 16M */

ldr r9, =rSDRAMCON1 /*SDRAMCON1 @ DISABLED*/

ldr r10,=rSDRAMCON2 /*SDRAMCON2 @ DISABLED*/

ldr r11,=rSDRAMCON3 /*SDRAMCON3 @ DISABLED*/

ldr r12,=rSREFEXTCON

ldr r0, =ARM7_EXTDBWTH

stmia r0, {r1-r12}

 

/*---------------------------------------------------------------*/

/*

* Initialize the stack pointer to just before where the

* uncompress code, copied from ROM to RAM, will run.

*/

/*---------------------------------------------------------------*/

 

ldr sp, L$_STACK_ADDR

mov fp, #0 /* zero frame pointer */

 

/*----------------------------------------------------------------*/

/* jump to C entry point in ROM: routine - entry point + ROM base */

/*----------------------------------------------------------------*/

ldr pc, L$_rStrtInRom /* use ARM mode (no Thumb) */

 

/******************************************************************************/

 

/*

  * PC-relative-addressable pointers - LDR Rn,=sym is broken

  * note "_" after "$" to stop preprocessor preforming substitution

  */

 

.balign 4

 

L$_HiPosn:

.long ROM_TEXT_ADRS + HiPosn - _romInit

 

L$_rStrtInRom:

.long ROM_TEXT_ADRS + _romStart - _romInit

 

L$_STACK_ADDR:

.long STACK_ADRS

 

注意:上电以后FLASH将被镜像到0x00000000处,并开始执行。

这里ROM_TEXT_ADRS的值为0x01000000,当对CPU进行完必要的初始化以后它将跳转到FLASH的真实地址处进行执行,它继续完成对SDRAM的初始化,内存布局的分配等等,详细信息请参看TRACE32那一节。

 

相关文章:

Java项目:房屋租赁管理系统(java+SSM+Layui+Maven+Mysql+Jsp)

源码获取:博客首页 "资源" 里下载! 一、项目简述 功能包括: 房屋租赁管理系统是一款方便快捷,易操作的租房和各种物业收费的管理系统,该系统官网包含着用户和管理员分类登录,减少了为使用管理员…

sdtz技术组成

发送短信数据库表到第二天就删除前一天的的内容重新建表是用触发器功能实现的 回款、发标、发短信一些核心功能是用windows服务运行在服务器上自动运行的 sql管理中的维护计划就能设置自动备份数据库转载于:https://www.cnblogs.com/zheng510ke/p/4562812.html

13个 ASP.NET MVC 的扩展

ASP.NET MVC设计的主要原则之一是可扩展性。处理管线(processing pipeline)上的所有(或大多数)东西都是可替换的。因此,如果您不喜欢ASP.NET MVC所使用的约定(或缺乏某些约定),您可以…

javascript实例

数组排序 ①冒泡排序 思路: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤&#xff…

Ubuntu10.04安装Flash插件

1. 从Adobe下载Flash安装程序,并且解压。 tar -xzvf install_flash_player_10_linux.tar.gz 2. 把解压出来的“libflashplayer.so” 复制到 /usr/lib/mozilla/plugins 目录下。 sudo cp libflashplayer.so /usr/lib/mozilla/plugins 3. 执行以下命令&#x…

Java项目:健身俱乐部管理系统(java+SSM+Mysql+Jsp)

源码获取:博客首页 "资源" 里下载! 项目介绍: 基于jspmysqlSpringmybatis的SSM健身房管理系统 运行环境: jdk 1.8 IDE环境: Eclipse,Myeclipse,IDEA都可以 tomcat环境: Tomcat 7.x,8.x,9.x版本均可&#xf…

通过代理进行页面传值

A 页面跳转到 B页面&#xff0c;在关闭B页面的时候想将B页面的某些内容回传给A页面 在B页面写代理的相关方法 protocol 控制器的名称 Delegate <NSObject> optional -(void) xxxxxx:(控制器 *) control end interface 控制器 : UIViewController property (weak,nonatom…

Linux系统下如何安装软件包

现在一般是使用 RPM &#xff0c;YUM 和 APT 来管理软件包。软件包常用的也就是&#xff0c;查找软件包&#xff0c;安装&#xff0c;卸载&#xff0c;升级。这几个功能。RPM 比较经典&#xff0c;但是也比较麻烦&#xff0c;尤其是在软件依赖关系上面&#xff0c;有的时…

自己设计大学排名-数据库实践

今天我们来学习以下有关于数据提取以及数据库的一些知识&#xff0c; 我们知道其实数据库是一个非常神奇的存在&#xff0c;它是是按照 数据结构来组织、 存储和管理数据的仓库 我们可以使用它对数据进行储存和管理&#xff01; 下面是有关于sqlite3的学习&#xff0c;SQLite3 …

Windows 和 Linux 应用程序从上到下调用层次比较

刚毕业的时候&#xff0c;做了将近一年的Window下的程序开发&#xff0c;主要用MFC&#xff0c;那是也不明白程序在操作系统角度从上到下的整个调用层次。遇到调用库函数&#xff0c;不明白&#xff0c;就查MSDN&#xff0c;每个月1500行代码左右&#xff0c;那时以为这就是软件…

Java项目:药品管理系统(java+swing+Gui+mysql)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 功能介绍&#xff1a;用户管理、药品库存管理、进销管理、营销管理、药品购入、药品售出、药市信息 系统主页&#xff1a; SuppressWarnings("serial") public class SystemMainView extends JFr…

WEBSHELL跳板REDUH使用说明

原文链接: http://www.fendou.info/network/webshell-proxy-reduh.html reDuh是可以把内网服务器的端口通过http或https隧道转发到本机&#xff0c;形成一个TCP连通回路&#xff0c;用于目标服务器在内网或做了端口策略的情况下连接目标服务器内部端口的工具。 reDuh和LCX类似&…

站立会议(三)

一、会议时间&#xff1a;2014年4月13日 二、会议目的&#xff1a;统计项目进度以及每个人的进度、计划以及问题 三、会议内容&#xff1a; 党云龙&#xff1a; 今天内容 查阅资料&#xff0c;上网搜索&#xff0c;完成API调用&#xff1b; 遇到问题 还是在实现的时候无法阻止…

python celery

celery 一般用于做异步 和定时任务 不过听网上说 celery 坑还是蛮多的&#xff0c;特别定时任务&#xff0c;我们一般用来做定时任务&#xff0c;还有数据导入导出。celery 不支持 redis cluster 集群模式uWSGI 自带了一个简单的 Spooler 可以处理大部分异步任务和周期运行的任…

c语言实现memcpy

今天到I 公司去面试&#xff0c;面试方式比较特殊&#xff0c;没有笔试&#xff0c;就是2 个面试官&#xff0c;一人一句轮番发问&#xff0c;涉及面很广&#xff0c;涉及到操作系统(MMU 、page out 、process/thread 、semaphore 、interrupt), OOP( 多态、design pattern) 、…

Java项目:图书管理系统(java+swing+Gui+Mysql)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 功能介绍&#xff1a;借阅列表、图书类别管理、图书馆里、用户管理、借阅管理、关于我们 登录服务类&#xff1a; WebServlet("/LoginServlet") public class LoginServlet extends HttpServlet …

十五天精通WCF——第三天 client如何知道server提供的功能清单

通常我们去大保健的时候&#xff0c;都会找姑娘问一下这里能提供什么服务&#xff0c;什么价格&#xff0c;这时候可能姑娘会跟你口述一些服务或者提供一份服务清单&#xff0c;这样的话大 家就可以做到童嫂无欺&#xff0c;这样一份活生生的例子&#xff0c;在wcf中同样是一个…

MySQL Cluster 日常维护

在前面几篇文章已经详细介绍了MySQL Cluster的搭建&#xff0c;配置讲解。而且相信大家都掌握了基本用法。现在我们来看看Cluster的日常维护。熟悉日常维护&#xff0c;将有助于工作中更好的管理和使用Cluster。 一. 数据备份 相信大家都熟悉mysql的日常备份工具&#xff0c;比…

20165219王彦博《基于Cortex-M4的虚拟机制作与测试》课程设计个人报告

20165219王彦博《基于Cortex-M4的虚拟机制作与测试》课程设计个人报告 一、个人贡献 参与课设题目讨论及完成全过程&#xff1b; 资料收集&#xff1b; 负责环境搭建&#xff0c;代码运行下载&#xff1b; 撰写小组结题报告。 二、设计中遇到的问题及解决方法 1 实验六以太网服…

extern数组与extern指针

数组名代表了存放该数组的那块内存&#xff0c;它是这块内存的首地址。这就说明了数组名 是一个地址&#xff0c;而且&#xff0c;还是一个不可修改的常量&#xff0c;完整地说&#xff0c;就是一个地址常量。数组名 跟枚举常量一样&#xff0c;都属于符号常量。数组名 这个符号…

Java项目:医院管理系统(java+javaweb+jdbc+Mysql+lw)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 功能介绍&#xff1a; 登录、注册、用户/管理员(角色)、用户信息管理、科系信息管理、查看所有科系、新增科系信息、删除指定科系、修改科系信息、病房信息管理、病人信息管理、医生类型管理、病人手术管理…

Mongodb地理空间索引

1、索引&#xff1a; 建立索引既耗时也费力&#xff0c;还需要消耗很多资源。使用{"bakckground":true}选项可以使这个过程在后台完成&#xff0c;同时正常处理请求。如果不包括background 这个选项&#xff0c;数据库会阻塞建立索引期间的所有请求。阻塞的做法会让索…

Juniper的路由器、防火墙、交换机如何恢复出厂配置

Juniper的路由器、防火墙、交换机如何恢复出厂配置有些时候&#xff0c;在正常的业务使用中&#xff0c;逐条删除配置的内容很繁琐&#xff0c;我们可以使用恢复出厂配置&#xff0c;清空设备中的配置&#xff1b;还有的时候&#xff0c;由于设备配置异常&#xff0c;可以使用恢…

【转载】标准输入输出、错误输出、重定向标准输出

【转载】标准输入输出、错误输出、重定向标准输出 原文&#xff1a;标准输入输出、错误输出、重定向标准输出 再来看看 >& 操作符&#xff1a; 重定向操作符描述 > 将命令输出写入到文件或设备&#xff08;如打印机&#xff09;&#xff0c;而不是命令提示符窗口或…

(Interrupt Latency) 中断延迟

中断延迟 (Interrupt Latency) 中断延迟 是指从硬件中断发生到开始执行中断处理程序第一条指令之间的这段时间。 也就是&#xff1a; 计算机接收到中断信号到操作系统作出响应&#xff0c;并完成换到转入中断服务程序的时间。 不严格地&#xff0c;也可以表述为&#xff1a…

Java项目:干活管理系统(java+SSM+Jsp+Mysql)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 前台用户和后台管理员两种角色&#xff1a; 前台用户功能有&#xff1a;发布兼职、发布帖子、查看公告、个人中心、投诉等。 后台管理员功能有&#xff1a;用户管理、兼职管理、帖子管理、聊天管理、广告管…

20135234mqy 实验四

北京电子科技学院&#xff08;BESTI&#xff09; 实 验 报 告 课程&#xff1a;java程序设计 班级&#xff1a;1352 姓名&#xff1a;mqy 学号&#xff1a;20135234 成绩&#xff1a; 指导教师&#xff1a;娄嘉鹏 实验日期&#xff1a;2015.6…

我的第一张地图报表

一直以来对于地图都很陌生&#xff0c;感觉好强大&#xff0c;可以根据地理位置去分析数据&#xff0c;下面我简单的做了一张地图展示数据的报表。 接下来就简单的说一下设计过程和应该注意的地方 效果&#xff1a;&#xff08;鼠标放在省份区域上&#xff0c;显示该省的数据&a…

SpringBoot第十篇:thymeleaf详解

作者&#xff1a;追梦1819 原文&#xff1a;https://www.cnblogs.com/yanfei1819/p/10931435.html 版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请附上博文链接&#xff01; 引言 SpringBoot 对 Web 的支持&#xff0c;官方推荐的是模板引擎 thymelaf。本章中&…

嵌入式系统开发过程中遇到的——volatile

嵌入式 系统开发过程中遇到的—— volatile 对于不同的计算机体系结构&#xff0c;设备可能是端口映射&#xff0c;也可能是内存映射的 。如果系统结构支持独立的 I/O 地址空间&#xff0c;并且是端口映射&#xff0c;就必须使用汇编语言完成实际对设备的控制&#xff…