Succes was: m68k clock problem

Joel Sherrill joel.sherrill at OARcorp.com
Tue May 27 14:07:06 UTC 2003


Nicolas PIGEON wrote:

>YESSS !!! That was the problem, I just found it!!!
>In the file m68k/ods68302/startup/cpuboot.c, the GIMR is given the value 0, and it's never changed later. Thus, when a timer exception occurs, the exception vector used is 00001001 (binary) instead of the expected 10001001 (=0x89, the timer 1 exception in ckinit.c). Setting the GIMR at 0x0080 solved this.... Maybe it should be corrected in a future release?
>
>Anyway, thanks a lot averybody for your replies, it really helped me and I learnt a lot of things!! Once again, Thank you !!!!
>  
>

Chris, is this a generic problem or something that should be obviously 
user controllable?

--joel

>Nicolas
>
>
>  
>
>>Message du 27/05/03 12:12
>>De : Chris Johns <cjohns at cybertec.com.au>
>>A : pigeon.nicolas at wanadoo.fr
>>Copie à : rtems-users at oarcorp.com
>>Objet : Re: m68k clock problem
>>pigeon.nicolas at wanadoo.fr wrote:
>>    
>>
>>>I'm using an external logic analyzer to monitor the signals, I don't use the GDB stub.
>>>I'll try to explain what happens. Here's what I see on the logic analyzer (RAM=0x00000000, ROM=0x00100000):
>>>
>>>      
>>>
>>Ok.
>>
>>    
>>
>>>00107d24: <_CPU_Context_switch>:
>>>107d24:     moveal  %sp@(4),%a0          | OK, reads a value from the stack in RAM
>>>                  movew  %sr,%d1                  | OK
>>>                  andiw  #0x2fff,%d1               | to make sure that tracing is disabled, but it's the same with or without this line
>>>                  moveml  %d1-%d7/%a2-%sp,%a0@      |OK, values are copied in RAM. The old stack pointer is 0xab60
>>>                  moveal  %sp@(8), %a0         | OK, value copied from RAM
>>>00107d36: <restore>:
>>>107d36      moveml  %a0@,%d1-%d7/%a2-%sp  |values are copied from RAM, the new stack pointer is 0x146d0
>>>                  andiw  #0x2fff,%d1               |disable tracing
>>>                  movew  %d1, %sr                 | new status register
>>>
>>>And now the problem comes... (Address bus=AB, data bus=DB):
>>>AB=0x00107d28        DB=4e75               | the opcode of the RTS instruction is fetched
>>>AB=0x00107d2a        DB=0000               | nothing in ROM here, but this 32 bits processor fetches the instructions two by two, so don't care
>>>AB=0x000146ce        DB=7d28               | read a byte of the return address from the stack, it seems to be the lower byte of the instruction "movew %sr,%d1" in _CPU_Context_switch
>>>And the exception seems to occur here, the processing begins...
>>>AB=0x000146ca        DB=2000
>>>AB=0x000146cc        DB=0010              | read a value from the stack
>>>AB=0x00000024        DB=0010
>>>AB=0x00000026        DB=0514              | read the exception vector n°9 in RAM (the clock interruption vector is n°137...), points to address 0x100514 (in ROM) where the unhandled exception handler resides (not the RTEMS one).
>>>And then the exception is processed.......
>>>
>>>      
>>>
>>Vector 9 is the trace exception. I do not think this is actually occuring happening.
>>
>>It just so happens Timer 1 has a vector encoding of 9. This value is 
>>concatenated to the V7-V5 bits of from the GIMR. It looks like these bits are 0. 
>>If the GIMR is not set the vector returned is 0xf (uninitialised interrupt).
>>
>>What are you setting the GIMR register too ?
>>
>>
>>-- 
>>  Chris Johns, cjohns at cybertec.com.au
>>
>>    
>>
>>
>  
>






More information about the users mailing list