共2条
1/1 1 跳转至页
EasyArm2200,BUG 怀疑是EasyArm2200的一个BUG
问
现象: 在easyARM2200配套的代码中,任意地方调用如下函数,将产生data abort的异常。
void function( void )
{
unsigned long *p = ( unsigned long * )0x81F80130; /* line 1 */
*p = 0xFFFFFFFF; /* line 2 */
}
问题: 为什么会产生data abort的异常? 如何解决?
相关资料: 1). 利用ARMcc中 -S的参数的功能,输出以上函数的汇编代码,如下
function PROC
LDR r0,|L1.16|
MVN r1,#0
STR r1,[r0,#0]
MOV pc,lr
|L1.16|
DCD 0x81f80130
ENDP
在系统初始化的时候调用这个函汇编数,也会产生同样的异常(注:我是通过在data abort异常处理
的入口点,添加点亮led的代码来判断是否进入data abort异常的)。
2).将line 2中的0xFFFFFFFF改成0x11111111,则不会产生异常。
3).将line 1中的0x81F80130改成0x81F80120,则不会产生异常。
4).line 1中的0x81F80130已经字对齐。
5).执行如下代码片断,同样会产生data abort的异常。
........
unsigned long *p = ( unsigned long * )0x81000000;
while( p < 81FFFFFF )
{
*p++ = 0; /* initialize ram */
}
注:执行这段代码的环境代码很小,且没有使用外部的ram。
6).相关的初始化代码
reset
ldr r0, =PINSEL2
ldr r1, =0x0f814914
str r1, [R0]
ldr r0, =BCFG0
ldr r1, =0x1000ffef
str r1, [R0]
ldr r0, =BCFG1
ldr r1, =0x1000ffef
str r1, [R0]
......
说明: 我在设计一个内存管理模块,以上的代码反映了调试中遇到的问题。 答 1: 测试通过,并没问题。/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2004-09-16
** Last Version: 1.0
** Descriptions: The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by: Chenmingji
** Created date: 2004-09-16
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
void function( void )
{
unsigned long *p = ( unsigned long * )0x81F80130; /* line 1 */
*p = 0xFFFFFFFF; /* line 2 */
}
int main (void)
{// add user source code
unsigned long *p = ( unsigned long * )0x81000000;
function();
while( p < (unsigned long *)0x81FFFFFF )
{
*p++ = 0; /* initialize ram */
}
return 0;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
void function( void )
{
unsigned long *p = ( unsigned long * )0x81F80130; /* line 1 */
*p = 0xFFFFFFFF; /* line 2 */
}
问题: 为什么会产生data abort的异常? 如何解决?
相关资料: 1). 利用ARMcc中 -S的参数的功能,输出以上函数的汇编代码,如下
function PROC
LDR r0,|L1.16|
MVN r1,#0
STR r1,[r0,#0]
MOV pc,lr
|L1.16|
DCD 0x81f80130
ENDP
在系统初始化的时候调用这个函汇编数,也会产生同样的异常(注:我是通过在data abort异常处理
的入口点,添加点亮led的代码来判断是否进入data abort异常的)。
2).将line 2中的0xFFFFFFFF改成0x11111111,则不会产生异常。
3).将line 1中的0x81F80130改成0x81F80120,则不会产生异常。
4).line 1中的0x81F80130已经字对齐。
5).执行如下代码片断,同样会产生data abort的异常。
........
unsigned long *p = ( unsigned long * )0x81000000;
while( p < 81FFFFFF )
{
*p++ = 0; /* initialize ram */
}
注:执行这段代码的环境代码很小,且没有使用外部的ram。
6).相关的初始化代码
reset
ldr r0, =PINSEL2
ldr r1, =0x0f814914
str r1, [R0]
ldr r0, =BCFG0
ldr r1, =0x1000ffef
str r1, [R0]
ldr r0, =BCFG1
ldr r1, =0x1000ffef
str r1, [R0]
......
说明: 我在设计一个内存管理模块,以上的代码反映了调试中遇到的问题。 答 1: 测试通过,并没问题。/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2004-09-16
** Last Version: 1.0
** Descriptions: The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by: Chenmingji
** Created date: 2004-09-16
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
void function( void )
{
unsigned long *p = ( unsigned long * )0x81F80130; /* line 1 */
*p = 0xFFFFFFFF; /* line 2 */
}
int main (void)
{// add user source code
unsigned long *p = ( unsigned long * )0x81000000;
function();
while( p < (unsigned long *)0x81FFFFFF )
{
*p++ = 0; /* initialize ram */
}
return 0;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
共2条
1/1 1 跳转至页
回复
我要赚赏金打赏帖 |
|
|---|---|
| 基于MCP23S17的输入输出功能模块控制被打赏¥20元 | |
| 【S32K3XX】SPD 软件包使用Link文件修改被打赏¥22元 | |
| Switch-Case局部变量定义问题被打赏¥23元 | |
| 基于米尔TIAM62L开发板的串口通信及应用被打赏¥20元 | |
| PCF8574功能模块及其使用被打赏¥20元 | |
| 传感器LSM6DSO及LIS3MDL的功能检测被打赏¥18元 | |
| LPS25HB气压传感器及其检测被打赏¥18元 | |
| HTS221温湿度传感器及其检测被打赏¥18元 | |
| 【S32K3XX】HSE FW 版本更新被打赏¥21元 | |
| 基于ArduinoUNO开发板的AT24C02读写测试被打赏¥16元 | |
我要赚赏金
