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

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

?? rtos.c

?? rtos 是atmega單片機用的實時系統
?? C
?? 第 1 頁 / 共 2 頁
字號:
/************************************************************************************************************************
*										RTOS.c
*
*
*
************************************************************************************************************************/
#include "RTOS.h"
#include "lcd.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)
{
	Sem[Index].OSEventType=Type;
	Sem[Index].OSTaskPendTbl=0;				/*初始化時任務等待列表為空*/
	Sem[Index].OSEventState=0;				/*信號量無效*/
}

/************************************************************************************************************************
函數名稱:	OSTaskSemPend
函數原型:	Uint_8bit OSTaskSemPend(Uint_8bit Index,Uint_16bit Timeout) 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本一区二区高清| 欧美日韩久久久一区| 欧美系列日韩一区| 精品粉嫩超白一线天av| 一区二区三区四区精品在线视频| 日本中文字幕一区| 91丨九色porny丨蝌蚪| 欧美xxxxx牲另类人与| 亚洲一级电影视频| 成人激情开心网| 2023国产一二三区日本精品2022| 性感美女极品91精品| av福利精品导航| 精品久久久网站| 日韩中文欧美在线| 欧美性猛片xxxx免费看久爱| 国产精品成人在线观看| 国产成人av在线影院| 精品久久久久久久久久久久久久久 | 毛片av一区二区| 色婷婷av久久久久久久| 日韩毛片精品高清免费| 成人在线一区二区三区| 2023国产精品| 国产精品88av| 国产网站一区二区| 国产在线精品不卡| 久久久另类综合| 国产精品综合在线视频| 精品国产一区二区三区四区四| 天天综合色天天| 欧美肥妇bbw| 天堂在线一区二区| 欧美伊人精品成人久久综合97| 亚洲欧美区自拍先锋| 亚洲欧美一区二区三区孕妇| 91精品一区二区三区久久久久久| 欧美精品久久天天躁| 亚洲一区二区av在线| 欧美日韩一区精品| 日一区二区三区| 91精品啪在线观看国产60岁| 日本亚洲最大的色成网站www| 欧美精品在线一区二区三区| 蜜桃久久精品一区二区| 欧美一区二区视频在线观看| 蜜桃视频一区二区| 国产婷婷色一区二区三区四区| 国产在线视视频有精品| 国产精品视频免费看| 91网站最新地址| 亚洲va欧美va人人爽| 欧美精品在线一区二区三区| 国内精品视频一区二区三区八戒| 国产日韩一级二级三级| 91在线观看一区二区| 亚洲国产日韩a在线播放性色| 色婷婷久久久综合中文字幕 | 一区av在线播放| 欧美日韩免费一区二区三区视频| 日韩精品一级二级| 国产欧美一区二区三区在线看蜜臀| 成人av在线一区二区| 午夜一区二区三区在线观看| 久久先锋资源网| 91亚洲资源网| 日本 国产 欧美色综合| 欧美国产精品一区| 欧美日韩不卡一区| 国产精品一区2区| 亚洲欧洲综合另类| 精品国产露脸精彩对白| 91在线国内视频| 极品少妇一区二区三区精品视频| 综合激情成人伊人| 精品久久久久一区二区国产| 在线中文字幕不卡| 国产黄色成人av| 一区二区三区日韩精品视频| 久久久精品tv| 在线成人av网站| 97精品电影院| 国产一区二区导航在线播放| 亚洲超碰精品一区二区| 国产欧美一区二区三区鸳鸯浴| 欧美日韩一级二级| 成人网页在线观看| 久久99久久99| 五月婷婷激情综合| 综合中文字幕亚洲| 2023国产精品自拍| 欧美成人精品二区三区99精品| 91在线国内视频| 成人免费福利片| 韩国一区二区三区| 婷婷综合久久一区二区三区| 亚洲欧洲日韩av| 欧美电影免费观看高清完整版 | 亚洲久本草在线中文字幕| 色婷婷精品大在线视频| 性感美女极品91精品| 有码一区二区三区| 国产精品久久午夜夜伦鲁鲁| 久久精品夜夜夜夜久久| 日韩欧美国产一区在线观看| 在线一区二区观看| 成人黄页毛片网站| 国产91精品露脸国语对白| 精品一二三四区| 男男视频亚洲欧美| 免费在线一区观看| 免费成人深夜小野草| 亚洲成人激情av| 亚洲一区二区黄色| 亚洲国产人成综合网站| 亚洲男同1069视频| 亚洲精品你懂的| 亚洲天堂中文字幕| 国产精品福利影院| 亚洲欧洲日本在线| 一区二区三区在线高清| 一区二区三区国产| 亚洲一区二区三区美女| 丝袜国产日韩另类美女| 日本不卡视频在线观看| 久久精品久久久精品美女| 五月天亚洲精品| 美女在线视频一区| 国产剧情在线观看一区二区| 国产91精品久久久久久久网曝门| 99久久久精品免费观看国产蜜| 99热精品国产| 精品视频在线免费看| 日韩欧美国产综合在线一区二区三区 | 美美哒免费高清在线观看视频一区二区 | 国产一区二区在线看| 久久精品国产第一区二区三区| 国产乱人伦偷精品视频免下载 | 国产精品美女久久久久久久久| 国产精品沙发午睡系列990531| 日韩美女精品在线| 日韩av电影天堂| 国产精品夜夜嗨| av一区二区不卡| 欧美伦理影视网| 国产欧美一区二区三区鸳鸯浴| 99re6这里只有精品视频在线观看| 在线一区二区三区做爰视频网站| 91精品婷婷国产综合久久竹菊| 欧美极品美女视频| 亚洲一区二区三区在线| 久久国产夜色精品鲁鲁99| 国产黄色精品视频| 欧美日韩精品二区第二页| 精品国产乱码久久久久久影片| 最新热久久免费视频| 秋霞午夜鲁丝一区二区老狼| 国产a视频精品免费观看| 欧美日韩卡一卡二| 国产精品久久久久精k8| 日韩经典一区二区| 成人动漫在线一区| 91麻豆精品国产91久久久久久久久 | 韩国女主播一区| 色激情天天射综合网| 久久午夜羞羞影院免费观看| 亚洲一卡二卡三卡四卡五卡| 国产精品一二一区| 欧美片在线播放| 日韩毛片高清在线播放| 麻豆成人91精品二区三区| 99re8在线精品视频免费播放| 欧美mv日韩mv亚洲| 亚洲国产精品久久久久秋霞影院| 国产91综合一区在线观看| 欧美一区二区久久| 亚洲主播在线观看| 国产999精品久久| 精品第一国产综合精品aⅴ| 天堂蜜桃91精品| 91行情网站电视在线观看高清版| 久久伊人蜜桃av一区二区| 日韩国产欧美在线播放| 欧美中文字幕不卡| 亚洲欧美电影院| av午夜一区麻豆| 中文字幕第一页久久| 国产一区二区电影| 欧美xxxxxxxxx| 日本成人在线电影网| 欧美日韩免费电影| 一区二区三区在线不卡| 色综合天天做天天爱| 中文字幕一区日韩精品欧美| 国产**成人网毛片九色 | 在线观看日韩国产| 国产精品国产三级国产有无不卡 | 欧美一级片在线| 一区二区在线观看免费| 日本韩国视频一区二区|