[U-Boot] the processor performs an operation overflows,U-boot-based platform
Joakim Tjernlund
joakim.tjernlund at transmode.se
Wed May 18 08:03:06 CEST 2011
>
> unsigned long get_tbus (void)
> {
> unsigned long tbl=0;
> unsigned long tbu1=0, tbu2=0;
> unsigned long us=0;
> unsigned long long tmp=0;
>
> unsigned long tbclk = os_get_tbclk();
>
> // get the timebase ticks
> do {
> __asm__ __volatile__ ("mftbu %0":"=r" (tbu1):);
> __asm__ __volatile__ ("mftb %0":"=r" (tbl):);
> __asm__ __volatile__ ("mftbu %0":"=r" (tbu2):);
> } while (tbu1 != tbu2);
> // convert ticks to ms
> tmp = (unsigned long long)(tbu1);
> tmp = (tmp << 32);
> tmp += (unsigned long long)(tbl);
> us = tmp / (tbclk / 1000000);
> return us;
> }
>
> void main()
> {
> unsigned long uiTBusB,s_uiTBusA;
> while(1)
> {
> s_uiTBusA = uiTBusB;
> uiTBusB = (get_tbus() / 1000);
>
> printf("uiTBusB:%d,%u\n",uiTBusB,uiTBusB);
> sleep(100);
> }
>
> }
> Different performance results, the code is as follows: My platform is
> mpc8313, core is the e300, running 30 minutes later when there will be:
> uiTBusB overflow occurred. get_tbus () = 0x8001A69B, but uiTBusB =
> 4292819925
> but modify the function as follows:
> unsigned long get_tbus (void)
> {
> unsigned long us =0x8001A69B
> return us;
> }
Didn't read this carefully but figured I should make one comment, overflow
handling for signed int's are undefined in C and gcc uses that when optimizing.
Use unsigned int's instead.
Jocke
More information about the U-Boot
mailing list