This is the mail archive of the
ecos-discuss@sources.redhat.com
mailing list for the eCos project.
DSR not called from ISR (Real Time Clock)
- From: Satish Kumar <satish at bvt dot sc dot sanyo dot co dot jp>
- To: ecos-discuss at sources dot redhat dot com
- Date: Wed, 24 Sep 2003 19:22:56 +0900
- Subject: [ECOS] DSR not called from ISR (Real Time Clock)
Hi,
Due to ecos scheduler not gettin initialized ; the DSRs/pending DSRs
are not being invoked from the RealTimeClock::ISR routine, which is
entered everytime when a clock interrupt takes place.
i never enter into unlock_inner() func; my sched_lock
identifier is undefined everytime and hence even the set_sched_lock()
also fails to write in the new_value.
can some one tell me what could be the reason for the scheduler not
gettin initialized..my Cyg_Schedule_Implementation::Schedule program in
the mlqueue.cxx is as follows:
Cyg_Thread *
Cyg_Scheduler_Implementation::schedule(void)
{
CYG_REPORT_FUNCTYPE("returning thread %08x");
// The run queue may _never_ be empty, there is always
// an idle thread at the lowest priority.
CYG_ASSERT( queue_map != 0, "Run queue empty");
CYG_ASSERT( queue_map & (1<<CYG_THREAD_MIN_PRIORITY), "Idle thread vanished!!!");
CYG_ASSERT( !run_queue[CYG_THREAD_MIN_PRIORITY].empty(), "Idle thread vanished!!!");
#ifdef CYGPKG_KERNEL_SMP_SUPPORT
Cyg_Thread *current = get_current_thread();
register cyg_uint32 index;
CYG_ASSERT( current->cpu != CYG_KERNEL_CPU_NONE, "Current thread does not have CPU set!");
// If the current thread is still runnable, return it to pending
// state so that it can be considered alongside any other threads
// for execution.
if( current->get_state() == Cyg_Thread::RUNNING )
{
current->cpu = CYG_KERNEL_CPU_NONE;
pending[current->priority]++;
pending_map |= (1<<current->priority);
}
else
{
// Otherwise, ensure that the thread is no longer marked as
// running.
current->cpu = CYG_KERNEL_CPU_NONE;
}
HAL_LSBIT_INDEX(index, pending_map);
Cyg_RunQueue *queue = &run_queue[index];
CYG_ASSERT( !queue->empty(), "Queue for index empty");
CYG_ASSERT( pending[index] > 0, "Pending array and map disagree");
Cyg_Thread *thread = queue->get_head();
// We know there is a runnable thread in this queue, If the thread
// we got is not it, scan until we find it. While not constant time,
// this search has an upper bound of the number of CPUs in the system.
while( thread->cpu != CYG_KERNEL_CPU_NONE )
thread = thread->get_next();
// Take newly scheduled thread out of pending map
thread->cpu = CYG_KERNEL_CPU_THIS();
if( --pending[index] == 0 )
pending_map &= ~(1<<index);
#else
register cyg_uint32 index;
HAL_LSBIT_INDEX(index, queue_map);
Cyg_RunQueue *queue = &run_queue[index];
CYG_ASSERT( !queue->empty(), "Queue for index empty");
Cyg_Thread *thread = queue->get_head();
#endif
CYG_INSTRUMENT_MLQ( SCHEDULE, thread, index);
CYG_ASSERT( thread != NULL , "No threads in run queue");
CYG_ASSERT( thread->queue == NULL , "Runnable thread on a queue!");
CYG_REPORT_RETVAL(thread);
return thread;
}
plz someone tell me how to solve this problem.
thanks
satish
--
Satish Kumar <satish@bvt.sc.sanyo.co.jp>
--
Before posting, please read the FAQ: http://sources.redhat.com/fom/ecos
and search the list archive: http://sources.redhat.com/ml/ecos-discuss