共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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动——B站互动赢积分】活动开启啦! | |
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |