This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

DS80C400 Conitguous Mode Memory Access Error

I am simulating the DS80C400 and have an access error.

Thanks in advance, Clayton.

First off, I am new to Keil and the DS80C400. I am using the eval uVision v2.38a with C51 V7.06, LX51 V3.58 until my real PK51 kit comes in.

The error
*** error 65: access violation at X:0x400003 : no 'write' permission.

This occurs at the line at the location between quotes "<<- PROBLEM ACCESS"
The extsp=0x0003 <- - Is this the problem, I am placing function calling return bytes to exec read territory?
This error occurs at entry point to init_rom() from main().

I used LX51, 16M Continuous Mode Access.
The register ACON=0xFE which is correct.

Main() is close to the end of this email where invokes init_rom()

Am I corrupting the interrupt vectors? I thought I read somewhere that there is an issue with Keil interrupt vectors and DS80C400 interrupt vectors.


(I have a similar problem if I don't use this function init_rom(), where I call a simple function that right upon entering the same access problem happens.)


From the Output Window some diagnostics:

Map
I:0x00 - I:0xFF read write
C:0x000000 - C:0x00FFFF exec read
C:0x400000 - C:0x4004D5 exec read
X:0x000000 - X:0x00FFFF read write
X:0x100000 - X:0x10000F read write
X:0xFFDB00 - X:0xFFFFFF read write

Scope
Tgroup 'unnamed':
Module '?C_STARTUP', source := 'startup400.a51'
Function '?C_CPURESET?0_AP0006_400000', range C:0x400000-C:0x400047
Module 'MAIN', source := 'main.c'
Function 'main', range C:0x400496-C:0x4004D5
Module 'ROM400_LIB_INIT', source := 'rom400_lib_init.a51'
Function '?PR?INIT_VERSION?ROM400_LIB_INIT_AP000F_000000', range C:0x40048D-C:0x400492
Module '?C?LSTXDATA', source := 'unknown'




This is the main() code:

#include "rom400_init.h"
#include <stdio.h>

// leave 4000h bytes for function parameters
#define RAM_START 0x14000
#define RAM_END 0x5FFFF

//void fun1(int x);
//void fun1(void);
/*
 * Main entry point.  Initialize the ROM.
 */
void main()
{
 int data i;
 int data j;

 init_rom(RAM_START, RAM_END);

 i = 0;
 j = 0;

 while(i<4)
 {
  j = j + i;
  i = i + 1;
 }
}


This is the Startup400.A51 and a main() disassembly.



 121: ?C_STARTUP: sjmp  past_loader_tag
 122: db 'TINI'  ; Tag for TINI Environment 1.02c
 123:    ; or later (ignored in 1.02b)
 124: $if (USE_MONITOR = 0)
 125: db  40H  ; Target bank
 126: $endif
 127: $if (USE_MONITOR = 1)
 128: db  20H  ; Target bank
 129: $endif
 130:
 131: past_loader_tag:
C:0x400000  8005 SJMP PAST_LOADER_TAG(C:0007)
C:0x400002  5449 ANL  A,#0x49
C:0x400004  4E ORL  A,R6
C:0x400005  49 ORL  A,R1
C:0x400006  40C2 JC C:FFCA
C:0x400008  AF75 MOV  R7,0x75
C:0x40000A  C7 XCH  A,@R1
C:0x40000B  AA75 MOV  R2,0x75
C:0x40000D  C7 XCH  A,@R1
C:0x40000E  5543 ANL  A,0x43
C:0x400010  9D SUBB A,R5
C:0x400011  020240 LJMP C:0240
C:0x400014  00 NOP
C:0x400015  16 DEC  @R0
 142: mov ta, #0xAA  ; Enable access to MCON
C:0x400016  75C7AA MOV  TA(0xC7),#SADDR1(0xAA)
 143: mov ta, #0x55
C:0x400019  75C755 MOV  TA(0xC7),#0x55
 144: mov mcon, #0xAF  ; Relocate RAM, data memory
C:0x40001C  75C6AF MOV  MCON(0xC6),#C0M5C(0xAF)
 145: mov ta, #0xAA  ; Enable access to ACON
C:0x40001F  75C7AA MOV  TA(0xC7),#SADDR1(0xAA)
 146: mov ta, #0x55
C:0x400022  75C755 MOV  TA(0xC7),#0x55
 147: orl acon, #0x04  ; Extended stack
 148:
 149: ;
 150: ; Make sure we are in a known state with respect to
 151: ; our fancy data pointers and register banks
 152: ;
C:0x400025  439D04 ORL  ACON(0x9D),#0x04
 153: mov dps, #0
C:0x400028  758600 MOV  DPS(0x86),#init_rom?BYTE(0x00)
 154: mov psw, #0
 155:
 156: ;
 157: ; Set stack to 0 (we lose one byte, but don't
 158: ; have to know the size)

Parents
  • *** error 65: access violation at X:0x400003 : no 'write' permission...

    This error indicates that the debugger doesn't know that XDATA address 0x400003 is accessable. The debugger map also indicates this:

    Map
    I:0x00 - I:0xFF read write
    C:0x000000 - C:0x00FFFF exec read
    C:0x400000 - C:0x4004D5 exec read
    X:0x000000 - X:0x00FFFF read write
    X:0x100000 - X:0x10000F read write
    X:0xFFDB00 - X:0xFFFFFF read write

    Typically, all memory areas that are assigned to objects in the object file are automatically mapped by the debugger. Memory areas that are simply accessed using an address (where no object is defined in the program) are not automatically mapped.

    Refer to the following knowledgebase article for details on mapping a memory area:

    http://www.keil.com/support/docs/814.htm

    Jon

Reply
  • *** error 65: access violation at X:0x400003 : no 'write' permission...

    This error indicates that the debugger doesn't know that XDATA address 0x400003 is accessable. The debugger map also indicates this:

    Map
    I:0x00 - I:0xFF read write
    C:0x000000 - C:0x00FFFF exec read
    C:0x400000 - C:0x4004D5 exec read
    X:0x000000 - X:0x00FFFF read write
    X:0x100000 - X:0x10000F read write
    X:0xFFDB00 - X:0xFFFFFF read write

    Typically, all memory areas that are assigned to objects in the object file are automatically mapped by the debugger. Memory areas that are simply accessed using an address (where no object is defined in the program) are not automatically mapped.

    Refer to the following knowledgebase article for details on mapping a memory area:

    http://www.keil.com/support/docs/814.htm

    Jon

Children