亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sos_timer.c

?? 嵌入式操作系統(tǒng)內核
?? C
?? 第 1 頁 / 共 2 頁
字號:
   do{	       if ((tt->pid == pid) &&          (tt->tid == tid))		{		  list_remove((list_t*)tt);		  return tt;		}	  tt = (sos_timer_t*)tt->list.l_next;   } while ((list_t*)tt != &timer_pool);      return NULL;}/** * @brief Remove a timer from the deltaq */static int8_t timer_remove_timer(sos_timer_t *tt){		if((tt->list.l_next == NULL) ||	   (tt->list.l_prev == NULL)) {		return -EINVAL;	}	// if I am not the tail... and I have positive delta	if((tt->list.l_next != &deltaq) && (tt->delta > 0 )) {		((sos_timer_t*)(tt->list.l_next))->delta += tt->delta;	}	list_remove((list_t*)tt);    return SOS_OK;}/** * @brief update delta queue * traverse each item in the queue until no more delta left * NOTE: this is executed in interrupt handler, so NO lock necessary */static void timer_update_delta(void){	list_link_t *link;	int32_t delta;	HAS_CRITICAL_SECTION;		ENTER_CRITICAL_SECTION();	delta = outstanding_ticks;	outstanding_ticks = 0;	LEAVE_CRITICAL_SECTION();		if(list_empty(&deltaq) == true) {		return;	}	DEBUG("update delta = %d\n", delta);	for(link = deltaq.l_next;			link != (&deltaq); link = link->l_next) {		sos_timer_t *h = (sos_timer_t*)link;         		if(h->delta >= delta) {			// if we use all ticks...			h->delta -= delta;			return;		} else {			int32_t tmp = h->delta;			h->delta -= delta;			delta -= tmp;		}	}}/** * @brief Post the timeout messages *///------------------------------------------------------------------------// TIMER API//------------------------------------------------------------------------//! Assumption - This function is never called from an interrupt contextint8_t ker_timer_init(sos_pid_t pid, uint8_t tid, uint8_t type){  sos_timer_t* tt;  tt = find_timer_in_periodic_pool(pid, tid);  if (tt != NULL) {      tt->type = type;	  list_insert_tail(&timer_pool, (list_link_t*)tt);	  return SOS_OK;  }  //! re-initialize an existing timer by stoping it and updating the type  tt = find_timer_block(pid, tid);  if (tt != NULL){      ker_timer_stop(pid,tid);      tt->type = type;      return SOS_OK;  }    //! Search if pre-initialized timer exists  tt = alloc_from_timer_pool(pid, tid);    //! Look for pre-allocated timers or try to get dynamic memory  if (tt == NULL){	tt = alloc_from_preallocated_timer_pool(pid);	if (tt == NULL)	  tt = (sos_timer_t*)malloc_longterm(sizeof(sos_timer_t), TIMER_PID);	//! Init will fail if the system does not have sufficient resources	if (tt == NULL)	  return -ENOMEM;  }    //! Fill up the data structure and insert into the timer pool  tt->pid = pid;  tt->tid = tid;  tt->type = type;    list_insert_tail(&timer_pool, (list_link_t*)tt);  return SOS_OK;}int8_t ker_permanent_timer_init(sos_timer_t* tt, sos_pid_t pid, uint8_t tid, uint8_t type){   //! Fill up the data structures and insert into the timer pool   tt->pid = pid;   tt->tid = tid;   tt->type = type;   list_insert_tail(&timer_pool, (list_link_t*)tt);   return SOS_OK; }int8_t ker_timer_start(sos_pid_t pid, uint8_t tid, int32_t interval){  sos_timer_t* tt;  //! Start the timer from the timer pool  tt = alloc_from_timer_pool(pid, tid);    //! If the timer does not exist, then it is already in use or not initialized  if (tt == NULL) {	DEBUG_PID(TIMER_PID, "ker_timer_start: tt == NULL\n");	return -EINVAL;  }    //  tt->ticks = PROCESSOR_TICKS(interval);  tt->ticks = interval;  tt->delta = interval;    //DEBUG("timer_start(%d) %d %d %d\n", tt->pid, tt->tid, tt->type, tt->ticks);    //! insert into delta queue  print_all_timers("timer_start_start");  timer_delta_q_insert(tt, true);  print_all_timers("timer_start_end");  ker_log( SOS_LOG_TIMER_START, pid, tid );  return SOS_OK;}//! The implementation of this call can be optimized to include the find with//! the remove. We will do it laterint8_t ker_timer_stop(sos_pid_t pid, uint8_t tid){  sos_timer_t* tt;  tt = find_timer_in_periodic_pool(pid, tid);  if( tt == NULL ) {	  //! Find the timer block	  tt = find_timer_block(pid, tid);	  if (tt == NULL) {		  return -EINVAL;	  } else {		  //! Remove the timer from the deltaq and any pending messages in the queue		  timer_remove_timer(tt);	  }  }  //timer_remove_timeout_from_scheduler(tt);  //! Re-insert timer into the pool  list_insert_tail(&timer_pool, (list_link_t*)tt);  ker_log( SOS_LOG_TIMER_STOP, pid, tid );  return SOS_OK;}//! Free the first timer block beloning to pid in the timer_poolint8_t ker_timer_release(sos_pid_t pid, uint8_t tid){  sos_timer_t* tt;  //! First stop the timer if it is running  ker_timer_stop(pid, tid);  //! Get the timer block from the pool  tt = alloc_from_timer_pool(pid, tid);    if (tt == NULL) 	return -EINVAL;  //! Deep free of the timer  ker_free(tt);     return SOS_OK;   }int8_t ker_timer_restart(sos_pid_t pid, uint8_t tid, int32_t interval){  sos_timer_t* tt;    tt = find_timer_in_periodic_pool(pid, tid);  if (tt == NULL) {	  //! Locate a running timer or from the timer pool	  tt = find_timer_block(pid, tid);	  if (tt != NULL){		  timer_remove_timer(tt);		  //timer_remove_timeout_from_scheduler(tt);	  }	  else {		  tt = alloc_from_timer_pool(pid, tid);	  }  }      //! The timer is neither running nor initialized  if (tt == NULL)	return -EINVAL;  /* Special Case restart with existing ticks field */  if( interval <= 0 )      interval = tt->ticks;  if(interval < TIMER_MIN_INTERVAL){      /* Need to put the timer back in to the pool          as an initialized timer that was never started */      list_insert_tail(&timer_pool, (list_link_t*)tt);      return -EPERM;  }  //! Initialize the data structure  tt->ticks = interval;  //  tt->ticks = PROCESSOR_TICKS(interval);  tt->delta = interval;  //! Insert into the delta queue  timer_delta_q_insert(tt, true);  ker_log( SOS_LOG_TIMER_RESTART, pid, tid );  return SOS_OK;}int8_t ker_sys_timer_start(uint8_t tid, int32_t interval, uint8_t type){                                                             	sos_pid_t my_id = ker_get_current_pid();                  	if( (ker_timer_init(my_id, tid, type) != SOS_OK) ||       			(ker_timer_start(my_id, tid, interval) != SOS_OK)) {  		return ker_mod_panic(my_id);                                 	}                                                         	return SOS_OK;                                            }                                                             int8_t ker_sys_timer_restart(uint8_t tid, int32_t interval)       {                                                             	sos_pid_t my_id = ker_get_current_pid();                  	if( ker_timer_restart(my_id, tid, interval) != SOS_OK ) { 		return ker_mod_panic(my_id);                                 	}                                                         	return SOS_OK;                                            }                                                             int8_t ker_sys_timer_stop(uint8_t tid)              {                                                             	sos_pid_t my_id = ker_get_current_pid();                  	if( (ker_timer_stop(my_id, tid) != SOS_OK) ||             			(ker_timer_release(my_id, tid) != SOS_OK) ) {         		return ker_mod_panic(my_id);                                 	}                                                         	return SOS_OK;                                            }                   	// called from schedulerstatic void soft_interrupt( void ){	HAS_CRITICAL_SECTION;	timer_update_delta();	while(list_empty(&deltaq) == false) {		sos_timer_t *h = (sos_timer_t*)(deltaq.l_next);         		if(h->delta <= 0) {			sos_pid_t pid = h->pid;			uint8_t tid = h->tid;			uint8_t flag;			list_remove_head(&deltaq);			if(((h->type) & SLOW_TIMER_MASK) == 0){				flag = SOS_MSG_HIGH_PRIORITY;			} else {				flag = 0;			}			if (((h->type) & ONE_SHOT_TIMER_MASK) == 0){				//! periocic timer				while(h->delta <= 0) {					// make sure it is positive					h->delta += h->ticks;				}				list_insert_tail(&periodic_pool, (list_t*) h);			} else {				list_insert_tail(&timer_pool, (list_link_t*)h);			}			sched_dispatch_short_message(pid, TIMER_PID,					MSG_TIMER_TIMEOUT, 					tid, 0,					flag);		} else {			break;		}	}	while(list_empty(&periodic_pool) == false) {		list_link_t *link = periodic_pool.l_next;		list_remove_head(&periodic_pool);		timer_delta_q_insert((sos_timer_t*)link, false);	}	if(list_empty(&deltaq) == false) {		sos_timer_t *h = (sos_timer_t*)(deltaq.l_next);		int32_t hw_cnt;		ENTER_CRITICAL_SECTION();		hw_cnt = outstanding_ticks - timer_hardware_get_counter();		if( h->delta - hw_cnt > 0) {			LEAVE_CRITICAL_SECTION();			timer_set_hw_top(h->delta - hw_cnt, true);			} else {			LEAVE_CRITICAL_SECTION();			sched_add_interrupt(SCHED_TIMER_INT, soft_interrupt);		}	} else {		ENTER_CRITICAL_SECTION();		timer_set_hw_top(MAX_SLEEP_INTERVAL, false);		LEAVE_CRITICAL_SECTION();	}}static void timer_realtime_set_hw_top(uint16_t value){	// compute the time it takes to have next interrupt	if(list_empty(&deltaq) == true) {		timer_set_hw_top(value, false);	} else {		uint8_t hw_interval = timer_getInterval();		uint8_t hw_cnt = timer_hardware_get_counter();		if( (hw_interval - hw_cnt) >= value ) {			if(list_empty(&deltaq) == true) {				timer_set_hw_top(value, false);			} else {				timer_set_hw_top(value, true);			}		}	}}int8_t timer_realtime_start(uint16_t value, uint16_t interval, timer_callback_t f){	uint8_t i;	HAS_CRITICAL_SECTION;	ENTER_CRITICAL_SECTION();	if( num_realtime_clock == MAX_REALTIME_CLOCK ) {		LEAVE_CRITICAL_SECTION();		return -ENOMEM;	}	for( i = 0; i < MAX_REALTIME_CLOCK; i++ ) {		if( realtime[i].f == NULL ) {			timer_realtime_set_hw_top(value);			num_realtime_clock++;			realtime[i].value = value;			realtime[i].interval = interval;			realtime[i].f = f;			LEAVE_CRITICAL_SECTION();			return SOS_OK;		}	}		LEAVE_CRITICAL_SECTION();	return -ENOMEM;}int8_t timer_realtime_stop(timer_callback_t f){	uint8_t i;	HAS_CRITICAL_SECTION;	ENTER_CRITICAL_SECTION();	for( i = 0; i < MAX_REALTIME_CLOCK; i++ ) {		if( realtime[i].f == f ) {			realtime[i].f = NULL;			num_realtime_clock--;			LEAVE_CRITICAL_SECTION();			return SOS_OK;		}	}	LEAVE_CRITICAL_SECTION();	return -EINVAL;}static uint16_t timer_update_realtime_clock(uint8_t cnt){	uint8_t i;	uint16_t min_cnt = 65535;	timer_callback_t f[MAX_REALTIME_CLOCK];	// iterate through all realtime clock	for( i = 0; i < MAX_REALTIME_CLOCK; i++ ) {		f[i] = NULL;		if( realtime[i].f != NULL ) {			if( realtime[i].value <= cnt ) {				f[i] = realtime[i].f;				if( realtime[i].interval != 0 ) {					realtime[i].value += (realtime[i].interval - cnt);				} else {					realtime[i].f = NULL;					num_realtime_clock--;					continue;				}			} else {				realtime[i].value -= cnt;			}			if( realtime[i].value < min_cnt ) {                 				min_cnt = realtime[i].value;                    			}		}	}	for( i = 0; i < MAX_REALTIME_CLOCK; i++ ) {		if( f[i] != NULL ) {			(f[i])();		}	}	return min_cnt;}timer_interrupt(){	uint8_t cnt = timer_getInterval();	outstanding_ticks += cnt;	sched_add_interrupt(SCHED_TIMER_INT, soft_interrupt);	if( num_realtime_clock > 0 ) {		timer_set_hw_interval(	timer_update_realtime_clock(cnt) );	}}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
香蕉av福利精品导航| 精品盗摄一区二区三区| 亚洲欧美日本在线| 91色在线porny| 亚洲靠逼com| 色狠狠色狠狠综合| 亚洲一区二区精品视频| 欧美三级韩国三级日本三斤 | 9色porny自拍视频一区二区| 日本一区二区三区高清不卡| 成人精品视频网站| 亚洲人成在线观看一区二区| 欧美午夜一区二区| 久久国产麻豆精品| 欧美国产欧美亚州国产日韩mv天天看完整| 成人性生交大合| 亚洲美女免费视频| 日韩视频一区二区三区在线播放 | 国产剧情一区在线| 亚洲欧洲韩国日本视频| 欧美日韩综合色| 久久国产麻豆精品| 中文字幕一区二区三区在线播放| 91久久免费观看| 蜜臀va亚洲va欧美va天堂| 国产视频一区在线观看| 在线精品视频小说1| 狠狠色狠狠色综合| 亚洲蜜臀av乱码久久精品蜜桃| 51精品国自产在线| 大桥未久av一区二区三区中文| 伊人色综合久久天天人手人婷| 精品国产一区久久| 欧美中文字幕一区二区三区 | 欧美国产精品一区| 欧美日韩和欧美的一区二区| 国产一区二区三区免费播放| 一区二区三区在线视频观看| 精品国产乱码久久久久久久久| 91免费版在线| 国产一区二区成人久久免费影院 | 欧美一三区三区四区免费在线看| 国产精品18久久久| 日本三级亚洲精品| 亚洲欧美偷拍卡通变态| 久久蜜桃av一区精品变态类天堂| 欧美日韩中字一区| 91亚洲精品久久久蜜桃网站| 国产一区二区三区四区五区美女| 亚州成人在线电影| 最新欧美精品一区二区三区| 日韩欧美国产一区二区在线播放| 91福利区一区二区三区| 福利91精品一区二区三区| 日本成人在线电影网| 亚洲夂夂婷婷色拍ww47| 中文字幕一区二区三区蜜月| 久久久国产精华| 精品福利二区三区| 欧美成人精品3d动漫h| 欧美伊人久久久久久久久影院 | 麻豆国产一区二区| 日韩中文欧美在线| 亚洲一区在线播放| 亚洲乱码中文字幕综合| 国产精品日日摸夜夜摸av| 日韩欧美二区三区| 欧美肥妇free| 欧美美女bb生活片| 欧美日韩黄视频| 欧美日韩一区 二区 三区 久久精品| 99久久久久久99| 91热门视频在线观看| 99国产精品视频免费观看| 成人教育av在线| 成人黄色电影在线| eeuss鲁片一区二区三区在线观看| 国产精品99久久久久久久女警| 激情另类小说区图片区视频区| 久久精品二区亚洲w码| 麻豆国产91在线播放| 久久99久久99| 国产高清在线精品| 成人av影院在线| 91在线观看污| 色综合视频在线观看| 欧美亚洲另类激情小说| 欧美日韩国产乱码电影| 欧美群妇大交群中文字幕| 91精品综合久久久久久| 日韩欧美国产系列| 久久综合久久综合久久| 国产蜜臀97一区二区三区| 最新久久zyz资源站| 日韩久久一区二区| 亚洲一区二区视频在线| 日欧美一区二区| 韩国av一区二区三区在线观看| 国产精品自产自拍| 色综合天天性综合| 欧美另类videos死尸| 精品福利视频一区二区三区| 国产女人aaa级久久久级| 亚洲欧洲综合另类| 青青草精品视频| 国产成人av网站| 欧美视频第二页| 亚洲精品在线免费播放| 亚洲欧美日韩国产中文在线| 天天爽夜夜爽夜夜爽精品视频| 久久机这里只有精品| 99久久精品情趣| 欧美疯狂做受xxxx富婆| 日本一区二区三区四区在线视频| 亚洲精品免费一二三区| 日本欧美一区二区| 成人激情图片网| 欧美卡1卡2卡| 久久久国产午夜精品| 午夜精品国产更新| 国产suv精品一区二区三区| 欧美无人高清视频在线观看| 亚洲精品一区二区三区影院 | 欧美福利电影网| 国产精品成人在线观看| 日韩中文字幕亚洲一区二区va在线| 国产一区二区主播在线| 欧美日韩美少妇| 国产精品久久午夜| 激情五月激情综合网| 日本精品视频一区二区| 精品国产91九色蝌蚪| 亚洲一区二区视频在线观看| 国产iv一区二区三区| 日韩欧美久久久| 亚洲大片一区二区三区| 国产成人午夜电影网| 日韩一区二区电影在线| 亚洲一区二区五区| 99久精品国产| 中文av一区二区| 国产呦精品一区二区三区网站| 在线观看不卡一区| 亚洲天堂网中文字| 成人av资源下载| 国产肉丝袜一区二区| 日韩国产高清在线| 在线免费观看日本欧美| 日韩一区在线播放| 成人性生交大片免费看在线播放| 精品国产一区二区三区四区四| 婷婷久久综合九色综合伊人色| 91在线免费播放| 国产精品久久午夜| 成人激情校园春色| 欧美激情一区二区三区四区| 国产在线一区观看| 久久先锋影音av鲁色资源网| 美女被吸乳得到大胸91| 在线综合亚洲欧美在线视频| 亚洲国产aⅴ成人精品无吗| 在线观看91视频| 一区二区三区美女| 在线观看日韩精品| 亚洲高清视频中文字幕| 欧美日韩一区精品| 午夜亚洲国产au精品一区二区| 欧美日韩一区三区四区| 无吗不卡中文字幕| 777久久久精品| 麻豆免费精品视频| xfplay精品久久| 国产资源精品在线观看| wwwwww.欧美系列| 国产精品夜夜嗨| 国产人成亚洲第一网站在线播放| 国产河南妇女毛片精品久久久| 国产日韩欧美a| 本田岬高潮一区二区三区| 国产精品你懂的在线欣赏| 成人黄色免费短视频| 亚洲欧美激情小说另类| 欧美视频在线一区| 毛片av中文字幕一区二区| 精品日韩在线一区| 国产精品一二三区在线| 亚洲欧美视频一区| 欧美精品亚洲二区| 免费高清在线一区| 日本一区二区视频在线观看| 91麻豆文化传媒在线观看| 亚洲网友自拍偷拍| 精品国产亚洲一区二区三区在线观看| 国产麻豆精品视频| 亚洲靠逼com| 欧美大片一区二区三区| 国产成人8x视频一区二区| 一区二区三区在线观看欧美| 这里只有精品视频在线观看| 国产精品18久久久久|