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

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

?? sched.c

?? 一個基于MMU的操作系統
?? C
字號:
#include <sched.h>
#include <s3c2410.h>
#include <interrupt.h>
#include <init.h>
#include <mmu.h>
#include <string.h>
#include <serial.h>

struct task_struct task[TASK_NR];
struct task_struct*  current = NULL;
extern void __switch_to(struct task_struct *pcur,struct task_struct *pnext);


/*****************************************************************************
* 初始化task數組
* 初始化任務0,即task[0]
*****************************************************************************/
void sched_init(void)
{
	struct task_struct *p = &task[0];
	int i,j;

	DPRINTK(KERNEL_DEBUG,"\n\rkernel:sched_init,create task 0\n\r");
	
	for(i = 0; i < TASK_NR; i++,p++){
		p->pid = -1;
		p->state = TASK_UNALLOCATE;
		p->count = 0;
		p->priority = 0;
		for(j = 0; j < 1024; j++){
			p->kernelstack[j] = 0;
		}
	}
	p = &task[0];
	p->pid = 0;
	p->state = TASK_RUNNING;
	p->count = 5;
	p->priority = 5;
	p->content[0] = (unsigned long)(&task[1]);
	p->content[1] = 0x5f;   		/*cpsr*/
	p->content[2] = 0x30100000-1024;	/*usr/sys模式堆棧*/
	p->content[3] = 0x13;		/*svc模式*/
	p->content[17]= 0;		/*pc*/
	
	current = &task[0];
}

/*****************************************************************************
* 切換到task數組中處于運行狀態的、count值最大的任務
* 如果所有任務的count值都為0,則重新計算count = count / 2 + priority
* 進程0不參與競爭
*****************************************************************************/
void schedule(void)
{
	long max = -1;
	long i = 0,  next = 0;
	struct task_struct * ptmp_tsk = NULL;

	DPRINTK(KERNEL_DEBUG,"kernel:schedule\n\r");	

	while(1){
		for(i = 1; i < TASK_NR; i++){
			if((task[i].state == TASK_RUNNING)&&(max < (long)task[i].count)){
				max = (long)task[i].count;
				next = i;
			}
		}

		/*如果所有任務都不處于就緒狀態,max = -1,next = 0,跳出循環執行任務0*/
		/*如果max = 0,則進行下面的計算count值*/
		/*如果max > 0,則跳出循環...*/
		/*這種方法太妙了,摘自linux0.11*/
		if(max)break;	

		for(i = 0; i < TASK_NR; i++){
			if(task[i].state == TASK_RUNNING)
				task[i].count = task[i].priority;
//			task[i].count = (task[i].count >> 1) + task[i].priority;			
		}
	}
	if(current == &task[next])
		return;
	if(task[next].pid < 0)
		return;
	ptmp_tsk = current;
	current = &task[next];
	DPRINTK(KERNEL_DEBUG,"kernel:__switch_to\n\r");		
	__switch_to(ptmp_tsk,&task[next]);
	DPRINTK(KERNEL_DEBUG,"kernel:return from __switch_to\n\r");			
}



/*****************************************************************************
* 當前進程count減1
* 如果當前進程不處于可運行狀態,或count=0,調度進程
*****************************************************************************/
void do_timer(void)
{
	int i = 0, b_wakeup = 0;
	DPRINTK(KERNEL_DEBUG,"kernel:do_timer\n\r");

	if(!current){
		DPRINTK(KERNEL_DEBUG,"kernel:leaving do_timer,hasn't init task\n\r");
		return;
	}

	for(i = 1; i < TASK_NR; i++){
		if(task[i].state == TASK_SLEEPING){
			if(!(--task[i].timer)){
				task[i].state = TASK_RUNNING;
				b_wakeup = 1;
			}
		}
	}

	if(current->count){
		current->count--;
	}
	
	if((current->state != TASK_RUNNING)|| !current->count || b_wakeup){
		schedule();
	}
	DPRINTK(KERNEL_DEBUG,"kernel:leaving do_timer\n\r");			
}

/*******************************************************************************
* linux下,在控制臺下如此運行程序:file  param0 param1 ...
* 其中的file  param0 param1 ...作為參數傳遞給int main(int argc, char **argc)
* argc為參數個數,即file,param0,param1...的個數
* argv[0]為file字串的地址,argv[1]為param0字串的地址...
*
* OSCreateProcess中參數含義為:
* 1. nand_start_addr:本進程代碼存在nand flash中的位置,len:代碼大小,通過這兩個參數來
* 確定一個文件file
* 2. parameters為"param0 param1 param2 ...",各參數間以空格分開
* 請注意,進程main函數中的file參數就沒什么用處了,我隨便設為pid了
* 3. priority:進程優先級
*
* 本函數用于從nand flash中讀處代碼,設置其main函數執行前的環境:堆棧、參數,設置相應的任務數據結構
**********************************************************************************/
int OSCreateProcess(unsigned long nand_start_addr, unsigned long len, char *parameters, long priority)
{
	unsigned long i = 1,pid,j,argc = 0;
	unsigned long *p_VA;
	char *pDes;
	
	DPRINTK(KERNEL_DEBUG,"kernel:OSCreateProcess\n\r");
	
	for(; i < TASK_NR; i++){
		if(!(task[i].state == TASK_UNALLOCATE && VALIDE_TASK_INDEX(i)))
			continue;
		
		OS_ENTER_CRITICAL();

		pid = i;

		/*從NAND Flash中復制代碼到進程號i對應的物理地址*/
		/*虛擬地址SDRAM_RAW_RW_VA_BASE + i*0x100000指向PID=i的進程的1M內存,并且此虛擬地址>32M,所以與PID無關*/
		DPRINTK(KERNEL_DEBUG,"kernel:OSCreateProcess::nand_read_ll\n\r");

		p_VA = (unsigned long *)(SDRAM_RAW_RW_VA_BASE + pid*0x100000);				
		
		//清0
		for( j = 0; j < 0x100000/4; j++)
			p_VA[j] = 0;
		
		nand_read_ll((unsigned char*)p_VA, nand_start_addr,len);

		/****************************************************************************************
		* 設置用戶函數int main(int argc, char **argc)的參數
		* 進程i的1M地址的最后1k空間用于存放參數(地址向上依次為):
		* argc,argv[0],argv[1],...,argv[argc-1],NULL,"argv[0]對應的string","argv[1]對應的string",...
		*****************************************************************************************/
		DPRINTK(KERNEL_DEBUG,"kernel:OSCreateProcess::set the new process's parameters\n\r");			

		//放參數
		p_VA = (unsigned long *)(SDRAM_RAW_RW_VA_BASE + pid*0x100000 + 0x100000 - 1024);
		
		argc = 0;
		j = 0;

		/*計算paramters中參數個數*/
		if(parameters){
			while(parameters[j]){
				while(parameters[j] == ' ')j++;	//吃掉空格
				if(!parameters[j])
					break;
				argc++;
				while(parameters[j] && ( parameters[j] != ' '))j++;	//吃掉非空格
				if(!parameters[j])
					break;
			}
		}
		
		
		*p_VA++ = argc + 1;	   	/*main函數中的argc*/
		
		*p_VA++ = pid;		/*argv[0]*/

		pDes = (char *)(p_VA + argc + 1);	/*pDes指向"...,argc[argc-1],NULL"后面,用來存放argv[...]對應的字符串*/

		for(i = 0, j = 0; i < argc; i++){
			*p_VA++ = (unsigned long)pDes -(SDRAM_RAW_RW_VA_BASE + pid*0x100000);

			while(parameters[j] == ' ')j++;	//吃掉空格
			
			if(!parameters[j])
				break;
			while(parameters[j] && ( parameters[j] != ' ')){//復制參數
 				*pDes = parameters[j];
				pDes++;
				j++;
			}
			*pDes = '\0';
			
		       	pDes = (char *)(((unsigned long)pDes + 4)&(~0x3)); 	//對齊

			if(!parameters[j])
				break;
		}
		
		
		/************************************************************************************
		* 設置參數:
		* 進程剛開始處于usr/sys模式
		* 參考sched.S中保存進程上下文的順序為:
		* sp_svc,cpsr,sp_usr/sys,0x13(表示svc),r0-r12,lr
		**************************************************************************************/
		DPRINTK(KERNEL_DEBUG,"kernel:OSCreateProcess::set the new process's content\n\r");
		task[pid].pid = pid;
		task[pid].state = TASK_RUNNING;
		task[pid].count = 15;
		task[pid].priority = priority;
		task[pid].content[0] = (unsigned long)(&task[pid+1]);
		task[pid].content[1] = 0x5f;   	/*cpsr*/
		task[pid].content[2] = 0x100000-1024; /*usr/sys模式堆棧*/
		task[pid].content[3] = 0x13;	/*svc模式*/
		task[pid].content[17]= 0;	/*pc*/
		
		OS_EXIT_CRITICAL();
		return 1;
	}
	
	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
3d动漫精品啪啪1区2区免费| 国产精品一品二品| 99精品久久只有精品| 亚洲一区二区三区精品在线| 国产传媒欧美日韩成人| 久久久久久久久久久黄色| 另类小说色综合网站| 日韩欧美国产一区在线观看| 日韩经典中文字幕一区| 91精品国产品国语在线不卡 | 日本强好片久久久久久aaa| 欧美性xxxxxx少妇| 视频在线观看一区| 日韩久久免费av| 国产综合色产在线精品| 中文字幕乱码一区二区免费| jlzzjlzz亚洲女人18| 一区二区三区免费看视频| 欧美丝袜丝交足nylons图片| 日韩vs国产vs欧美| 日韩视频一区在线观看| 国产精品一区二区三区乱码| 中文字幕日韩一区二区| 91啪亚洲精品| 亚洲v日本v欧美v久久精品| 在线成人免费视频| 国产激情视频一区二区三区欧美| 国产精品久久久一本精品| 在线精品观看国产| 日韩精品电影在线观看| 久久久久久亚洲综合| av不卡一区二区三区| 午夜久久久久久电影| 久久免费视频色| 在线亚洲一区二区| 日韩国产精品91| 久久综合丝袜日本网| 激情综合亚洲精品| 亚洲欧美一区二区久久| 91精品国产一区二区三区蜜臀| 久久国产精品一区二区| 亚洲视频你懂的| 日韩欧美中文字幕精品| 色婷婷激情综合| 精品综合免费视频观看| 亚洲精品久久久久久国产精华液| 日韩精品一区二区三区视频| 色欧美乱欧美15图片| 日韩高清中文字幕一区| 久久精品欧美一区二区三区麻豆| 欧美性猛交xxxx乱大交退制版| 国产一区二区三区在线观看免费视频| 中文字幕在线不卡一区| 欧美一区二区日韩一区二区| 成人av中文字幕| 乱一区二区av| 亚洲影视在线播放| 中文字幕在线视频一区| 精品1区2区在线观看| 色综合一区二区| 国产精品99久久久久久久vr| 日韩影院精彩在线| 欧美精品一区二区精品网| 欧美综合亚洲图片综合区| 国产高清无密码一区二区三区| 亚洲午夜久久久久久久久久久 | 国产精品免费视频一区| 日韩欧美高清dvd碟片| 精品视频一区二区三区免费| 成人av免费在线播放| 精品一区二区三区日韩| 午夜久久电影网| 亚洲综合色噜噜狠狠| 国产精品久99| 亚洲国产精品精华液2区45| 日韩欧美在线网站| 欧美精品久久99| 欧美蜜桃一区二区三区| 欧美日韩在线直播| 欧美亚洲国产bt| 色综合一区二区三区| av在线一区二区| av不卡在线播放| 波多野洁衣一区| 国产伦精品一区二区三区视频青涩 | 国模少妇一区二区三区| 精品一区精品二区高清| 久久99精品国产91久久来源| 久久草av在线| 精品一二三四区| 国产毛片精品一区| 国产成人综合精品三级| 国产成人一区在线| 不卡一区中文字幕| 97久久超碰国产精品电影| 99视频精品在线| 91视视频在线观看入口直接观看www| 99这里只有久久精品视频| 色偷偷成人一区二区三区91| 91国产视频在线观看| 欧美日韩精品一区二区三区四区 | aaa亚洲精品| 日本福利一区二区| 欧美午夜电影网| 欧美精品精品一区| 日韩午夜激情免费电影| 久久精品在这里| 亚洲欧美日韩中文播放| 亚洲小少妇裸体bbw| 天天影视涩香欲综合网| 蜜桃传媒麻豆第一区在线观看| 狠狠色丁香久久婷婷综合_中| 国产成人99久久亚洲综合精品| 成人成人成人在线视频| 欧美亚洲综合一区| 欧美不卡一区二区三区四区| 久久久亚洲高清| 亚洲美女一区二区三区| 午夜久久久久久久久久一区二区| 久久99精品国产91久久来源| 99免费精品视频| 7777精品伊人久久久大香线蕉的 | 亚洲亚洲人成综合网络| 久久精品国产网站| 国产69精品久久久久毛片| 在线欧美日韩国产| 精品日韩欧美一区二区| 日韩美女精品在线| 久久精品国产**网站演员| 97国产一区二区| 精品少妇一区二区三区在线播放 | 成人午夜视频网站| 欧美日韩在线一区二区| 国产亚洲综合色| 偷窥国产亚洲免费视频| 国产一区999| 欧美日韩免费电影| 欧美国产欧美综合| 免费在线视频一区| 一本一本大道香蕉久在线精品| 欧美成人女星排行榜| 亚洲精品午夜久久久| 国产乱一区二区| 欧美日韩成人在线一区| 国产精品国产精品国产专区不片| 日韩在线一二三区| 色就色 综合激情| 欧美国产日韩精品免费观看| 男人操女人的视频在线观看欧美| 91美女视频网站| 久久精品水蜜桃av综合天堂| 三级成人在线视频| 色综合一个色综合| 亚洲国产精品黑人久久久| 老司机午夜精品| 欧美性一区二区| 亚洲欧洲精品一区二区精品久久久 | 一区二区三区四区不卡视频| 国产综合久久久久久鬼色| 欧美日本乱大交xxxxx| 国产精品成人免费| 国产激情一区二区三区| 精品国产髙清在线看国产毛片| 一区二区三区在线视频免费观看| 成人性生交大片免费看中文网站| 日韩天堂在线观看| 日本在线不卡视频| 欧美日韩免费视频| 一区二区欧美视频| 一本久久a久久免费精品不卡| 欧美高清在线一区| 国产91清纯白嫩初高中在线观看| 日韩欧美一级二级三级| 午夜成人免费视频| 欧美日韩在线直播| 亚洲成人免费影院| 91电影在线观看| 亚洲免费视频成人| 91在线精品一区二区三区| 国产精品入口麻豆原神| 国产成人午夜99999| 国产视频一区在线播放| 九一久久久久久| 精品国产凹凸成av人网站| 麻豆91精品91久久久的内涵| 日韩免费视频一区二区| 免费在线观看不卡| 日韩精品在线一区| 久久99久久99| 奇米一区二区三区| 777午夜精品视频在线播放| 日韩高清一区二区| 日韩片之四级片| 国内精品嫩模私拍在线| 久久久青草青青国产亚洲免观| 国产激情精品久久久第一区二区| 国产精品卡一卡二| 色一区在线观看| 日韩精品视频网站| 精品国产乱码久久|