Does this even run in userspace? When I try something like this
(using mfc0) in userspace, I get an illegal instruction exception.
Matt
--
Matthew D. Dharm Senior Software Designer
Momentum Computer Inc. 1815 Aston Ave. Suite 107
(760) 431-8663 X-115 Carlsbad, CA 92008-7310
Momentum Works For You www.momenco.com
> -----Original Message-----
> From: linux-mips-bounce@linux-mips.org
> [mailto:linux-mips-bounce@linux-mips.org]On Behalf Of Zajerko-McKee,
> Nick
> Sent: Friday, September 13, 2002 9:41 AM
> To: 'Gareth'; linux-mips@linux-mips.org
> Subject: RE: Cycle counter
>
>
> Is this under a OS or a single execution? Are there
> interrupts enabled? If
> so, disable them for measurements. (Clock interrupt, serial
> port, etc.).
>
> BTW, most MIPS implementations for OS's and monitors use
> the count/compare
> for their main tick. If you set it to zero you may be
> stepping on someone's
> tick. A better method might be to read the count register
> and read it again
> at the end and do a difference - that way you preserve
> other's values.
>
> Other reasons for a delay: to fetch code (external mem
> ->cache -> cpu) and
> push items onto/off the stack... Theres probably more that
> I can't think of
> right now...
>
> -----Original Message-----
> From: Gareth [mailto:g.c.bransby-99@student.lboro.ac.uk]
> Sent: Friday, September 13, 2002 12:28 PM
> To: linux-mips@linux-mips.org
> Subject: Cycle counter
>
>
> Hi,
>
> Another question reagarding the mips malta board. I am
> wanting to be able to
> find out how many cycles a certain loop takes to execute. I
> understand there
> is
> a cycle counter built into the processor that I want to use
> for this. I have
> a
> bit of inline assembly to do the job but the results I am
> getting are not
> consistent so i think there is probably something wrong
> with my attempt at
> the
> inline assembly. Here is the code :
>
> void al_signal_start(void);
> size_t al_signal_finished(void);
> unsigned int GetcpuCycles(void);
>
> char str[8];
>
> int main (void)
> {
> double x;
> al_signal_start();
>
> x = al_signal_finished();
> printf("GetcpuCycles says : %f \n",x);
>
> return 0;
> }
>
> size_t al_signal_finished(void)
> {
> return GetcpuCycles();
> }
>
> void al_signal_start(void)
> {
> int zero,temp;
> __asm__("move $2, $zero");
> __asm__("nop");
> __asm__("mtc0 $2, $9" : : "r" (temp));
> __asm__("nop");
> __asm__("nop");
> __asm__("nop");
> }
>
> unsigned int GetcpuCycles(void)
> {
> int temp;
> __asm__(".set reorder");
> __asm__("mfc0 $2, $9" : : "r" (temp));
> __asm__("nop");
> __asm__("nop");
> __asm__("nop");
> /*__asm__("jr $31" );*/
> }
>
>
> As you can see, main just starts and stops the counter with
> no instructions
> in
> between. I expexcted the cycle count to be zero or close to
> it because of
> the
> instructions required to get the count but this is not the
> case. I am
> getting
> numbers like 8499. Is there just something wrong with my
> assembly or is
> there
> something else I am missing?
>
> Thanks for any help
> Gareth
>
>
|