Timer interrup can not go forward!
Pete McCormick
pete261 at yahoo.com
Wed Jun 12 22:12:35 EST 2002
I had a similar problem with 2.4.18 and my 8260 ADS board. Make sure the
frequencies in the bd_t structure are in Hz, not MHz (the default for
ppcboot?). I just multiplied by 1000000 instead of rebuilding ppcboot, I think
there is build option you can set for this.
Pete
--- zhongqx <zhongqx at guoguang.com.cn> wrote:
>
> Sir,
> How are you!
> I find the problem with my linux-2.4.18 on MPC8xxFADS board ,I find when
> the Start_kernel function in /init/main.c run to Sti(),
> then time_interrupt() start,but it can not be finished,it loop in while loops
> like following ,can not go out from while loops,Do you have
> this probelm? thank you in advance!
>
>
>
>
> int timer_interrupt(struct pt_regs * regs)
> {
> int next_dec;
> unsigned long cpu = smp_processor_id();
> unsigned jiffy_stamp = last_jiffy_stamp(cpu);
> extern void do_IRQ(struct pt_regs *);
>
> if (atomic_read(&ppc_n_lost_interrupts) != 0)
> do_IRQ(regs);
>
> hardirq_enter(cpu);
>
> while ((next_dec = tb_ticks_per_jiffy - tb_delta(&jiffy_stamp)) < 0) {
> jiffy_stamp += tb_ticks_per_jiffy;
> if (!user_mode(regs))
> ppc_do_profile(instruction_pointer(regs));
> if (smp_processor_id())
> continue;
>
> /* We are in an interrupt, no need to save/restore flags */
> write_lock(&xtime_lock);
> tb_last_stamp = jiffy_stamp;
> do_timer(regs);
>
> /*
> * update the rtc when needed, this should be performed on the
> * right fraction of a second. Half or full second ?
> * Full second works on mk48t59 clocks, others need testing.
> * Note that this update is basically only used through
> * the adjtimex system calls. Setting the HW clock in
> * any other way is a /dev/rtc and userland business.
> * This is still wrong by -0.5/+1.5 jiffies because of the
> * timer interrupt resolution and possible delay, but here we
> * hit a quantization limit which can only be solved by higher
> * resolution timers and decoupling time management from timer
> * interrupts. This is also wrong on the clocks
> * which require being written at the half second boundary.
> * We should have an rtc call that only sets the minutes and
> * seconds like on Intel to avoid problems with non UTC clocks.
> */
> if ( (time_status & STA_UNSYNC) == 0 &&
> xtime.tv_sec - last_rtc_update >= 659 &&
> abs(xtime.tv_usec - (1000000-1000000/HZ)) < 500000/HZ &&
> jiffies - wall_jiffies == 1) {
> if (ppc_md.set_rtc_time(xtime.tv_sec+1 + time_offset) == 0)
> last_rtc_update = xtime.tv_sec+1;
> else
> /* Try again one minute later */
> last_rtc_update += 60;
> }
> write_unlock(&xtime_lock);
> }
> if ( !disarm_decr[smp_processor_id()] )
> set_dec(next_dec);
> last_jiffy_stamp(cpu) = jiffy_stamp;
>
> #ifdef CONFIG_SMP
> smp_local_timer_interrupt(regs);
> #endif /* CONFIG_SMP */
>
> if (ppc_md.heartbeat && !ppc_md.heartbeat_count--)
> ppc_md.heartbeat();
>
> hardirq_exit(cpu);
>
> if (softirq_pending(cpu))
> do_softirq();
>
> return 1; /* lets ret_from_int know we can do checks */
> }
>
>
>
** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/
More information about the Linuxppc-embedded
mailing list