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

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

?? rtos.c

?? 嵌入式教程嵌入式教程嵌入式教程嵌入式教程嵌入式教程嵌入式教程嵌入式教程
?? C
?? 第 1 頁 / 共 2 頁
字號:
/************************************************************************************************************************
*										RTOS.c
*
*
*
************************************************************************************************************************/
#include "RTOS.h"

/************************************************************************************************************************
函數名稱:	OSTaskCreate
函數原型:	void OSTaskCreate(void (*Task)(void),Uint_8bit *Stack,Uint_8bit TaskID)
函數功能:	建立任務 
入口參數:	*Task:任務函數地址;*Stack:任務堆棧指針;TaskID:任務優先級
出口參數:	無
有關說明:	
創建時間:	2007年3月3日
修改時間:	
************************************************************************************************************************/
void OSTaskCreate(void (*Task)(void),Uint_8bit *Stack,Uint_8bit TaskID)
{
	Uint_8bit i;
	*Stack--=(Uint_16bit)Task;				/*將任務的地址低位壓入堆棧		*/
	*Stack--=(Uint_16bit)Task>>8;			/*將任務的地址高位壓入堆棧		*/

	*Stack--=0x00;							/*R1 __zero_reg__				*/
	*Stack--=0x00;							/*R0 __tmp_reg__				*/
	*Stack--=0x80;							/*SREG 在任務中,開啟全局中斷	*/
	for(i=0;i<14;i++)
    *Stack--=i;
	/*
		在 avr-libc 中的 FAQ中的 What registers are used by the C compiler?
		描述了寄存器的作用
	*/
	TCB[TaskID].OSTaskStackTop = (Uint_16bit)Stack;
	/*
		將人工堆棧的棧頂,保存到堆棧的數組中
	*/
	OSRdyTbl |= 0x01<<TaskID;      			/*任務就緒表已經準備好			*/
}

/************************************************************************************************************************
函數名稱:	OSStartTask
函數原型:	void OSStartTask(void)
函數功能:	開始任務調度,從空閑任務開始運行 
入口參數:	無
出口參數:	無
有關說明:	執行"reti"指令之后打開全局中斷
創建時間:	2007年3月3日
修改時間:	
************************************************************************************************************************/
void OSStartTask(void)
{
	OSPrioCur = OS_TASKS;
	OSPrioHighRdy = OS_TASKS;
	SP=TCB[OS_TASKS].OSTaskStackTop+17;
	__asm__ __volatile__(    "reti"       "\n\t"  );
}

/************************************************************************************************************************
函數名稱:	OS_TASK_SW
函數原型:	void OS_TASK_SW(void)
函數功能:	進行任務調度 
入口參數:	無
出口參數:	無
有關說明:	中斷和任務都可以調用這個任務調度函數
創建時間:	2007年3月3日
修改時間:	
************************************************************************************************************************/
void OS_TASK_SW(void)
{

	__asm__ __volatile__("LDI  R16,0x01             \n\t");
	/*
		清除中斷要求任務切換的標志位,設置正在任務切換標志位
	*/
	__asm__ __volatile__("SEI                       \n\t");
	/*
		開中斷,因為如果因中斷在任務調度中進行,要重新進行調度時,已經關中斷
	*/
	/*  根據中斷時保存寄存器的次序入棧,模擬一次中斷后,入棧的情況*/
	__asm__ __volatile__("PUSH __zero_reg__         \n\t");	/*R1 					*/
	__asm__ __volatile__("PUSH __tmp_reg__          \n\t");	/*R0					*/
	__asm__ __volatile__("IN   __tmp_reg__,__SREG__ \n\t");	/*保存狀態寄存器SREG	*/
	__asm__ __volatile__("PUSH __tmp_reg__          \n\t"); 
	__asm__ __volatile__("CLR  __zero_reg__         \n\t");	/*R0重新清零			*/
	__asm__ __volatile__("PUSH R18                  \n\t");
	__asm__ __volatile__("PUSH R19                  \n\t");
	__asm__ __volatile__("PUSH R20                  \n\t");
	__asm__ __volatile__("PUSH R21                  \n\t");
	__asm__ __volatile__("PUSH R22                  \n\t");
	__asm__ __volatile__("PUSH R23                  \n\t");
	__asm__ __volatile__("PUSH R24                  \n\t");
	__asm__ __volatile__("PUSH R25                  \n\t");
	__asm__ __volatile__("PUSH R26                  \n\t");
	__asm__ __volatile__("PUSH R27                  \n\t");
	__asm__ __volatile__("PUSH R30                  \n\t");  
	__asm__ __volatile__("PUSH R31                  \n\t");
	
	__asm__ __volatile__("Int_OSSched:              \n\t");	/*當中斷要求調度,直接進入這里		*/ 
	__asm__ __volatile__("SEI                       \n\t");
	/*
		開中斷,因為如果因中斷在任務調度中進行,已經關中斷
	*/
	__asm__ __volatile__("PUSH R28                  \n\t");	/*R28與R29用于建立在堆棧上的指針	*/
	__asm__ __volatile__("PUSH R29                  \n\t");	/*入棧完成							*/
	
	TCB[OSPrioCur].OSTaskStackTop=SP;					/*將正在運行的任務的堆棧底保存		*/
	
	OSPrioCur = OSPrioHighRdy ;							/*運行當前就緒表中的最高優先級任務	*/
	
	cli();												/*保護堆棧轉換,屬于臨界代碼,要保護	*/
	SP=TCB[OSPrioCur].OSTaskStackTop;
	sei();
	
	/*根據中斷時的出棧次序*/
	__asm__ __volatile__("POP  R29                  \n\t");
	__asm__ __volatile__("POP  R28                  \n\t");
	__asm__ __volatile__("POP  R31                  \n\t");
	__asm__ __volatile__("POP  R30                  \n\t");
	__asm__ __volatile__("POP  R27                  \n\t");
	__asm__ __volatile__("POP  R26                  \n\t");
	__asm__ __volatile__("POP  R25                  \n\t");
	__asm__ __volatile__("POP  R24                  \n\t");
	__asm__ __volatile__("POP  R23                  \n\t");
	__asm__ __volatile__("POP  R22                  \n\t");
	__asm__ __volatile__("POP  R21                  \n\t");
	__asm__ __volatile__("POP  R20                  \n\t");
	__asm__ __volatile__("POP  R19                  \n\t");
	__asm__ __volatile__("POP  R18                  \n\t");
	__asm__ __volatile__("POP  __tmp_reg__          \n\t");		/*SERG 出棧并恢復	*/
	__asm__ __volatile__("OUT  __SREG__,__tmp_reg__ \n\t");
	__asm__ __volatile__("POP  __tmp_reg__          \n\t");		/*R0 出棧			*/
	__asm__ __volatile__("POP  __zero_reg__         \n\t");		/*R1 出棧			*/
	/*中斷時出棧完成*/
	__asm__ __volatile__("CLI                       \n\t");		/*關中斷			*/
	__asm__ __volatile__("SBRC R16,1                \n\t");
	/*
		SBRC當寄存器位為0則跳過下一條指令
		檢查系統正在進行任務調度時,是否有中斷發生并進行要求任務調度,
		如果中斷要求調度則重新進行一次任務調度。
		0x02是中斷要求調度的標志位
	*/
	__asm__ __volatile__("RJMP OSSched              \n\t");		/*重新調度			*/
	__asm__ __volatile__("LDI  R16,0x00             \n\t");
	/*
		清除中斷要求任務切換的標志位,清除正在任務切換標志位,
		表示任務切換已經完成。
	*/
	__asm__ __volatile__("RETI                      \n\t");     /*返回并開中斷		*/
}

/************************************************************************************************************************
函數名稱:	IntSwitch
函數原型:	void IntSwitch(void)
函數功能:	從中斷退出并進行調度
入口參數:	無
出口參數:	無
有關說明:	當無中斷嵌套并且中斷中要求進行任務切換時才進行任務切換。
*			因為從中斷到運行下一個任務共調用了兩次子函數,所以要彈出四個入棧的PC
創建時間:	2007年3月3日
修改時間:	
************************************************************************************************************************/
void IntSwitch(void)
{
	if((OSCoreState == 0x02) && (OSIntNesting == 0))
	{
		/*
			進入中斷時,已經保存了SREG和R0,R1,R18~R27,R30,R31,
			所以沒有必要再保存一次了,直接跳轉到Int_OSSched進行下一個調度
		*/
		__asm__ __volatile__("POP  R31                  \n\t");	/*去除因調用子程序而入棧的PC*/
		__asm__ __volatile__("POP  R31                  \n\t");
		__asm__ __volatile__("POP  R31                  \n\t");
		__asm__ __volatile__("POP  R31                  \n\t");
		__asm__ __volatile__("LDI  R16,0x01             \n\t");
		/*
			清除中斷要求任務切換的標志位,設置正在任務切換標志位 
		*/
		__asm__ __volatile__("RJMP Int_OSSched          \n\t");	/*重新調度					*/
	}
}

/************************************************************************************************************************
函數名稱:	OSSched
函數原型:	void OSSched(void)
函數功能:	任務調度器,進行任務調度
入口參數:	無
出口參數:	無
有關說明:	只有有更高優先級的任務就緒時才進行一次任務切換,否則不做切換
創建時間:	2007年3月7日
修改時間:	
************************************************************************************************************************/
void OSSched (void)
{
	OSFindPrioHighRdy();						/*找出就緒表中優先級最高的任務*/
	if(OSPrioHighRdy != OSPrioCur)				/*如果不是當前運行的任務,進行任務調度*/
	{
		OS_TASK_SW();							/*調度任務*/
	}
}
/************************************************************************************************************************
函數名稱:	OSTaskSuspend
函數原型:	void OSTaskSuspend(Uint_8bit prio)
函數功能:	掛起任務 
入口參數:	prio:任務優先級
出口參數:	無
有關說明:	一個任務可以掛起本身也可以掛起其他任務
創建時間:	2007年3月3日
修改時間:	
************************************************************************************************************************/
void OSTaskSuspend(Uint_8bit prio)
{
	OS_ENTER_CRITICAL();
	TCB[prio].OSWaitTick=0;
	OSRdyTbl &= ~(0x01<<prio);		/*從任務就緒表上去除標志位	*/
	if(OSPrioCur == prio)			/*當要掛起的任務為當前任務	*/
	{
		OS_EXIT_CRITICAL();
		OSSched();					/*重新調度					*/
		return;
	}
	OS_EXIT_CRITICAL();
}

/************************************************************************************************************************
函數名稱:	OSTaskResume
函數原型:	void OSTaskResume(Uint_8bit prio)
函數功能:	恢復任務 可以讓被OSTaskSuspend或 OSTimeDly暫停的任務恢復 
入口參數:	prio:任務優先級
出口參數:	無
有關說明:	
創建時間:	2007年3月3日
修改時間:	
************************************************************************************************************************/
void OSTaskResume(Uint_8bit prio)
{
	OS_ENTER_CRITICAL();
	OSRdyTbl |= 0x01<<prio;			/*從任務就緒表上重置標志位	*/
    TCB[prio].OSWaitTick=0;			/*將時間計時設為0,到時		*/
	if(OSPrioCur > prio)			/*當要當前任務的優先級低于重置位的任務的優先級	*/
	{
		OS_EXIT_CRITICAL();
		OSSched();					/*重新調度					*/
		return;
	}
	OS_EXIT_CRITICAL();
}

/************************************************************************************************************************
函數名稱:	OSTimeDly
函數原型:	void OSTimeDly(Uint_16bit ticks)
函數功能:	任務延時 
入口參數:	延時的時間,任務時鐘的個數
出口參數:	無
有關說明:	如果延時65535(0xffff)則為無限延時
創建時間:	2007年3月3日
修改時間:	
************************************************************************************************************************/
void OSTimeDly(Uint_16bit ticks)
{
	if(ticks)                             	/*當延時有效 */
	{
		OS_ENTER_CRITICAL();
		OSRdyTbl &= ~(0x01<<OSPrioCur);	/*把任務從就緒表中去掉*/
		TCB[OSPrioCur].OSWaitTick=ticks;
		OS_EXIT_CRITICAL();
		OSSched();                          /*重新調度	*/
	}
}

/************************************************************************************************************************
函數名稱:	OSSemCreat
函數原型:	void OSSemCreat(Uint_8bit Index,Uint_8bit Type)
函數功能:	初始化信號量 
入口參數:	Index:信號量的序號;Type:信號量類型
出口參數:	無
有關說明:	Type為 0 信號量獨占型;1 信號量共享型
創建時間:	2007年3月3日
修改時間:	
************************************************************************************************************************/
void OSSemCreat(Uint_8bit Index,Uint_8bit Type)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
18成人在线观看| 日韩欧美黄色影院| 亚洲日本在线a| 色婷婷综合久久久中文字幕| 亚洲久草在线视频| 在线观看日韩av先锋影音电影院| 亚洲人妖av一区二区| 在线观看日韩av先锋影音电影院| 爽好多水快深点欧美视频| 欧美大白屁股肥臀xxxxxx| 国产精品一区二区久久精品爱涩 | 亚洲综合精品久久| 在线亚洲高清视频| 日韩av二区在线播放| 久久一二三国产| 色欧美日韩亚洲| 麻豆91在线播放| 国产精品日韩精品欧美在线| 91福利资源站| 国精品**一区二区三区在线蜜桃| 国产精品嫩草99a| 欧美日韩国产成人在线免费| 经典一区二区三区| 亚洲美女屁股眼交3| 欧美一区二区在线免费播放| 国产精品亚洲一区二区三区在线 | 欧美视频在线一区二区三区| 美女视频网站黄色亚洲| 欧美高清在线一区| 欧美日韩一级片在线观看| 精品一区二区三区的国产在线播放 | 日日欢夜夜爽一区| 久久久久高清精品| 欧美精品日韩一区| 成人激情综合网站| 日韩av不卡在线观看| 国产精品家庭影院| 日韩女优av电影在线观看| 色老汉av一区二区三区| 国产精品一二三在| 日本亚洲欧美天堂免费| 亚洲久本草在线中文字幕| 久久精品人人做人人综合| 精品1区2区3区| 成人国产视频在线观看 | 精品一二三四区| 一区二区三区免费网站| 国产欧美日本一区二区三区| 欧美一区永久视频免费观看| 色综合视频在线观看| 国产69精品久久久久毛片| 日本sm残虐另类| 亚洲一区二区免费视频| 国产精品国产三级国产| 精品av久久707| 日韩视频在线你懂得| 欧美日韩三级一区| 日本高清不卡一区| 91蜜桃在线免费视频| 从欧美一区二区三区| 国产在线乱码一区二区三区| 日韩高清不卡一区二区三区| 亚洲图片欧美一区| 一区二区三区四区激情| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 久久蜜臀中文字幕| 久久这里只有精品6| 久久综合久久综合久久| wwwwww.欧美系列| 精品国产乱码久久久久久牛牛 | 国产女同性恋一区二区| 精品国产污污免费网站入口| 日韩欧美一级片| 亚洲精品一区二区三区在线观看| 日韩一区二区电影网| 精品日韩av一区二区| 日韩欧美一二区| 欧美成人猛片aaaaaaa| 精品国产一区二区三区久久久蜜月| 日韩欧美的一区二区| 日韩精品在线看片z| 久久丝袜美腿综合| 欧美极品另类videosde| 国产精品午夜电影| ...xxx性欧美| 一区二区成人在线视频| 亚洲成人动漫在线观看| 日韩av不卡在线观看| 国产一区二区三区美女| 福利电影一区二区三区| 99久久久久久99| 欧美日韩精品福利| 欧美电影免费观看高清完整版在 | 欧美日韩一区二区三区高清 | 日本一区二区三区在线观看| 国产精品色呦呦| 亚洲欧美怡红院| 亚洲综合男人的天堂| 日日摸夜夜添夜夜添国产精品| 欧美bbbbb| 成人黄页毛片网站| 欧美无人高清视频在线观看| 日韩免费福利电影在线观看| 亚洲一区二区精品视频| 奇米影视一区二区三区小说| 韩国av一区二区三区四区 | 成人免费在线播放视频| 亚洲人成影院在线观看| 五月婷婷激情综合| 国产精品456露脸| 色婷婷av一区二区三区软件 | 久久精品一区二区三区av| 国产精品理论片| 亚洲大片一区二区三区| 国产乱色国产精品免费视频| 色94色欧美sute亚洲线路二| 精品久久99ma| 亚洲欧美另类小说视频| 免费人成网站在线观看欧美高清| 懂色av中文一区二区三区 | 91麻豆精品国产91久久久| 亚洲精品一区二区三区精华液| 国产精品久久久久久久久图文区 | 欧美大胆一级视频| 亚洲天堂2016| 精品一区二区三区免费| 91丨九色porny丨蝌蚪| 日韩欧美中文一区| 亚洲激情成人在线| 国产精品白丝av| 欧美日韩激情在线| 国产精品伦理一区二区| 久久精品久久99精品久久| 99久久久国产精品免费蜜臀| 欧美不卡一二三| 亚洲大片免费看| 91免费国产在线观看| 久久久噜噜噜久久人人看| 亚洲国产精品尤物yw在线观看| 国产91精品欧美| 欧美一区二视频| 亚洲影视在线观看| 不卡电影一区二区三区| www国产精品av| 日本vs亚洲vs韩国一区三区| 99久久久精品| 国产精品理伦片| 国产精品亚洲人在线观看| 91精品国产一区二区| 一区二区三区四区激情| 99精品一区二区| 亚洲国产高清aⅴ视频| 麻豆国产欧美日韩综合精品二区| 欧美色综合天天久久综合精品| 中文字幕一区二区三区四区| 国产麻豆精品视频| 精品成人一区二区三区四区| 日韩av一二三| 欧美精品一二三| 亚洲444eee在线观看| 欧美性感一区二区三区| 亚洲精品日韩综合观看成人91| 成人丝袜高跟foot| 国产亚洲欧美激情| 国产一区在线观看视频| 精品成人一区二区| 国产美女视频一区| 国产日韩欧美制服另类| 国产乱对白刺激视频不卡| xvideos.蜜桃一区二区| 国产精品主播直播| 国产欧美一区二区三区鸳鸯浴| 国产乱对白刺激视频不卡| 久久久久国产精品人| 国产91精品免费| 亚洲欧美怡红院| 欧美在线观看视频一区二区 | 久久精品欧美一区二区三区不卡 | 首页国产欧美久久| 91精品国产aⅴ一区二区| 奇米亚洲午夜久久精品| 欧美电影免费观看高清完整版在线 | 久久久久88色偷偷免费| 国产91精品一区二区| 一色桃子久久精品亚洲| 91蝌蚪porny九色| 亚洲国产视频在线| 日韩午夜激情电影| 国产精品主播直播| **性色生活片久久毛片| 日本韩国一区二区三区| 日韩精品一二区| 精品成人一区二区三区| www.欧美.com| 亚洲国产精品久久久男人的天堂 | 亚洲精品一区二区三区精华液| 国产精品中文有码| 亚洲欧美电影院| 777亚洲妇女| 国产91精品入口|