共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 跳转至页
回复
打赏帖 | |
---|---|
【STM32F769】调试SD驱动,由于其时钟配置不对引起的错误以及排查记录被打赏35分 | |
C语言函数宏的三种封装方式被打赏50分 | |
【STM32F769】记一次由于开启D-Cache之后DMA数据传输出错的问题查找与解决被打赏35分 | |
嵌入式LinuxC语言程序调试和宏使用技巧被打赏50分 | |
让代码中包含最新的编译时间信息被打赏50分 | |
【分享开发笔记,赚取电动螺丝刀】STM32F769LVGL优化显示被打赏26分 | |
rtthread硬件加密--2crc加密分析被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】STM32F769驱动ST7789以及显示优化被打赏36分 | |
【分享开发笔记,赚取电动螺丝刀】S32K146 PAL模拟I2C驱动适配被打赏23分 | |
我想要一部加热台+电源硬件设计规范被打赏16分 |