搜档网
当前位置:搜档网 › keil调试环境下S3C2440.s的分析

keil调试环境下S3C2440.s的分析

keil调试环境下S3C2440.s的分析
keil调试环境下S3C2440.s的分析

; Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs ;向量中断模式/非向量中断模式设置

;通过PSRs(程序状态寄存器)来设置

; 系统工作模式设定

; CPSR是当系统前程序状态寄存器,SPSR是备份程序状态寄存器。其中CPSR共用一个物理寄存器,而SPSR一共有5个物理寄存器

; CPSR寄存器设定:CPSR[4..0] 为M4-M0,通过它可以设定处理器的工作模式

Mode_USR EQU 0x10 ; 用户模式

Mode_FIQ EQU 0x11 ; 快速中断模式

Mode_IRQ EQU 0x12 ; 外部中断模式

Mode_SVC EQU 0x13 ; 超级用户模式

Mode_ABT EQU 0x17 ; 数据访问终止模式

Mode_UND EQU 0x1B ; 未定义指令终止模式

Mode_SYS EQU 0x1F ; 系统模式

I_Bit EQU 0x80 ; when I bit is set, IRQ is disabled 外部中断屏蔽位,置1,关闭中断,置0,打开中断

F_Bit EQU 0x40 ; when F bit is set, FIQ is disabled 快速中断屏蔽位,置1,关闭中断,置0,打开中断

;----------------------- Stack and Heap Definitions ----------------------------

;// Stack Configuration (Stack Sizes in Bytes)

;// Undefined Mode <0x0-0xFFFFFFFF:8>

;// Supervisor Mode <0x0-0xFFFFFFFF:8>

;// Abort Mode <0x0-0xFFFFFFFF:8>

;// Fast Interrupt Mode <0x0-0xFFFFFFFF:8>

;// Interrupt Mode <0x0-0xFFFFFFFF:8>

;// User/System Mode <0x0-0xFFFFFFFF:8>

;//

; 栈配置,系统的栈空间设定

UND_Stack_Size EQU 0x00000000 ; 未定义模式的栈大小

SVC_Stack_Size EQU 0x00000008 ; 超级用户模式的栈大小

ABT_Stack_Size EQU 0x00000000 ; 数据访问终止模式的栈大小

FIQ_Stack_Size EQU 0x00000000 ; 快速中断模式的栈大小

IRQ_Stack_Size EQU 0x00000080 ; 外部中断模式的栈大小

USR_Stack_Size EQU 0x00000400 ; 用户模式的栈大小

ISR_Stack_Size EQU (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + \

FIQ_Stack_Size + IRQ_Stack_Size) ; 所有模式的堆栈相加得到总堆栈的大小

; ARM的汇编程序由段组成,段是相对独立的指令或数据单位,每个段由AREA伪指令定义,并定义段的属性。----READWRITE(读写)、READONLY(只读)

AREA STACK, NOINIT, READWRITE, ALIGN=3 ; 开辟一个堆栈段,段名字为STACK,定义为可读可写,; 不初始化内存单元,或将内存单元初始化为0

Stack_Mem SPACE USR_Stack_Size ;

__initial_sp SPACE ISR_Stack_Size ; 汇编代码的地址标号

Stack_Top ; 堆栈段内容结束,在这里放个标号,用来获得堆栈顶部地址

;// Heap Configuration

;// Heap Size (in Bytes) <0x0-0xFFFFFFFF>

;//

Heap_Size EQU 0x00000000 ; 堆大小设置

AREA HEAP, NOINIT, READWRITE, ALIGN=3 ; 开辟一个段,名字为HEAP可读可写,不初始化内存单元,或者初始化为0

__heap_base

Heap_Mem SPACE Heap_Size

__heap_limit

;----------------------- Memory Definitions ------------------------------------

; Internal Memory Base Addresses ; 片上SRAM的基地址,即内存基地址

IRAM_BASE EQU 0x40000000

;----------------------- Watchdog Timer Definitions ----------------------------

WT_BASE EQU 0x53000000 ; Watchdog Timer Base Address 看门狗定时器基地址

WTCON_OFS EQU 0x00 ; Watchdog Timer Control Register Offset 看门狗控制寄存器偏移地址,相对于基址

WTDAT_OFS EQU 0x04 ; Watchdog Timer Data Register Offset 看门狗数据寄存器偏移地址,相对于基址

WTCNT_OFS EQU 0x08 ; Watchdog Timer Count Register Offset 看门狗计数寄存器偏移地址,相对于基址

;// Watchdog Timer Setup

;// Watchdog Timer Control Register (WTCON)

;// Prescaler Value <0-255>

;// Watchdog Timer Enable

;// Clock Division Factor

;// <0=> 16 <1=> 32 <2=> 64 <3=> 128

;// Interrupt Generation Enable

;// Reset Enable

;//

;// Watchdog Timer Data Register (WTDAT)

;// Count Reload Value <0-65535>

;//

;// Watchdog Timer Setup

WT_SETUP EQU 1 ; 看门狗设置

WTCON_Val EQU 0x00000000 ; 看门狗控制寄存器设置,关闭看门狗

WTDAT_Val EQU 0x00008000 ; 看门狗数据寄存器设置,初始值即为0x8000

;----------------------- Clock and Power Management Definitions ----------------

CLOCK_BASE EQU 0x4C000000 ; Clock Base Address ; 时钟基地址

LOCKTIME_OFS EQU 0x00 ; PLL Lock Time Count Register Offset ; 锁相环锁定时间计数寄存器偏移地址,相对于基址

MPLLCON_OFS EQU 0x04 ; MPLL Configuration Register Offset ; MPLL配置寄存器偏移地址,相对于基址,主时钟源PLL

UPLLCON_OFS EQU 0x08 ; UPLL Configuration Register Offset ; UPLL配置寄存器偏移地址,相对于基址,USB时钟源PLL

CLKCON_OFS EQU 0x0C ; Clock Generator Control Reg Offset ; 时钟控制寄存器偏移地址,相对于基址

CLKSLOW_OFS EQU 0x10 ; Clock Slow Control Register Offset ; 时钟减慢控制寄存器偏移地址,相对于基址

CLKDIVN_OFS EQU 0x14 ; Clock Divider Control Register Offset ; 时钟分频器控制寄存器偏移地址,相对于基址

CAMDIVN_OFS EQU 0x18 ; Camera Clock Divider Register Offset ; 摄像头时钟分频器控制寄存器偏移地址,相对于基址,UPLL提供

;// Clock Setup

;// PLL Lock Time Count Register (LOCKTIME)

;// U_LTIME: UPLL Lock Time Count Value for UCLK <0x0-0xFFFF>

;// M_LTIME: MPLL Lock Time Count Value for FCLK, HCLK and PCLK <0x0-0xFFFF> ;//

;// MPLL Configuration Register (MPLLCON)

;// MPLL = (2 * m * Fin) / (p * 2^s)

;// m: Main Divider m Value <9-256><#-8>

;// m = MDIV + 8

;// p: Pre-divider p Value <3-64><#-2>

;// p = PDIV + 2

;// s: Post Divider s Value <0-3>

;// s = SDIV

;//

;// UPLL Configuration Register (UPLLCON)

;// UPLL = ( m * Fin) / (p * 2^s)

;// m: Main Divider m Value <8-263><#-8>

;// m = MDIV + 8

;// p: Pre-divider p Value <2-65><#-2>

;// p = PDIV + 2

;// s: Post Divider s Value <0-3>

;// s = SDIV

;//

;// Clock Generation Control Register (CLKCON) ;// AC97 Enable

;// Camera Enable

;// SPI Enable

;// IIS Enable

;// IIC Enable

;// ADC + Touch Screen Enable

;// RTC Enable

;// GPIO Enable

;// UART2 Enable

;// UART1 Enable

;// UART0 Enable

;// SDI Enable

;// PWMTIMER Enable

;// USB Device Enable

;// USB Host Enable

;// LCDC Enable

;// NAND FLASH Controller Enable ;// SLEEP Enable

;// IDLE BIT Enable

;//

;// Clock Slow Control Register (CLKSLOW)

;// UCLK_ON: UCLK ON

;// MPLL_OFF: Turn off PLL

;// SLOW_BIT: Slow Mode Enable

;// SLOW_VAL: Slow Clock Divider <0-7>

;//

;// Clock Divider Control Register (CLKDIVN)

;// DIVN_UPLL: UCLK Select

;// <0=> UCLK = UPLL clock

;// <1=> UCLK = UPLL clock / 2

;// HDIVN: HCLK Select

;// <0=> HCLK = FCLK

;// <1=> HCLK = FCLK / 2

;// <2=> HCLK = FCLK / 4 if HCLK4_HALF = 0 in CAMDIVN, else HCLK = FCLK / 8 ;// <3=> HCLK = FCLK / 3 if HCLK3_HALF = 0 in CAMDIVN, else HCLK = FCLK / 6 ;// PDIVN: PCLK Select

;// <0=> PCLK = HCLK

;// <1=> PCLK = HCLK / 2

;//

;// Camera Clock Divider Control Register (CAMDIVN)

;// DVS_EN: ARM Core Clock Select

;// <0=> ARM core runs at FCLK

;// <1=> ARM core runs at HCLK

;// HCLK4_HALF: HDIVN Division Rate Change Bit

;// <0=> If HDIVN = 2 in CLKDIVN then HCLK = FCLK / 4

;// <1=> If HDIVN = 2 in CLKDIVN then HCLK = FCLK / 8

;// HCLK3_HALF: HDIVN Division Rate Change Bit

;// <0=> If HDIVN = 3 in CLKDIVN then HCLK = FCLK / 3

;// <1=> If HDIVN = 3 in CLKDIVN then HCLK = FCLK / 6

;// CAMCLK Select

;// <0=> CAMCLK = UPLL

;// <1=> CAMCLK = UPLL / CAMCLK_DIV

;// CAMCLK_DIV: CAMCLK Divider <0-15>

;// Camera Clock = UPLL / (2 * (CAMCLK_DIV + 1))

;// Divider is used only if CAMCLK_SEL = 1

;//

;// Clock Setup

CLOCK_SETUP EQU 0 ; 时钟设置

LOCKTIME_Val EQU 0x0FFF0FFF ; PLL锁定时间计数器值MPLLCON_Val EQU 0x00043011 ; MPLL配置寄存器值UPLLCON_Val EQU 0x00038021 ; UPLL配置寄存器值CLKCON_Val EQU 0x001FFFF0 ; 时钟配置寄存器值CLKSLOW_Val EQU 0x00000004 ; 时钟减慢控制寄存器值CLKDIVN_Val EQU 0x0000000F ; 时钟分频控制寄存器值CAMDIVN_Val EQU 0x00000000 ; 摄像头分频控制寄存器值

;----------------------- Memory Controller Definitions -------------------------

; 存储控制器设置

MC_BASE EQU 0x48000000 ; Memory Controller Base Address ; 存储控制器基地址

BWSCON_OFS EQU 0x00 ; Bus Width and Wait Status Ctrl Offset ; 总线宽度和等待控制寄存器

BANKCON0_OFS EQU 0x04 ; Bank 0 Control Register Offset ; BANK0---BOOT ROM控制寄存器设置

BANKCON1_OFS EQU 0x08 ; Bank 1 Control Register Offset ; BANK1

BANKCON2_OFS EQU 0x0C ; Bank 2 Control Register Offset ; BANK2

BANKCON3_OFS EQU 0x10 ; Bank 3 Control Register Offset ; BANK3

BANKCON4_OFS EQU 0x14 ; Bank 4 Control Register Offset ; BANK4

BANKCON5_OFS EQU 0x18 ; Bank 5 Control Register Offset ; BANK5

BANKCON6_OFS EQU 0x1C ; Bank 6 Control Register Offset ; BANK6

BANKCON7_OFS EQU 0x20 ; Bank 7 Control Register Offset ; BANK7

REFRESH_OFS EQU 0x24 ; SDRAM Refresh Control Register Offset ; DRAM/SDRAM刷新控制BANKSIZE_OFS EQU 0x28 ; Flexible Bank Size Register Offset ; 可调的bank大小寄存器MRSRB6_OFS EQU 0x2C ; Bank 6 Mode Register Offset ; 模式控制寄存器bank6 MRSRB7_OFS EQU 0x30 ; Bank 7 Mode Register Offset ; 模式控制寄存器bank7

;// Memory Controller Setup

;// Bus Width and Wait Control Register (BWSCON)

;// ST7: Use UB/LB for Bank 7

;// WS7: Enable Wait Status for Bank 7

;// DW7: Data Bus Width for Bank 7

;// <0=> 8-bit <1=> 16-bit <2=> 32-bit <3=> Reserved ;// ST6: Use UB/LB for Bank 6

;// WS6: Enable Wait Status for Bank 6

;// DW6: Data Bus Width for Bank 6

;// <0=> 8-bit <1=> 16-bit <2=> 32-bit <3=> Reserved ;// ST5: Use UB/LB for Bank 5

;// WS5: Enable Wait Status for Bank 5

;// DW5: Data Bus Width for Bank 5

;// <0=> 8-bit <1=> 16-bit <2=> 32-bit <3=> Reserved ;// ST4: Use UB/LB for Bank 4

;// WS4: Enable Wait Status for Bank 4

;// DW4: Data Bus Width for Bank 4

;// <0=> 8-bit <1=> 16-bit <2=> 32-bit <3=> Reserved ;// ST3: Use UB/LB for Bank 3

;// WS3: Enable Wait Status for Bank 3

;// DW3: Data Bus Width for Bank 3

;// <0=> 8-bit <1=> 16-bit <2=> 32-bit <3=> Reserved ;// ST2: Use UB/LB for Bank 2

;// WS2: Enable Wait Status for Bank 2

;// DW2: Data Bus Width for Bank 2

;// <0=> 8-bit <1=> 16-bit <2=> 32-bit <3=> Reserved ;// ST1: Use UB/LB for Bank 1

;// WS1: Enable Wait Status for Bank 1

;// DW1: Data Bus Width for Bank 1

;// <0=> 8-bit <1=> 16-bit <2=> 32-bit <3=> Reserved

;// DW0: Indicate Data Bus Width for Bank 0

;// <1=> 16-bit <2=> 32-bit

;//

;// Bank 0 Control Register (BANKCON0)

;// Tacs: Address Set-up Time before nGCS

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tcos: Chip Selection Set-up Time before nOE

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tacc: Access Cycle

;// <0=> 1 clocks <1=> 2 clocks <2=> 3 clocks <3=> 4 clocks ;// <4=> 6 clocks <5=> 8 clocks <6=> 10 clocks <7=> 14 clocks ;// Tcoh: Chip Selection Hold Time after nOE

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tcah: Address Hold Time after nGCS

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tacp: Page Mode Access Cycle at Page Mode

;// <0=> 2 clocks <1=> 3 clocks <2=> 4 clocks <3=> 6 clocks

;// PMC: Page Mode Configuration

;// <0=> normal (1 data) <1=> 4 data <2=> 8 data <3=> 16 data

;//

;// Bank 1 Control Register (BANKCON1)

;// Tacs: Address Set-up Time before nGCS

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tcos: Chip Selection Set-up Time before nOE

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tacc: Access Cycle

;// <0=> 1 clocks <1=> 2 clocks <2=> 3 clocks <3=> 4 clocks ;// <4=> 6 clocks <5=> 8 clocks <6=> 10 clocks <7=> 14 clocks ;// Tcoh: Chip Selection Hold Time after nOE

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tcah: Address Hold Time after nGCS

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tacp: Page Mode Access Cycle at Page Mode

;// <0=> 2 clocks <1=> 3 clocks <2=> 4 clocks <3=> 6 clocks

;// PMC: Page Mode Configuration

;// <0=> normal (1 data) <1=> 4 data <2=> 8 data <3=> 16 data

;//

;// Bank 2 Control Register (BANKCON2)

;// Tacs: Address Set-up Time before nGCS

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tcos: Chip Selection Set-up Time before nOE

;// Tacc: Access Cycle

;// <0=> 1 clocks <1=> 2 clocks <2=> 3 clocks <3=> 4 clocks ;// <4=> 6 clocks <5=> 8 clocks <6=> 10 clocks <7=> 14 clocks ;// Tcoh: Chip Selection Hold Time after nOE

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tcah: Address Hold Time after nGCS

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tacp: Page Mode Access Cycle at Page Mode

;// <0=> 2 clocks <1=> 3 clocks <2=> 4 clocks <3=> 6 clocks

;// PMC: Page Mode Configuration

;// <0=> normal (1 data) <1=> 4 data <2=> 8 data <3=> 16 data

;//

;// Bank 3 Control Register (BANKCON3)

;// Tacs: Address Set-up Time before nGCS

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tcos: Chip Selection Set-up Time before nOE

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tacc: Access Cycle

;// <0=> 1 clocks <1=> 2 clocks <2=> 3 clocks <3=> 4 clocks ;// <4=> 6 clocks <5=> 8 clocks <6=> 10 clocks <7=> 14 clocks ;// Tcoh: Chip Selection Hold Time after nOE

;// Tcah: Address Hold Time after nGCS

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tacp: Page Mode Access Cycle at Page Mode

;// <0=> 2 clocks <1=> 3 clocks <2=> 4 clocks <3=> 6 clocks

;// PMC: Page Mode Configuration

;// <0=> normal (1 data) <1=> 4 data <2=> 8 data <3=> 16 data

;//

;// Bank 4 Control Register (BANKCON4)

;// Tacs: Address Set-up Time before nGCS

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tcos: Chip Selection Set-up Time before nOE

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tacc: Access Cycle

;// <0=> 1 clocks <1=> 2 clocks <2=> 3 clocks <3=> 4 clocks ;// <4=> 6 clocks <5=> 8 clocks <6=> 10 clocks <7=> 14 clocks ;// Tcoh: Chip Selection Hold Time after nOE

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tcah: Address Hold Time after nGCS

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tacp: Page Mode Access Cycle at Page Mode

;// <0=> 2 clocks <1=> 3 clocks <2=> 4 clocks <3=> 6 clocks

;// PMC: Page Mode Configuration

;// <0=> normal (1 data) <1=> 4 data <2=> 8 data <3=> 16 data

;//

;// Bank 5 Control Register (BANKCON5)

;// Tacs: Address Set-up Time before nGCS

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tcos: Chip Selection Set-up Time before nOE

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tacc: Access Cycle

;// <0=> 1 clocks <1=> 2 clocks <2=> 3 clocks <3=> 4 clocks ;// <4=> 6 clocks <5=> 8 clocks <6=> 10 clocks <7=> 14 clocks ;// Tcoh: Chip Selection Hold Time after nOE

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tcah: Address Hold Time after nGCS

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tacp: Page Mode Access Cycle at Page Mode

;// <0=> 2 clocks <1=> 3 clocks <2=> 4 clocks <3=> 6 clocks

;// PMC: Page Mode Configuration

;// <0=> normal (1 data) <1=> 4 data <2=> 8 data <3=> 16 data

;//

;// Bank 6 Control Register (BANKCON6)

;// Memory Type Selection

;// <0=> ROM or SRAM <3=> SDRAM

;// Tacs: Address Set-up Time before nGCS

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tcos: Chip Selection Set-up Time before nOE

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tacc: Access Cycle

;// <0=> 1 clocks <1=> 2 clocks <2=> 3 clocks <3=> 4 clocks

;// <4=> 6 clocks <5=> 8 clocks <6=> 10 clocks <7=> 14 clocks

;// Tcoh: Chip Selection Hold Time after nOE

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tcah: Address Hold Time after nGCS

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tacp/Trcd: Page Mode Access Cycle at Page Mode / RAS to CAS Delay ;// Parameter depends on Memory Type: if type SRAM then parameter is Tacp, ;// if type is SDRAM then parameter is Trcd

;// For SDRAM 6 cycles setting is not allowed

;// <0=> 2 clocks <1=> 3 clocks <2=> 4 clocks <3=> 6 clocks

;// PMC/SCAN: Page Mode Configuration / Column Address Number <0-3> ;// Parameter depends on Memory Type: if type SRAM then parameter is PMC, ;// if type is SDRAM then parameter is SCAN

;//

;// Bank 7 Control Register (BANKCON7)

;// Memory Type Selection

;// <0=> ROM or SRAM <3=> SDRAM

;// Tacs: Address Set-up Time before nGCS

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tcos: Chip Selection Set-up Time before nOE

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tacc: Access Cycle

;// <0=> 1 clocks <1=> 2 clocks <2=> 3 clocks <3=> 4 clocks

;// <4=> 6 clocks <5=> 8 clocks <6=> 10 clocks <7=> 14 clocks

;// Tcoh: Chip Selection Hold Time after nOE

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tcah: Address Hold Time after nGCS

;// <0=> 0 clocks <1=> 1 clocks <2=> 2 clocks <3=> 4 clocks

;// Tacp/Trcd: Page Mode Access Cycle at Page Mode / RAS to CAS Delay ;// Parameter depends on Memory Type: if type SRAM then parameter is Tacp, ;// if type is SDRAM then parameter is Trcd

;// For SDRAM 6 cycles setting is not allowed

;// <0=> 2 clocks <1=> 3 clocks <2=> 4 clocks <3=> 6 clocks

;// PMC/SCAN: Page Mode Configuration / Column Address Number <0-3> ;// Parameter depends on Memory Type: if type SRAM then parameter is PMC, ;// if type is SDRAM then parameter is SCAN

;//

;// SDRAM Refresh Control Register (REFRESH)

;// REFEN: SDRAM Refresh Enable

;// TREFMD: SDRAM Refresh Mode

;// <0=> CBR/Auto Refresh <1=> Self Refresh

;// Trp: SDRAM RAS Pre-charge Time

;// <0=> 2 clocks <1=> 3 clocks <2=> 4 clocks <3=> Reserved

;// Tsrc: SDRAM Semi Row Cycle Time

;// SDRAM Row cycle time: Trc = Tsrc + Trp

;// <0=> 4 clocks <1=> 5 clocks <2=> 6 clocks <3=> 7 clocks

;// Refresh Counter <0-1023>

;// Refresh Period = (2048 - Refresh Count + 1) / HCLK

;//

;// Flexible Bank Size Register (BANKSIZE)

;// BURST_EN: ARM Core Burst Operation Enable

;// SCKE_EN: SDRAM Power Down Mode Enable

;// SCLK_EN: SCLK Enabled During SDRAM Access Cycle

;// <0=> SCLK is always active <1=> SCLK is active only during the access

;// BK76MAP: BANK6 and BANK7 Memory Map

;// <0=> 32MB / 32MB <1=> 64MB / 64MB <2=> 128MB / 128MB

;// <4=> 2MB / 2MB <5=> 4MB / 4MB <6=> 8MB / 8MB <7=> 16MB / 16MB ;// Refresh Counter <0-1023>

;// Refresh Period = (2048 - Refresh Count + 1) / HCLK

;//

;// SDRAM Mode Register Set Register 6 (MRSRB6) ;// WBL: Write Burst Length

;// <0=> Burst (Fixed)

;// TM: Test Mode

;// <0=> Mode register set (Fixed)

;// CL: CAS Latency

;// <0=> 1 clocks <1=> 2 clocks <2=> 3 clocks ;// BT: Burst Type

;// <0=> Sequential (Fixed)

;// BL: Burst Length

;// <0=> 1 (Fixed)

;//

;// SDRAM Mode Register Set Register 7 (MRSRB7) ;// WBL: Write Burst Length

;// <0=> Burst (Fixed)

;// TM: Test Mode

;// <0=> Mode register set (Fixed)

;// CL: CAS Latency

;// <0=> 1 clocks <1=> 2 clocks <2=> 3 clocks ;// BT: Burst Type

;// <0=> Sequential (Fixed)

;// BL: Burst Length

;// <0=> 1 (Fixed)

;//

;// Memory Controller Setup

MC_SETUP EQU 0 ; 存储器控制寄存器设置BWSCON_Val EQU 0x22000000

BANKCON0_Val EQU 0x00000700

BANKCON1_Val EQU 0x00000700

BANKCON2_Val EQU 0x00000700

BANKCON3_Val EQU 0x00000700

BANKCON4_Val EQU 0x00000700

BANKCON5_Val EQU 0x00000700

BANKCON6_Val EQU 0x00018005

BANKCON7_Val EQU 0x00018005

REFRESH_Val EQU 0x008404F3

BANKSIZE_Val EQU 0x00000032

MRSRB6_Val EQU 0x00000020

MRSRB7_Val EQU 0x00000020

;----------------------- I/O Port Definitions ----------------------------------

; GPIO设置

GPA_BASE EQU 0x56000000 ; GPA Base Address GPB_BASE EQU 0x56000010 ; GPB Base Address

keil软件调试单片机程序

先说一个概念:调试,在企业程序设计里(我把企业商务类型的软件开发叫企业程序设计,把单片机与驱动程序这样接触底层汇编与硬件相关的程序设计叫底层程序设计),调试一般都用来跟踪变量的赋值过程,以及查看内存堆栈的内容,查看这些内容的目的在于观察变量的赋值过程与赋值情况从而达到调试的目的。由于企业程序的宿主就是开发它的计算机本身,因此企业程序设计比起底层程序设计,特别是单片机的程序设计调试来的更直观,调试也更方便。 单片机的程序设计调试分为两种,一种是使用软件模拟调试,意思就是用开发单片机程序的计算机去模拟单片机的指令执行,并虚拟单片机片内资源,从而实现调试的目的,但是软件调试存在一些问题,如计算机本身是多任务系统,划分执行时间片是由操作系统本身完成的,无法得到控制,这样就无法时时的模拟单片机的执行时序,也就是说,不可能像真正的单片机运行环境那样执行的指令在同样一个时间能完成(往往要完成的比单片机慢)。为了解决软件调试的问题,第二种是硬件调试,硬件调试其实也需要计算机软件的配合,大致过程是这样的:计算机软件把编译好的程序通过串行口、并行口或者USB口传输到硬件调试设备中(这个设备叫仿真器),仿真器仿真全部的单片机资源(所有的单片机接口,并且有真实的引脚输出),仿真器可以接入实际的电路中,然后与单片机一样执行。同时,仿真器也会返回单片机内部内存与时序等情况给计算机的辅助软件,这样就可以在软件里看到真实的执行情况。不仅如此,还可以通过计算机断的软件实现单步、全速、运行到光标的常规调试手段。 图1:仿真器 总结一下两者的不同与相同: 相同点: 1:都可以检测单片机执行时序下的片内资源情况(如R0-R7 、PC计数器等) 2:可以实现断点、全速、单步、运行到光标等常规调试手段。 不同:

Visual Studio调试之断点进阶篇

在上一篇文章Visual Studio调试之断点基础篇里面介绍了什么是断点,INT 是Intel 系列CPU的一个指令,可以让程序产生一个中断或者异常。程序中如果有中断或者异常发生了以后,CPU会中断程序的执行,去一个叫做IDT的部件查找处理这个中断(或者异常)的例程(Handler)。IDT是操作系统在启动的时候初始化的,至于IDT的细节问题,例如什么是IDT,怎样编写一个IDT的例程,怎样初始化IDT,可以去网上搜索一些资料。 总之,这里我们只要知道,CPU在执行程序指令过程中,碰到INT 3中断程序的执行,CPU 然后去IDT表里面找到处理断点的例程入口。这个例程要做的事情就是: 1.先看看机器里面是不是安装了一个调试器—记住,这一步很重要,之所以重要以 后的文章里面会介绍。 2.如果机器里面没有安装调试器,那么操作系统就会终止程序的执行。 3.否则操作系统启动调试器,并将调试器附到进程上。 4.这样,我们才能在调试器里面检查程序内部变量的值。 前面文章里面的INT 3 (或者DebugBreak(),或者Debugger.Break())指令是我们自己在代码里面硬编码进去的,因此我们在Visual Studio里,在相应的代码行里面点一下,出现一个小红球,也就是说Visual Studio在程序指令集某个地方动态地添加了一个INT 3指令。现在的问题来了,Visual Studio是如何在程序中正确找到插入INT 3指令的位置的? 或者更具体一些,我们在源代码(文本文件)里面设置断点的,Visual Studio需要把代码行翻译成在程序指令集中的位置。Visual Studio之所以需要做翻译,是因为通常一行C++或者C#代码都会对应好几行汇编指令。 因此,Visual Studio需要一个额外的文件来执行这个翻译过程,这个额外的文件叫做调试符号文件(Symbols),是由编译器生成的。Visual Studio系列的编译器,不论是C#、https://www.sodocs.net/doc/346766685.html,还是C++编译器都会生成这个调试符号文件,.pdb 文件。所以如果你花一点时间看看Debug文件夹的话,你就会发现这个文件。 因此我们来看看Visual Studio支持的各种断点,并解释各种断点的实现方式 条件断点 首先我们先看看如何设置条件断点,条件断点有两种,一种是根据触发的次数来设置,另外一种是根据一条预置的条件来设置。 根据触发次数设置 比如说,你有一个循环,循环1000次,你知道有一个BUG总是在500次之后才会出现,因此肯定希望在循环内设置一个断点,但是前面500次都不会触发这个断点,否则连续按500次的F5的确不是一件轻松的差事。

KEIL51调试时一些的错误总结

KEIL51调试时一些的错误总结 (1)提示无M51文件 编译时候提示: F:\...\XX.M51 File has been changed outside the editor, reload ? ------ 解决方法: 重新生成项目,产生STARTUP.A51即可。 (2)L15重复调用 ***WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: ?PR?SPI_RECEIVE_WORD?D_SPI CALLER1: ?PR?VSYNC_INTERRUPT?MAIN CALLER2: ?C_C51STARTUP 该警告表示连接器发现有一个函数可能会被主函数和一个中断服务程序(或者调用中断服务程序的函数)同时调用,或者同时被多个中断服务程序调用。 出现这种问题的原因之一是这个函数是不可重入性函数,当该函数运行时它可能会被一个中断打断,从而使得结果发生变化并可能会引起一些变量形式的冲突(即引起函数内一些数据的丢失,可重入性函数在任何时候都可以被ISR 打断,一段时间后又可以 运行,但是相应数据不会丢失)。 原因之二是用于局部变量和变量(暂且这样翻译,arguments,[自变量,变元一数值,用于确定程序或子程序的值])的内存区被其他函数的内存区所覆盖,如果该函数被中断,则它的内存区就会被使用,这将导致其他函数的内存冲突。 例如,第一个警告中函数WRITE_GMVLX1_REG 在D_GMVLX1.C 或者 D_GMVLX1.A51被定义,它被一个中断服务程序或者一个调用了中断服务程序的 函数调用了,调用它的函数是VSYNC_INTERRUPT,在MAIN.C中。 解决方法: 如果你确定两个函数决不会在同一时间执行(该函数被主程序调用并且中断被禁止),并且该函数不占用内存(假设只使用寄存器),则你可以完全忽略这种警告。 如果该函数占用了内存,则应该使用连接器(linker)OVERLAY指令将函数从覆盖分析(overlay analysis)中除去,例如: OVERLAY (?PR?_WRITE_GMVLX1_REG?D_GMVLX1 ! *) 上面的指令防止了该函数使用的内存区被其他函数覆盖。如果该函数中调用了其他函数,而这些被调用在程序中其他地方也被调用,你可能会需要也将这些函数排除在覆盖分析(overlay analysis)之外。这种OVERLAY指令能使编译器除去上述警告信息。 如果函数可以在其执行时被调用,则情况会变得更复杂一些。这时可以采用以下几种方法:

实验一-Keil软件的使用及简单程序的调试方法

实验一Keil软件的使用及简单程序的调试方法 一、实验目的 掌握Keil的使用方法和建立一个完整的单片机汇编语言程序的调试过程及方法。 二、实验器材 计算机1台 三、实验内容 1.Keil的使用方法。 2.建立一个单片机汇编语言程序的调试过程及方法 四、实验步骤 1.Keil的使用方法。Keil C51 软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编,PLM 语言和C 语言的程序设计,界面友好,易学易用。启动Keil 后的界面如下:

几秒钟后即进入Keil的编辑界面。用户便可建立项目及应用程序。 2.简单程序的调试方法 Keil是通过项目工程来管理汇编程序的。因此在调试程序前必须建立一个工程,工程名称及保存位置由用户来指定,注意每位同学的工程名称用“学号姓名实验*”来命名。 (1)建立一工程 单击Project菜单,在弹出的下拉菜单中选中New Project选项。并在弹出的对话框中确定保存的位置及工程名称。 又弹出一对话框,要求用户选择相应的硬件CPU及相关设置。选择Atmel公司的AT89C51单片机。如下图所示

单击“确定”后在弹出的对话框中行选择“否”即工程建好了,但该工程没有任何语句,需要再建一个程序文件并将其添加到此工程中。 (2)建一文件 单击“File”/“New”命令,则弹出文件的编辑窗口,此时该文件还没有指明其文件名称及保存位置,该文件还没有加载到所建立的工程中。单击“File”/“Save”命令在弹出的对话框中指明文件的类型为.ASM汇编型及文件名后单击“保存”即可进行汇编源文件的编辑。如下图所示。 (3)将文件添加到工程中 单击“T arget 1”前的“+”号则展开后变成“-”号,并右键单击“Source Group 1”在弹出的下拉菜单中执行“Add Files to Group ‘Source Group 1’”命令并弹出对话框在该对话框中的“文件类型”下拉列表中选择“Asm source file”后找到要添加的文件名并选中,单击“Add”即可。

如何高效使用GDB断点

在gdb中,断点通常有三种形式 断点(BreakPoint): 在代码的指定位置中断,这个是我们用得最多的一种。设置断点的命令是break,它通常有如下方式: 可以通过info breakpoints [n]命令查看当前断点信息。此外,还有如下几个配套的常用命令: 观察点(WatchPoint): 在变量读、写或变化时中断,这类方式常用来定位bug。

捕捉点(CatchPoint): 捕捉点用来补捉程序运行时的一些事件。如:载入共享库(动态链接库)、C++的异常等。通常也是用来定位bug。 捕捉点的命令格式是:catch ,event可以是下面的内容 自动删除。 捕捉点信息的查看方式和代码断点的命令是一样的,这里就不多介绍了。 在特定线程中中断 你可以定义你的断点是否在所有的线程上,或是在某个特定的线程。GDB很容易帮你完成这一工作。

break thread break thread if ... linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID,注意,这个ID是GDB分配的,你可以通过"info threads"命令来查看正在运行程序中的线程信息。如果你不指定thread 则表示你的断点设在所有线程上面。你还可以为某线程指定断点条件。如: (gdb) break frik.c:13 thread 28 if bartab > lim 当你的程序被GDB停住时,所有的运行线程都会被停住。这方便你你查看运行程序的总体情况。而在你恢复程序运行时,所有的线程也会被恢复运行。那怕是主进程在被单步调试时。 在特定条件下中断 条件断点的一种特殊场景是在断点命中指定次数后停下来。事实上每个断点都有一个 ignore count, 他是一个正整数。通常情况下它的值为0,所以看不出来它的存在。但是如果它是一个非0值, 那么它将在每次命中后都将 count 减 1,直到它为 0. ignore bnum count 恢复程序运行和单步调试 在gdb中,和调试步进相关的命令主要有如下几条: 参考资料

Keil C 编译器常见警告与错误信息

https://www.sodocs.net/doc/346766685.html,/support/man/docs/c51/c51_c277.htm错误信息查询 Keil C 编译器常见警告与错误信息 error C132 :“****”not in formal parameter list 花了偶将近半个小时来查找错误,最终发现原来是在头文件里的一个函数声明时露了一个分号造成紧挨着在它下面声明的参数not in formal parameter list。 记在在这里,免得以后忘记了,同时也供大家分享。 下面是另外一些常见的错误提示: 1.第一种错误信息 ***WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: ?PR?_WRITE_GMVLX1_REG?D_GMVLX1 CALLER1: ?PR?VSYNC_INTERRUPT?MAIN CALLER2: ?C_C51STARTUP ***WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: ?PR?_SPI_SEND_WORD?D_SPI CALLER1: ?PR?VSYNC_INTERRUPT?MAIN CALLER2: ?C_C51STARTUP ***WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: ?PR?SPI_RECEIVE_WORD?D_SPI CALLER1: ?PR?VSYNC_INTERRUPT?MAIN CALLER2: ?C_C51STARTUP - 该警告表示连接器发现有一个函数可能会被主函数和一个中断服务程序(或者调用中断服务程序的函数)同时调用,

Keil软件及其调试功能简介

Keil软件及其调试功能简介 目前流行的51系列单片机开发软件是德国Keil公司推出的Keil C51软件,它是一个基于32位Windows环境的应用程序,支持C 语言和汇编语言编程,其6.0以上的版本将编译和仿真软件统一为μVision(通常称为μV2)。Keil提供包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,由以下几部分组成:μVision IDE集成开发环境(包括工程管理器①、源程序编辑器②、程序调试器③,见图2)、C51编译器、A51汇编器、LIB51库管理器、BL51连接/定位器、OH51目标文件生成器以及Monitor-51、RTX51实时操作系统。 应用Keil进行软件仿真开发的主要步骤为:编写源程序并保存—建立工程并添加源文件—设置工程—编译/汇编、连接,产生目标文件—程序调试。Keil使用“工程”(Project)的概念,对工程(而不能对单一的源程序)进行编译/汇编、连接等操作。工程的建立、设置、编译/汇编及连接产生目标文件的方法非常易于掌握。首先选择菜单File-New…,在源程序编辑器中输入汇编语言或C语言源程序(或选择File-O pen…,直接打开已用其它编辑器编辑好的源程序文档)并保存,注意保存时必须在文件名后加上扩展名.asm(.a51)或.c;然后选择菜单Project-New Project…,建立新工程并保存(保存时无需加扩展名,也可加上扩展名.uv2);工程保存后会立即弹出一个设备选择对话框,选择CPU后点确定返回主界面。这时工程管理窗口的文件页(Files)会出现“Target1”,将其前面+号展开,接着选择Source Group1,右击鼠标弹出快捷菜单,选择“Add File to Group ‘Source Group1’”,出现一个对话框,要求寻找并加入源文件(在加入一个源文件后,该对话框不会消失,而是等待继续加入其它文件)。加入文件后点close返回主界面,展开“Source Group1”前面+号,就会看到所加入的文件,双击文件名,即可打开该源程序文件。紧接着对工程进行设置,选择工程管理窗口的Target1,再选择Project-Option for Target‘Target1’(或点右键弹出快捷菜单再选择该选项),打开工程属性设置对话框,共有8个选项卡,主要设置工作包括在Target选项卡中设置晶振频率、在Debug选项卡中设置实验仿真板等,如要写片,还必须在Output选项卡中选中“Creat Hex Fi”;其它选项卡内容一般可取默认值。工程设置后按F7键(或点击编译工具栏上相应图标)进行编译/汇编、连接以及产生目标文件。 成功编译/汇编、连接后,选择菜单Debug-Start/Stop Debug Session(或按Ctrl+F5键)进入程序调试状态,Keil提供对程序的模拟调试功能,内建一个功能强大的仿真CPU以模拟执行程序。Keil能以单步执行(按F11或选择Debug-Step)、过程单步执行(按F10或选择Debug-Step Over)、全速执行等多种运行方式进行程序调试。如果发现程序有错,可采用在线汇编功能对程序进行在线修改(Debug-Inline Assambly…),不必执行先退出调试环境、修改源程序、对工程重新进行编译/汇编和连接、然后再次进入调试状态的步骤。对于一些必须满足一定条件(如按键被按下等)才能被执行的、难以用单步执行方式进行调试的程序行,可采用断点设置的方法处理(Debug-Insert/Remove Breakpoint或Debug-Breakpoints…等)。在模拟调试程序后,还须通过编程器将.hex目标文件烧写入单片机中才能观察目标样机真实的运行状况。 Keil软件Eval版(免费产品)的功能与商业版相同,只是程序的最大代码量不得超过2kB,但对初学者而言已是足够。Keil软件由于其

KEIL常见编译错误大全

KEIL常见编译错误大全 【致命错误】 立即终止编译这些错误通常是命令行指定的无效选项的结果当编译器不 能访问一个特定的源包含文件时也产生致命错误 致命错误信息采用下面的格式 C51FATAL-ERROR– ACTION: LINE: ERROR: C51TERMIANTED. C51FATAL-ERROR– ACTION: FILE: ERROR: C51TERMIANTED. 下面说明Action和Error中可能的内容 Actions ALLOCATING MEMORY 编译器不能分配足够的存储区来编译指定的源文件. CREATING LIST-FILE/OBJECT-FILE/WORKFILE 编译器不能建立列表文件,OBJ文件,或工作文件这个错误的出现可能是磁盘满或写保护,或文件已存在和只读. GENERATING INTERMEDIATE CODE 源文件包含的一个函数太大,不能被编译器编译成虚拟代码.尝试把函数分小或重新编译. OPENING INPUT-FILE 编译器不能发现或打开所选的源或包含文件. PARSING INVOKE-/#PRAGMA-LINE 当在命令行检测到参数计算,或在一个#pragma中检测到参数计算,就产生这样的错误. PARSING SOURCE-FILE/ANALYZING DECLARATIONS 源文件包含太多的外部参考.减少源文件访问的外部变量和函数的数目. WRITING TO FILE

keil调试经验

KEIL调试高级技巧 在调试状态,Debug 菜单项中的命令可以使用了,有关编译的工具栏按钮消失了,出现了一个用于运行和调试的工具栏,Debug 菜单上的大部份命令都有相应的快捷按钮。 从左到右依次是复位、运行、暂停、单步跟踪、单步、执行完当前子程序、运行到当前行、下一状态、打开跟踪、观察跟踪、反汇编窗口、观察窗口、代码作用范围分析、1#串行窗口、内存窗口、性能分析、工具按钮命令; 然后按一下图示第二个“运行”按钮。连接上相关的实验资源,本实验用一条 8PIN的数据排线把实验仪的CPU部份的P1口(JP44)连接到八路指示灯部份的JP32。这时你会看到实验仪的八个红色LED,轮流点亮,表示运行成功,也可以查看相关的变量和参数,非常方便。 ⒈单步跟踪运行 使用菜单Debug->Step 或上图第四个单步运行按钮或使用快捷键 F11 可以单 步跟踪执行程序,在这里我们按下 F11 键,即可执行该箭头所指程序行,每按一次 F11,可以看到源程序窗口的左边黄色调试箭头指向下一行,如果程序中有Delay延时子程序,则会进入延时程序中运行。 ⒉单步运行 如果Delay 程序有错误,可以通过单步跟踪执行来查找错误,但是如果 Delay 程序已正确,每次进行程序调试都要反复执行这些程序行,会使得调试效率很低,为此,可以在调试时使用 F10 来替代 F11(也可使用菜单 Step Over 或相应的命令按钮),在 main 函数中执行到 Delay时将该行作为一条语句快速执行完

毕。为了更好的进行对比,我们重新进入仿真环境,将反汇编窗口关闭,不断按F10 键,可以看到在源程序窗口中的左边黄色调试箭头不会进入到延时子程序。 ⒊全速运行 点击工具栏上的“运行”按钮或按F5 键启动全速运行,全速执行程序,此时用户板上的 P1 口所接 LED 以流水灯状态显示。 ⒋暂停 点击工具栏上的按钮,此时用户板上的P1 口所接 LED 停止以流水灯状态显示,只有一个 LED 灯点亮(取决于暂停前的 P1 的值)。 ⒌观察/修改寄存器的值 Project 窗口在进入调试状态后显示 Regs 页的内容,包括工作寄存器 R0~R7 的内容和累加器 A、寄存器 B、堆栈指针 SP 的内容。 用户除了可以观察以外还可自行修改,例如将寄存器a 的值 0x62 改为 0x85。方法一:用鼠标点击选中单元a,然后再单击其数值位置,出现文字框后输入0x85 按回车键即可; 方法二:在命令行窗口,输入A=0x85,按回车键将把 A 的数值设置为 0x85

eclipse断点调试指导

1.进入debug模式(基础知识列表) 1、设置断点 2、启动servers端的debug模式 3、运行程序,在后台遇到断点时,进入debug调试状态 ============================= 作用域功能快捷键 全局单步返回F7 全局单步跳过F6 全局单步跳入F5 全局单步跳入选择Ctrl+F5 全局调试上次启动F11 全局继续F8 全局使用过滤器单步执行Shift+F5 全局添加/去除断点Ctrl+Shift+B 全局显示Ctrl+D 全局运行上次启动Ctrl+F11 全局运行至行Ctrl+R 全局执行Ctrl+U ============================= 1.Step Into (also F5) 跳入 2.Step Over (also F6) 跳过 3.Step Return (also F7) 执行完当前method,然后return跳出此

method 4.step Filter 逐步过滤一直执行直到遇到未经过滤的位置或断点(设置Filter:window-preferences-java-Debug-step Filtering) 5.resume 重新开始执行debug,一直运行直到遇到breakpoint。 例如:A和B两个断点,debug过程中发现A断点已经无用,去除A 断点,运行resume就会跳过A直接到达B断点。 6.hit count 设置执行次数适合程序中的for循环(设置breakpoint view-右键hit count) 7.inspect 检查运算。执行一个表达式显示执行值 8.watch 实时地监视对象、方法或变量的变化 9.我们常说的断点(breakpoints)是指line breakpoints,除了line breakpoints,还有其他的断点类型:field(watchpoint)breakpoint,method breakpoint ,exception breakpoint. 10.field breakpoint 也叫watchpoint(监视点) 当成员变量被读取或修改时暂挂 11.添加method breakpoint 进入/离开此方法时暂挂(Run-method breakpoint) 12.添加Exception breakpoint 捕抓到Execption时暂挂(待续...) 断点属性: 1.hit count 执行多少次数后暂挂用于循环 2.enable condition 遇到符合你输入条件(为ture\改变时)就暂挂 3.suspend thread 多线程时暂挂此线程 4.suspend VM 暂挂虚拟机 13.variables 视图里的变量可以改变变量值,在variables 视图选择变

Keil编译常见问题

Error: L6200E Error: L6200E: Symbol temp multiply defined (by and .在编译的时候出现了这个问题,但是检查不出来,希望各位大侠帮帮忙 什么变量你给付了两次值 你看看是不是那个外部变量你又给赋值了 申明,其他.c文件对应的.h文件中用extern引用 error: #20 error: #20: identifier "TIM2_IRQChannel" is undefined 谁能说说,哪里错了 你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。 TIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。需要将.C文件添加到工程文件中 warning: #1-D (7): warning: #1-D: last line of file ends without a newline 当使用keil编译时,弹出这样的警告信息:(7): warning: #1-D: last line of file ends without a newline 这个是由于在main函数的“}”后,没有加回车。 只要在main函数的“}”后加回车键,此警告信息即可消除。 error:#65 ...(27):error:#65:expected a ";"

分数送你了,问题在你回答之前已经解决了,头文件里的结构体定义里的最后一行没有加";" 如NB menu{..}; error:#1113: 折腾了大半天,才搞明白一个空操作的指令 先在网上查有的说是__asm{NOP;},从里调用,可犄角旮旯全找了,也没看到什么的文件。如果直接用,就出现error:#1113:InlineassemblernotpermittedwhengeneratingThumbcode 最后搜索这条错误,知道是因为__asm("指令");这种语法是内联汇编(inlineassembly)的语法。而RMDK下,内联汇编仅支持ARM汇编语言,不支持Thumb或者Thumb-2汇编语言;但内嵌汇编器支持Thumb和Thumb-2。 __asm放到一个单独的子函数再被调用就没问题了 如下: __asmvoidnop(void) { NOP } 然后在之后的C代码中调用该函数: voidmain() { ... nop(); ...? }

怎么样在KEIL_C软件中调试程序

首先建立工程。选[Project\New Project],选择工程保存的路径,及为工程命名。例如将其存放在D:\新建文件夹(2),命名为123。输入完工程名后会打开一个如下图所示的对话框,在这里我们选择CPU的型号,根据我们选用的CPU芯片的不同,这里的设置不同。在这里我们选用 Atmel\AT89C51。 接下来弹出一个如下图的对话框。该对话框提示你是否要把标准8051的启动代码添加到工程中去。如用C语言写程序,一般选“否”,但是,如果用到了某些增强功能需要初始化配置时,则可选“是”。在这里,我们选“否”,即不添加启动代码。 新建文件。在[File\New]建一个文件,将程序写入。这里以一个00-99秒计时器程序为例。程序如下 #include unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90}; //共阳数码管段0-9 unsigned char Second; delay10ms() //延时10毫秒 { unsigned int i,j; for(i=0;i<10;i++) for(j=0;j<120;j++); } leds() //显示子函数 { P0_0=0; //选通P0_0数码管 P2=table[Second/10]; //送段值 delay10ms(); //延时 P2=0xff; //消影 P0_0=1; //消除P0_0选通状态 P0_1=0; //选通P0_0数码管 P2=table[Second%10]; //送段值 delay10ms(); //延时 P2=0xff; //消影 P0_1=1; //消除P0_0选通状态 } void delay1s(void) //延时1秒 { unsigned char j; for(j=50;j>0;j--) leds(); } void main(void) { Second=0; //显示置0 while(1) //主循环 { delay1s();// 延时 Second++; //自加 if(Second==60) //判断是否到60

VS环境断点调试技巧_85920453_597709898

VS环境断点调试技巧 设置断点:在如下图中的红色圆点处设置断点,红色圆点表示已经在这行设置断点。 启动调试:按F5或者点击左边红框中的按钮。右边框是开始执行(不调试)Ctrl+F5。 调试工具栏:下面是工具栏中对应的名称和快捷键。 在调试过程中F5是执行到下一个断点。F11是逐语句,在执行到下图中的断点时,按F11会执行到Fibonacci方法里面逐步记录执行过程。F10是逐过程,与逐语句不同的是,在执行到下图中断点时,再执行会执行断点下面的语句,而不是去执行语句中的方法。

局部变量:在调试过程中可以查看局部变量窗口,如下图里面会有变量的当前状态。如果找不到的话在 数组的状态表示如下图: InteliTrace记录每一步的调试状态。

条件中断 开发人员设置断点,运行程序,利用不同的输入触发断点,然后在断点处手工检查是否满足某些特定的条件,从而决定是否继续调查。如果当前场景不是他们想要的,按F5继续运行程序,尝试别的输入,手动重复刚才的过程。 针对上述情况,Visual Studio提供了一个方便得多的功能——“条件中断”。只有当程序满足了开发人员预设的条件后,条件断点才会被触发,调试器中断。这将避免频繁地手工检查/恢复程序运行,大量减少调试过程中的手工和烦琐工作。 如何设置条件断点: 设置条件断点非常容易。在特定的行上,按F9设置断点。 然后右击断点–编辑窗口左侧的红点,在上下文菜单上选择“条件”。 这时弹出一个对话框供你设置激活该断点所需的条件。比如:我们希望只有当x==5时,调试才中断。我们可以写出如下的表达式:

现在我再运行这个程序按F5达到条件断点,只有当x等于5时,程序运行才会被中断。对于其它条件下的x值,断点将被跳过。 记录到达断点次数 有时你希望,只有当第N次满足条件的运行到达断点时,才中断程序运行。例如:当第一次命中断点。可以通过右击断点,然后在弹出菜单上选择“命中次数”菜单命令实现。 这时系统弹出一个对话框,它允许你指定:(1)当满足条件,而且进入断点的累计次数等于N时,断点命中一次。(2)当满足条件,而且进入断点的累计次数是N的倍数时,断点命中一次。(3)当满足条件,而且进入断点的累计次数大于N时,每次命中断点。 注意:如果多个条件同时用的话,结果取交集。

Keil编程常见错误

uint i, j; uchar a = 0xfe; EA = 1; EX0 = 1;不能这样 EA = 1; EX0 = 1; uint i, j; uchar a = 0xfe; 否则出现外部中断.C(18): error C141: syntax error near 'unsigned' 外部中断.C(18): error C202: 'i': undefined identifier 外部中断.C(19): error C141: syntax error near 'unsigned' 外部中断.C(19): error C202: 'a': undefined identifier 外部中断.C(23): error C202: 'i': undefined identifier 外部中断.C(27): error C202: 'a': undefined identifier 外部中断.C(29): error C202: 'a': undefined identifier 外部中断.C(31): error C202: 'i': undefined identifier 外部中断.c - 8 Error(s), 0 Warning(s). 原因:顺序问题,keil中的顺序 外部中断和内部中断的区别是什么; 外部中断是在单片机的外面给单片机一个信号单片机收到这个信号开始中断这是外部中断 内部中断是通过软件把中断打开执行中断

error c236:‘——display’:different length of parameter lists参数列表的长度不同。 检查开始的函数声明和这定义的参数是否一致。 还有参数没说明类型 有很大的区别, 错误3 unreferenced local variable 是未使用定义的变量,就是你定义了但是没有使用。 错误4 syntax error语法错误。 电平触发方式是按照电平的高或者低来触发,所以用的时候,必须在发生触发事件后立即将电平拉到非触发电平上,如果不这样做的话,会导致程序一直在触发事件程序入口处,而不会执行其他地方的程序。所以一般比较少用。 边沿触发方式是按照(上或下)边沿触发事件,由于触发的条件是边沿(上或下),所以即使在触发事件后,保存原来的电平都没有关系,不会一直在触发的,一般都用这种方式。 错误5 #define uchar unsigned char 不能写成 #define unsigned char uchar 否则出现会出现很多错误 错误6 不能这样定义字符数组 int a = “wwwsad”只能用char 错误7 error C244: 'table':can't initialize, bad type or class 。意思是错误的或者坏的类

keil c 的在线调试与断点设置

Keil 的调试命令、在线汇编与断点设置 上一讲中我们学习了如何建立工程、汇编、连接工程,并获得目标代码,但是做到这一步仅仅代表你的源程序没有语法错误,至于源程序中存在着的其它错误,必须通过调试才能发现并解决,事实上,除了极简单的程序以外,绝大部份的程序都要通过反复调试才能得到正确的结果,因此,调试是软件开发中重要的一个环节,这一讲将介绍常用的调试命令、利用在线汇编、各种设置断点进行程序调试的方法,并通过实例介绍这些方法的使用。 一、常用调试命令 在对工程成功地进行汇编、连接以后,按Ctrl+F5 或者使用菜单 Debug->Start/Stop Debug Session 即可进入调试状态,Keil 内建了一个仿真CPU 用来模拟执行程序,该仿真CPU 功能强大,可以在没有硬件和仿真机的情况下进行程序的调试,下面将要学的就是该模拟调试功能。不过在学习之前必须明确,模拟毕竟只是模拟,与真实的硬件执行程序肯定还是有区别的,其中最明显的就是时序,软件模拟是不可能和真实的硬件具有相同的时序的,具体的表现就是程序执行的速度和各人使用的计算机有关,计算机性能越好,运行速度越快。 进入调试状态后,界面与编缉状态相比有明显的变化,Debug 菜单项中原来不能用的命令现在已可以使用了,工具栏会多出一个用于运行和调试的工具条,如图1 所示,Debug 菜单上的大部份命令可以在此找到对应的快捷按钮,从左到右依次是复位、运行、暂停、单步、过程单步、执行完当前子程序、运行到当前行、下一状态、打开跟踪、观察跟踪、反汇编窗口、观察窗口、代码作用范围分析、1#串行窗口、内存窗口、性能分析、工具按钮等命令。 接着执行下一行程序,中间不停止,这样程序执行的速度很快,并可以看到该 段程序执行的总体效果,即最终结果正确还是错误,但如果程序有错,则难 以确认错误出现在哪些程序行。单步执行是每次执行一行程序,执行完该行 程序以后即停止,等待命令执行下一行程序,此时可以观察该行程序执行完 以后得到的结果,是否与我们写该行程序所想要得到的结果相同,借此可以 找到程序中问题所在。程序调试中,这两种运行方式都要用到。 使用菜单STEP 或相应的命令按钮或使用快捷键F11 可以单步执行程序, 使用菜单STEP OVER 或功能键F10 可以以过程单步形式执行命令,所谓 过程单步,是指将汇编语言中的子程序或高级语言中的函数作为一个语句来

keil c语言编程常见错误分析要点

1. Warning 280:’i’:unreferenced local variable 说明局部变量i 在函数中未作任何的存取操作解决方法消除函数中i 变量的宣告及即定义的参数在程序中并未调用 2 Warning 206:’Music3’:missing function-prototype 说明Music3( )函数未作宣告或未作外部宣告所以无法给其他函数调用 解决方法将叙述void Music3(void)写在程序的最前端作宣告如果是其他文件的函数则要写成extern void Music3(void),即作外部宣告 3Error:318:can’t open file ‘beep.h’ 说明在编译C:\8051\MANN.C 程序过程中由于main.c 用了指令#i nclude “beep.h”,但却找不到所致解决方法编写一个beep.h 的包含档并存入到c:\8051 的工作目录中 4 Error 237:’LedOn’:function already has a body 说明LedOn( )函数名称重复定义即有两个以上一样的函数名称 解决方法修正其中的一个函数名称使得函数名称都是独立的 5 ***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_DELAYX1MS?DELAY 说明DelayX1ms( )函数未被其它函数调用也会占用程序记忆体空间

解决方法去掉DelayX1ms( )函数或利用条件编译#if …..#endif,可保留该函数并不编译 6 ***WARNING 6 :XDATA SPACE MEMORY OVERLAP FROM : 0025H TO: 0025H 说明外部资料ROM 的0025H 重复定义地址 解决方法外部资料ROM 的定义如下Pdata unsigned char XFR_ADC _at_0x25 其中XFR_ADC 变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25 处并修正它 7 WARNING 206:’DelayX1ms’: missing function-prototype C:\8051\INPUT.C Error 267 :’DelayX1ms ‘:requires ANSI-style prototype C:\8051\INPUT.C 说明程序中有调用DelayX1ms 函数但该函数没定义即未编写程序内容或函数已定义但未作宣告 解决方法编写DelayX1ms 的内容编写完后也要作宣告或作外部宣告可在delay.h 的包含档宣告成外部以便其它函数调用 8 ***WARNING 1:UNRESOLVED EXTERNAL SYMBOL SYMBOL:MUSIC3

keil常见错误及解决办法

查看文章 【转】 KEIL C编译器常见警告与错误信息的解决办法 2010-09-03 16:21 转载自朝阳暮鼓 最终编辑朝阳暮鼓 KEIL C编译器常见警告与错误信息的解决办法 1. Warning 280:’i’:unreferenced local variab le 说明局部变量i 在函数中未作任何的存取操作 解决方法消除函数中i 变量的宣告 2 Warning 206:’Music3’:missing function-prototype 说明Music3( )函数未作宣告或未作外部宣告所以无法给其他函数调用 解决方法将叙述void Music3(void)写在程序的最前端作宣告如果是其他文件的函数 则要写成extern void Music3(void),即作外部宣告 3 Compling :C:\8051\MANN.C Error:318:can’t open file ‘beep.h’ 说明在编译 C:\8051\MANN.C 程序过程中由于main.c 用了指令#include “beep.h”,但却找不到所致 解决方法编写一个beep.h 的包含档并存入到c:\8051 的工作目录中 4 Compling:C:\8051\LED.C Error 237:’LedOn’:function already has a body 说明LedOn( )函数名称重复定义即有两个以上一样的函数名称 解决方法修正其中的一个函数名称使得函数名称都是独立的 5 ***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_DELAYX1MS?DELAY 说明DelayX1ms( )函数未被其它函数调用也会占用程序记忆体空间 解决方法去掉 DelayX1ms( )函数或利用条件编译#if …..#endif,可保留该函数并不编译 6 ***WARNING 6 :XDATA SPACE MEMORY OVERLAP FROM : 0025H TO: 0025H 说明外部资料ROM 的0025H 重复定义地址 解决方法外部资料ROM 的定义如下 Pdata unsigned char XFR_ADC _at_0x25 其中XFR_ADC 变量的名称为0x25,请检查是 否有其它的变量名称也是定义在0x25 处并修正它

在KEIL C中调试程序

在KEIL C中调试程序 首先建立工程。选[Project\New Project],选择工程保存的路径,及为工程命名。例如将其存放在D:\新建文件夹(2),命名为123。输入完工程名后会打开一个如下图所示的对话框,在这里我们选择CPU的型号,根据我们选用的CPU芯片的不同,这里的设置不同。在这里我们选用Atmel\AT89C51。 接下来弹出一个如下图的对话框。该对话框提示你是否要把标准8051的启动代码添加到工程中去。如用C 语言写程序,一般选“否”,但是,如果用到了某些增强功能需要初始化配置时,则可选“是”。在这里,我们选“否”,即不添加启动代码。 新建文件。 在[File\New]建一个文件,将程序写入。这里以一个00-99秒计时器程序为例。程序如下 #include unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90}; //共阳数码管段0-9 unsigned char Second; delay10ms() //延时10毫秒

for(j=0;j<120;j++); } leds() //显示子函数 { 0_0=0; //选通P0_0数码管 P2=table[Second/10]; //送段值 delay10ms(); //延时 P2=0xff; //消影 P0_0=1; //消除P0_0选通状态 P0_1=0; //选通P0_0数码管 P2=table[Second%10]; //送段值 delay10ms(); //延时 P2=0xff; //消影 P0_1=1; //消除P0_0选通状态 } void delay1s(void) //延时1秒 { unsigned char j; for(j=50;j>0;j--) leds(); } void main(void) { Second=0; //显示置0 while(1) //主循环 { delay1s();// 延时 Second++; //自加 if(Second==60) //判断是否到60 { Second=0; //到60置0 } leds(); //显示子程序 } } 保存文件。选[File\Save],将其保存在刚建的工程下。这里是用的C语言编程,所以后缀名要加上”.C”。这里我们将其命名为“Text1.c“。注意扩展名“.C”不可省略。打开工程[Project\Open Project],在左窗口中单击右键,选“Add files to Group “Source Gropu 1“,将程序Text1.c加载到工程。只有经过这一步才能对程序进行下面的编译及调试。