/** * Set timer for the next wakeup * @param value */ void setTimer(TIMEVAL value) { rt_mutex_acquire(&condition_mutex, TM_INFINITE); last_timeout_set = value; rt_mutex_release(&condition_mutex); rt_cond_signal(&timer_set); }
int main(void) { RT_TASK *task; RTIME now; int cnt=0; // make main thread LXRT soft realtime task = rt_task_init_schmod(nam2num("MYTASK"), 9, 0, 0, SCHED_FIFO, 0xF); mlockall(MCL_CURRENT | MCL_FUTURE); // start realtime timer and scheduler //rt_set_oneshot_mode(); rt_set_periodic_mode(); start_rt_timer(0); now = rt_get_time() + 10*PERIOD; rt_task_make_periodic(task, now, PERIOD); printf("Init mutex and cond.\n"); mutex = rt_sem_init(nam2num("MUTEX"), 1); if (mutex==0) printf("Error init mutex\n"); cond = rt_cond_init(nam2num("CONDITION")); if (cond==0) printf("Error init cond\n"); thread0 = rt_thread_create(fun0, NULL, 10000); //thread1 = rt_thread_create(fun1, NULL, 20000); //rt_sleep(PERIOD); while (cnt < THRESHOLD) { rt_task_wait_period(); rt_printk("main: Hello World %d!\n",cnt); rt_sem_wait(mutex); //now the mutex should have value 0 if (instance_cnt==0) { rt_sem_signal(mutex); //now the mutex should have vaule 1 rt_printk("worker thread busy!\n"); } else { instance_cnt++; rt_cond_signal(cond); rt_sem_signal(mutex); //now the mutex should have vaule 1 rt_printk("signaling worker thread to start!\n"); } cnt++; } // wait for end of program printf("TYPE <ENTER> TO TERMINATE\n"); getchar(); // cleanup stop_rt_timer(); return 0; }
static void task_func1(long dummy) { rt_printk("Starting task1, waiting on the conditional variable to be 1.\n"); rt_mutex_lock(&mtx); while(cond_data < 1) { rt_cond_wait(&cond, &mtx); } rt_mutex_unlock(&mtx); if(cond_data == 1) { rt_printk("task1, conditional variable signalled, value: %d.\n", cond_data); } rt_printk("task1 signals after setting data to 2.\n"); rt_printk("task1 waits for a broadcast.\n"); rt_mutex_lock(&mtx); cond_data = 2; rt_cond_signal(&cond); while(cond_data < 3) { rt_cond_wait(&cond, &mtx); } rt_mutex_unlock(&mtx); if(cond_data == 3) { rt_printk("task1, conditional variable broadcasted, value: %d.\n", cond_data); } rt_printk("Ending task1.\n"); atomic_inc(&cleanup); }
/** * Stop Timer Task * @param exitfunction */ void StopTimerLoop(CO_Data* d, TimerCallback_t exitfunction) { exitall = exitfunction; callback_od = d; stop_timer = 1; rt_cond_signal(&timer_set); }
bool ElevatorController::releaseFreeCond() { int heapSize = this->getUpHeap().getSize() + this->getDownHeap().getSize(); if(heapSize > 0) { this->eStat.setGDFailedEmptyHeap(false); rt_cond_signal(&(this->rtData.freeCond)); return true; }else { return false; } }
static void task_func4(long dummy) { rt_printk("Starting task4, signalling after setting data to 1, then waits for a broadcast.\n"); rt_mutex_lock(&mtx); cond_data = 1; rt_mutex_unlock(&mtx); rt_cond_signal(&cond); rt_mutex_lock(&mtx); while(cond_data < 3) { rt_cond_wait(&cond, &mtx); } rt_mutex_unlock(&mtx); if(cond_data == 3) { rt_printk("task4, conditional variable broadcasted, value: %d.\n", cond_data); } rt_printk("Ending task4.\n"); atomic_inc(&cleanup); }