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

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

?? thread.c.svn-base

?? RT-Thread是發展中的下一代微內核嵌入式實時操作系統
?? SVN-BASE
字號:
/* * File      : thread.c * This file is part of RT-Thread RTOS * COPYRIGHT (C) 2006, RT-Thread Development Team * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://openlab.rt-thread.com/license/LICENSE * * Change Logs: * Date           Author       Notes * 2006-03-28     Bernard      first version * 2006-04-29     Bernard      implement thread timer * 2006-04-30     Bernard      add THREAD_DEBUG * 2006-05-27     Bernard      fix the rt_thread_yield bug * 2006-06-03     Bernard      fix the thread timer init bug * 2006-08-10     Bernard      fix the timer bug in thread_sleep * 2006-09-03     Bernard      change rt_timer_delete to rt_timer_detach * 2006-09-03     Bernard      implement rt_thread_detach */#include <rtthread.h>#include <rthw.h>#include "kservice.h"/* #define THREAD_DEBUG */extern rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX];extern struct rt_thread* rt_current_thread;extern rt_uint8 rt_current_priority;static void rt_thread_exit(void);void rt_thread_timeout(void* parameter);static rt_err_t _rt_thread_init(struct rt_thread* thread,	const char* name,	void (*entry)(void* parameter), void* parameter,	void* stack_start, rt_uint32 stack_size,	rt_uint8 priority, rt_uint32 tick){	/* set thread id and init thread list */	thread->tid = thread;	rt_list_init(&(thread->tlist));	thread->entry = (void*)entry;	thread->parameter = parameter;	/* stack init */	thread->stack_addr = stack_start;	thread->stack_size = stack_size;	/* init thread stack */	rt_memset(thread->stack_addr, '#', thread->stack_size);	thread->sp = (void*)rt_hw_stack_init(thread->entry, thread->parameter,		(void *) ((char *)thread->stack_addr + thread->stack_size - 4),		(void*)rt_thread_exit);	/* priority init */	thread->init_priority = priority;	thread->current_priority = priority;	/* tick init */	thread->init_tick = tick;	thread->remaining_tick = tick;	/* error and flags */	thread->error = RT_EOK;	thread->stat  = RT_THREAD_INIT;	thread->flags = 0;#ifdef RT_USING_PROCESS	/* task related initialization */	thread->pid = 0;	rt_list_init(&(thread->plist));#endif	/* init thread timer */	rt_timer_init(&(thread->thread_timer), 		thread->name, 		rt_thread_timeout, 		thread, 		0, 		RT_TIMER_FLAG_ONE_SHOT);	return RT_EOK;}/** * @addtogroup Thread *//*@{*//** * This function will init a thread, normally it's used to initialize a static thread object. * * @param thread the static thread object * @param name the name of thread, which shall be unique * @param entry the entry function of thread * @param parameter the parameter of thread enter function * @param stack_start the start address of thread stack * @param stack_size the size of thread stack * @param priority the priority of thread * @param tick the time slice if there are same priority thread * * @return the operation status, RT_EOK on OK; -RT_ERROR on error * */rt_err_t rt_thread_init(struct rt_thread* thread,	const char* name,	void (*entry)(void* parameter), void* parameter,	void* stack_start, rt_uint32 stack_size,	rt_uint8 priority, rt_uint32 tick){	/* thread check */	RT_ASSERT(thread != RT_NULL);	RT_ASSERT(stack_start != RT_NULL);	/* init thread object */	rt_object_init((rt_object_t)thread, RT_Object_Class_Thread, name);	return _rt_thread_init(thread, name, entry, parameter,		stack_start, stack_size,		priority, tick);}#ifdef RT_USING_HEAP/** * This function will create a thread object and allocate thread object memory and stack. * * @param name the name of thread, which shall be unique * @param entry the entry function of thread * @param parameter the parameter of thread enter function * @param stack_size the size of thread stack * @param priority the priority of thread * @param tick the time slice if there are same priority thread * * @return the created thread object * */rt_thread_t rt_thread_create (const char* name,	void (*entry)(void* parameter), void* parameter,	rt_uint32 stack_size,	rt_uint8 priority,	rt_uint32 tick){	struct rt_thread* thread;	void* stack_start;	thread = (struct rt_thread*) rt_object_allocate(RT_Object_Class_Thread, name);	if (thread == RT_NULL) return RT_NULL;	stack_start = (void*)rt_malloc(stack_size);	if (stack_start == RT_NULL)	{		/* allocate stack failure */		rt_object_delete((rt_object_t)thread);		return RT_NULL;	}	_rt_thread_init(thread, name, entry, parameter,		stack_start, stack_size,		priority, tick);	return thread;}#endif/** * This function will return self thread object * * @return the self thread object * */rt_thread_t rt_thread_self (void){	return rt_current_thread;}/** * This function will start a thread and put it to system ready queue * * @param thread the thread to be started * * @return the operation status, RT_EOK on OK; -RT_ERROR on error * */rt_err_t rt_thread_startup (rt_thread_t thread){	/* thread check */	RT_ASSERT(thread != RT_NULL);	RT_ASSERT(thread->stat == RT_THREAD_INIT);	/* set current priority to init priority */	thread->current_priority = thread->init_priority;	/* calculate priority attribute */#if RT_THREAD_PRIORITY_MAX > 32	thread->number 		= thread->current_priority >> 3; 			/* 5bit */	thread->number_mask	= 1 << thread->number;	thread->high_mask 	= 1 << (thread->current_priority & 0x07); 	/* 3bit */#else	thread->number_mask = 1 << thread->current_priority;#endif#ifdef THREAD_DEBUG	rt_kprintf("startup a thread:%s with priority:%d\n", thread->name, thread->init_priority);#endif	/* change thread stat */	thread->stat = RT_THREAD_SUSPEND;	/* then resume it */	rt_thread_resume(thread);	return RT_EOK;}static void rt_thread_exit(){	struct rt_thread* thread;    register rt_base_t temp;    /* disable interrupt */    temp = rt_hw_interrupt_disable();    /* get current thread */	thread = rt_current_thread;	/* change stat */	thread->stat = RT_THREAD_CLOSE;	/* remove from schedule */	rt_schedule_remove_thread(thread);	/* release thread timer */	rt_timer_detach(&(thread->thread_timer));	/* enable interrupt */    rt_hw_interrupt_enable(temp);	/* change stat */	thread->stat = RT_THREAD_CLOSE;	if (rt_object_is_systemobject((rt_object_t)thread))	{		rt_object_detach((rt_object_t)thread);	}#ifdef RT_USING_HEAP		else	{		/* release thread's stack */		rt_free(thread->stack_addr);		/* delete thread object */		rt_object_delete((rt_object_t)thread);	}#endif	/* switch to next task */	rt_schedule();}/** * This function will detach a thread. The thread object will be remove from thread  * queue and detached/deleted from system object management. * * @param thread the thread to be deleted * * @return the operation status, RT_EOK on OK; -RT_ERROR on error * */rt_err_t rt_thread_detach (rt_thread_t thread){	/* thread check */	RT_ASSERT(thread != RT_NULL);	/* remove from schedule */	rt_schedule_remove_thread(thread);	/* release thread timer */	rt_timer_detach(&(thread->thread_timer));	rt_object_detach((rt_object_t)thread);	return RT_EOK;}#ifdef RT_USING_HEAP/** * This function will delete a thread. The thread object will be remove from thread  * queue and detached/deleted from system object management. * * @param thread the thread to be deleted * * @return the operation status, RT_EOK on OK; -RT_ERROR on error * */rt_err_t rt_thread_delete (rt_thread_t thread){	/* thread check */	RT_ASSERT(thread != RT_NULL);	/* remove from schedule */	rt_schedule_remove_thread(thread);	/* release thread timer */	rt_timer_detach(&(thread->thread_timer));	/* release thread's stack */	rt_free(thread->stack_addr);	/* delete thread object */	rt_object_delete((rt_object_t)thread);	return RT_EOK;}#endif/** * This function will let current thread yield processor, and scheduler will get a highest thread to run. * After yield processor, the current thread is still in READY state. * * @return the operation status, RT_EOK on OK; -RT_ERROR on error * */rt_err_t rt_thread_yield (){	register rt_base_t level;	struct rt_thread *thread;	/* disable interrupt */	level = rt_hw_interrupt_disable();	/* set to current thread */	thread = rt_current_thread;	/* thread check */	RT_ASSERT(thread->stat == RT_THREAD_READY);	/* if the thread list is not only one, */	if (thread->tlist.next != thread->tlist.prev)	{		/* remove thread from thread list */		rt_list_remove(&(thread->tlist));		/* put thread to end of ready queue */		rt_list_insert_before(&(rt_thread_priority_table[thread->current_priority]),			&(thread->tlist));		/* enable interrupt */		rt_hw_interrupt_enable(level);		rt_schedule();		return RT_EOK;	}	/* enable interrupt */	rt_hw_interrupt_enable(level);	return RT_EOK;}/** * This function will let current thread sleep for some ticks. * * @param tick the sleep ticks * * @return the operation status, RT_EOK on OK; RT_ERROR on error * */rt_err_t rt_thread_sleep (rt_tick_t tick){	register rt_base_t temp;	struct rt_thread *thread;	/* disable interrupt */	temp = rt_hw_interrupt_disable();	/* set to current thread */	thread = rt_current_thread;	RT_ASSERT(thread != RT_NULL);	/* suspend thread */	rt_thread_suspend(thread);	/* reset the timeout of thread timer and start it */	rt_timer_control(&(thread->thread_timer), RT_TIMER_CTRL_SET_TIME, &tick);	rt_timer_start(&(thread->thread_timer));	/* enable interrupt */	rt_hw_interrupt_enable(temp);	rt_schedule();	return RT_EOK;}/** * This function will let current thread delay for some ticks. * * @param tick the delay ticks * * @return the operation status, RT_EOK on OK; RT_ERROR on error * */rt_err_t rt_thread_delay(rt_tick_t tick){	return rt_thread_sleep(tick);}rt_err_t rt_thread_control (rt_thread_t thread, rt_uint8 cmd, void* arg){	register rt_base_t temp;	/* thread check */	RT_ASSERT(thread != RT_NULL);	switch (cmd)	{	case RT_THREAD_CTRL_CHANGE_PRIORITY:		/* disable interrupt */		temp = rt_hw_interrupt_disable();		/* for ready thread, change queue */		if (thread->stat == RT_THREAD_READY)		{			/* remove thread from schedule queue first */			rt_schedule_remove_thread(thread);			/* change thread priority */			thread->current_priority = *(rt_uint8*) arg;			/* recalculate priority attribute */#if RT_THREAD_PRIORITY_MAX > 32			thread->number 		= thread->current_priority >> 3; 			/* 5bit */			thread->number_mask	= 1 << thread->number;			thread->high_mask 	= 1 << (thread->current_priority & 0x07); 	/* 3bit */#else			thread->number_mask = 1 << thread->current_priority;#endif			/* insert thread to schedule queue again */			rt_schedule_insert_thread(thread);		}		else		{			thread->current_priority = *(rt_uint8*) arg;			/* recalculate priority attribute */#if RT_THREAD_PRIORITY_MAX > 32						thread->number 		= thread->current_priority >> 3; 			/* 5bit */			thread->number_mask	= 1 << thread->number;			thread->high_mask 	= 1 << (thread->current_priority & 0x07); 	/* 3bit */#else			thread->number_mask = 1 << thread->current_priority;#endif		}		/* enable interrupt */		rt_hw_interrupt_enable(temp);		break;	case RT_THREAD_CTRL_STARTUP:		return rt_thread_startup(thread);		break;#ifdef RT_USING_HEAP	case RT_THREAD_CTRL_CLOSE:		return rt_thread_delete(thread);		break;#endif	default:		break;	}	return - RT_EOK;}/** * This function will suspend the specified thread. * * @param thread the thread to be suspended * * @return the operation status, RT_EOK on OK; -RT_ERROR on error * */rt_err_t rt_thread_suspend (rt_thread_t thread){	register rt_base_t temp;	/* thread check */	RT_ASSERT(thread != RT_NULL);	if (thread->stat != RT_THREAD_READY)	{#ifdef THREAD_DEBUG		rt_kprintf("thread suspend: thread disorder, %d\n", thread->stat);#endif		return -RT_ERROR;	}	/* disable interrupt */	temp = rt_hw_interrupt_disable();	/* change thread stat */	thread->stat = RT_THREAD_SUSPEND;	rt_schedule_remove_thread(thread);	/* enable interrupt */	rt_hw_interrupt_enable(temp);	return RT_EOK;}/** * This function will resume a thread and put it to system ready queue. * * @param thread the thread to be resumed * * @return the operation status, RT_EOK on OK; -RT_ERROR on error * */rt_err_t rt_thread_resume (rt_thread_t thread){	register rt_base_t temp;	/* thread check */	RT_ASSERT(thread != RT_NULL);	if (thread->stat != RT_THREAD_SUSPEND)	{#ifdef THREAD_DEBUG		rt_kprintf("thread resume: thread disorder, %d\n", thread->stat);#endif		return -RT_ERROR;	}	/* disable interrupt */	temp = rt_hw_interrupt_disable();	/* remove from suspend list */	rt_list_remove(&(thread->tlist));	/* remove thread timer */	rt_list_remove(&(thread->thread_timer.list));	/* change stat */	thread->stat = RT_THREAD_READY;	/* enable interrupt */	rt_hw_interrupt_enable(temp);	/* insert to schedule ready list */	rt_schedule_insert_thread(thread);	return RT_EOK;}/** * This function is the timeout function for thread, normally which will * be invoked when thread is timeout to wait some recourse. * * @param parameter the parameter of thread timeout function * */void rt_thread_timeout(void* parameter){	struct rt_thread* thread;	thread = (struct rt_thread*) parameter;	/* thread check */	RT_ASSERT(thread != RT_NULL);	RT_ASSERT(thread->stat == RT_THREAD_SUSPEND);	/* set error number */	thread->error = -RT_ETIMEOUT;	/* change stat */	thread->stat = RT_THREAD_READY;	/* insert to schedule ready list */	rt_schedule_insert_thread(thread);	/* do schedule */	rt_schedule();}/*@}*/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
最新日韩av在线| 久久精品国产99国产精品| 日韩精品国产精品| 国产1区2区3区精品美女| 91精品福利视频| 国产午夜精品久久久久久久| 亚洲成a人片综合在线| 成人免费视频视频在线观看免费| 欧美一区二区三区电影| 一区二区三国产精华液| 不卡视频一二三四| 国产亚洲午夜高清国产拍精品| 肉色丝袜一区二区| 色狠狠综合天天综合综合| 国产日产精品一区| 久久精品二区亚洲w码| 欧美精品1区2区| 亚洲女同一区二区| 成人涩涩免费视频| 久久综合久久综合九色| 美国十次综合导航| 91精品国产aⅴ一区二区| 亚洲精品亚洲人成人网| www.在线欧美| 中文天堂在线一区| 丁香六月综合激情| 国产无遮挡一区二区三区毛片日本| 毛片基地黄久久久久久天堂| 欧美日韩一区二区欧美激情| 亚洲一区二区三区中文字幕在线| 99精品欧美一区二区三区小说| 久久久久久久久蜜桃| 精品亚洲成av人在线观看| 欧美一区二区三区在线观看 | 欧美日免费三级在线| 中文字幕一区二区三区在线播放| 国产精品18久久久久久久网站| 欧美精品一区二区三区在线| 国内精品久久久久影院薰衣草| 日韩免费在线观看| 国产在线精品视频| 久久久99精品久久| 99视频在线精品| 一个色综合网站| 欧美日韩国产一二三| 石原莉奈在线亚洲三区| 欧美一区二区三区电影| 国内外成人在线| 中文一区二区完整视频在线观看 | 93久久精品日日躁夜夜躁欧美| 久久久久久久久久久久久久久99| 国产精品白丝jk黑袜喷水| 国产精品蜜臀在线观看| 在线观看www91| 日本va欧美va精品| 精品国产乱码久久久久久夜甘婷婷| 国产乱码字幕精品高清av| 国产精品美女一区二区三区| 色视频欧美一区二区三区| 天堂久久久久va久久久久| 26uuu国产日韩综合| 成人aa视频在线观看| 午夜电影一区二区三区| 久久色.com| 欧美性色黄大片| 国内久久精品视频| 亚洲欧美日韩国产中文在线| 欧美一区二区不卡视频| 不卡av电影在线播放| 午夜激情久久久| 日本一区二区视频在线| 欧美日韩在线综合| 粉嫩一区二区三区性色av| 亚洲国产综合人成综合网站| 久久久综合视频| 欧美午夜宅男影院| 懂色av中文字幕一区二区三区 | 日韩高清不卡在线| 中文字幕国产一区| 日韩一区二区免费在线电影| av中文字幕一区| 极品美女销魂一区二区三区免费| 亚洲色大成网站www久久九九| 欧美高清一级片在线| 99精品欧美一区二区三区综合在线| 日本午夜一区二区| 一区二区久久久久| 国产精品美女久久久久aⅴ国产馆| 欧美夫妻性生活| 色天使久久综合网天天| 成人国产亚洲欧美成人综合网| 奇米888四色在线精品| 亚洲精品日产精品乱码不卡| 久久色在线视频| 欧美一区二区三区免费视频| 色94色欧美sute亚洲13| 成人黄页毛片网站| 久久99精品久久久久久国产越南| 亚洲第一综合色| 亚洲免费在线看| 中文子幕无线码一区tr| 精品福利一区二区三区免费视频| 欧美日韩在线三级| 欧美日韩在线直播| 欧洲在线/亚洲| 色噜噜狠狠色综合中国| heyzo一本久久综合| 丁香激情综合国产| 国产精品88av| 国产成人综合在线观看| 韩国成人在线视频| 国产制服丝袜一区| 久久9热精品视频| 久久精品999| 毛片一区二区三区| 国模一区二区三区白浆| 激情文学综合插| 国产一区二区导航在线播放| 国产在线播精品第三| 国产一二精品视频| 国产suv精品一区二区883| 国产成人精品免费视频网站| 国产传媒欧美日韩成人| 不卡一区在线观看| 色偷偷成人一区二区三区91| 99视频一区二区| 在线一区二区三区四区五区 | 欧美一级片免费看| 精品国产免费一区二区三区四区| 精品日韩在线一区| www成人在线观看| 中文字幕不卡的av| 亚洲免费观看在线观看| 性久久久久久久久久久久| 青青草伊人久久| 国产高清成人在线| av在线综合网| 欧美日本不卡视频| 日韩精品一区二区三区在线播放| 久久久噜噜噜久久中文字幕色伊伊| 国产清纯白嫩初高生在线观看91| 日本一二三四高清不卡| 亚洲精品福利视频网站| 日本中文字幕一区二区视频| 国产一区二区三区不卡在线观看| 成人网在线免费视频| 欧美日韩一区不卡| 2020国产精品久久精品美国| 亚洲欧洲日本在线| 天涯成人国产亚洲精品一区av| 国模无码大尺度一区二区三区| av中文字幕亚洲| 日韩欧美精品在线视频| 中文字幕精品三区| 丝袜美腿亚洲一区二区图片| 高清国产一区二区| 欧美精品日日鲁夜夜添| 国产亚洲精品7777| 午夜精品久久久久影视| 国产成人午夜片在线观看高清观看| 色综合中文综合网| 亚洲永久免费视频| 美国毛片一区二区三区| 91丨porny丨国产入口| 91精品婷婷国产综合久久| 国产精品久久久久久久久久免费看 | 性感美女极品91精品| 国产河南妇女毛片精品久久久| 欧美久久久久久久久中文字幕| 亚洲国产高清在线| 久久福利资源站| 欧美日韩精品二区第二页| 国产精品萝li| 国产在线不卡一卡二卡三卡四卡| 欧美日本精品一区二区三区| 日韩美女啊v在线免费观看| 久久69国产一区二区蜜臀| 欧洲一区二区av| 国产精品成人一区二区艾草| 激情欧美一区二区三区在线观看| 欧美久久一区二区| 亚洲精选视频在线| 国产黄色精品视频| 日韩欧美123| 免费在线观看一区| 精品视频在线免费看| 亚洲精品久久久久久国产精华液| 国产精品18久久久久久久网站| 日韩精品影音先锋| 久久激情五月婷婷| 欧美一卡二卡在线观看| 午夜激情一区二区三区| 欧美三级电影在线观看| 依依成人精品视频| 色婷婷精品大在线视频| 中文字幕在线视频一区| 99热精品国产| 亚洲天堂精品视频| 色综合中文字幕| 亚洲已满18点击进入久久|