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

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

?? arm_00_os_taskswitch.c

?? 一個基于arm的
?? C
?? 第 1 頁 / 共 2 頁
字號:
/**********************************************************************************************
本程序只供學習使用,不得用于其它任何用途,否則后果自負。

  ARM_00_OS_TaskSwitch.c file
  
  注意:該文件必須設置為ARM模式。
  
  作者:Computer-lov
  建立日期:2006-5-1
  修改日期:2006-5-16
  版本:V1.0
  版權所有,盜版必究。
  任何技術問題可到我的博客上留言:    http://computer00.21ic.org
  Copyright(C) Computer-lov 2006-2016
  All rights reserved
**********************************************************************************************/

#include <ADuC7027.H>
#include "My_type.h"
#include "LED.H"
#include "UART.H"
#include "KEYS.H"
#include "interrupt.h"
#include "ARM_00_OS_Core.H"
#include "ARM_00_OS_TaskSwitch.H"

/**********************************************************************************************
功能:禁止中斷。
入口參數1:DisEnabledBit。即CPSR中對應的I位和Q位。
           頭文件中有定義,#define OS_I_Bit 0x80 #define OS_F_Bit 0x40
		   關IRQ中斷時,使用OS_I_Bit,關FIQ中斷時,使用OS_F_Bit。
		   兩個都關時,將兩者按位或,即 OS_I_Bit | OS_F_Bit
返回:無。
使用資源:使用軟中斷號0。
備注:使用了內嵌的ARM指令,該函數所在的文件必須設置為ARM模式。
**********************************************************************************************/
void DisEnableInterrupt(uint32 DisEnableBit) __swi(0)
{
 __asm LDMIA SP!,{R8}     //堆棧中保存的是SPSR寄存器(參看SWI_VEC.s文件),將其彈出至R8中。
 __asm ORR R8,R8,R0,LSL #0  //R8中的值,跟傳遞進來的DisEnableBit(被放在R0中)相或。{}
 __asm STMDB SP!,{R8}        //將設置好的SPSR寄存器,壓回堆棧

 DisEnableBit=0;            //防止編譯器警告。請不要刪除該語句。如果刪除該語句,編譯器可能會刪除某些語句
                            //從而導致程序運行錯誤
}
//////////////////////////////////End of function//////////////////////////////////////////////



/**********************************************************************************************
功能:使能中斷。
入口參數1:EnabledBit。即CPSR中對應的I位和Q位。
           頭文件中有定義,#define OS_I_Bit 0x80 #define OS_F_Bit 0x40
		   關IRQ中斷時,使用OS_I_Bit,關FIQ中斷時,使用OS_F_Bit。
		   兩個都關時,將兩者按位或,即 OS_I_Bit | OS_F_Bit
返回:無。
使用資源:使用軟中斷號1。
備注:使用了內嵌的ARM指令,該函數所在的文件必須設置為ARM模式。
**********************************************************************************************/
void EnableInterrupt(uint32 EnableBit) __swi(1)
{
 __asm LDMIA SP!,{R8}  //堆棧中保存的是SPSR寄存器(參看SWI_VEC.s文件),將其彈出至R8中
 __asm MVN R0,R0       //EnableBit(被放在R0中)取反
 __asm AND R8,R8,R0    //R8中的值,跟R0相與{} 
 __asm STMDB SP!,{R8}  //將設置好的SPSR寄存器,壓回堆棧
 

 EnableBit=0;            //防止編譯器警告。請不要刪除該語句

}
//////////////////////////////////End of function//////////////////////////////////////////////



/**********************************************************************************************
功能:啟動操作系統。
入口參數1:AddrOfSystemIdle。必須設置為系統空閑任務的入口地址。系統啟動后,從系統空閑任務開始運行。
入口參數2:Mode。系統空閑任務代碼的模式。可以選擇ARM_MODE或者THUMB_MODE。
返回:無。
使用資源:使用軟中斷號2。
備注:使用了內嵌的ARM指令,該函數所在的文件必須設置為ARM模式。系統啟動后,進入系統空閑任務。
**********************************************************************************************/
void OSStart(uint32 AddrOfSystemIdle,uint32 Mode) __swi(2)
{
 __asm ADD SP,SP,#20     //{}調整SP,使其指向返回地址的前一個字
 __asm STMDB SP,{R0}    //將入口地址壓入堆棧中的返回地址處
 
 __asm SUB SP,SP,#20    //{}將堆棧指針調回
 
 __asm LDMIA SP!,{R8}   //將SPSR彈出,放入R8中

 Mode|=~(0x20);         //將傳遞進來的Mode其它位設置為1,只保留T位
 
 __asm ORR R8,R8,#0x20  //將SPSR中的T位設置為1{}
 __asm AND R8,R8,R1     //將SPSR的值與Mode相與。從而T位跟Mode的T位相同{}
 
 __asm STMDB SP!,{R8}   //將SPSR壓回棧中
 
 
 OSCurrentPcb=&OSSystemIdlePcb;   //當前任務為系統空閑任務

 AddrOfSystemIdle=0;              //防止編譯器警告。請不要刪除該語句

}
//////////////////////////////////End of function//////////////////////////////////////////////


/**********************************************************************************************
功能:保存堆棧指針。堆棧指針被保存在當前任務的TaskSP成員中。
入口參數1:sp。當前任務堆棧指針的地址值。
返回:無。
備注:sp由R0寄存器傳入。
**********************************************************************************************/
void OSSaveSP(uint32 sp)
{
 OSCurrentPcb->TaskSP=sp;  //保存當前堆棧指針
}
//////////////////////////////////End of function//////////////////////////////////////////////


/**********************************************************************************************
功能:恢復堆棧指針。將當前任務的堆棧指針恢復。
入口參數1:無。
返回:堆棧指針的地址值。被保存在R0中。
備注:無。
**********************************************************************************************/
uint32 OSResumeSP(void)
{
 return OSCurrentPcb->TaskSP;    //將堆棧指針的地址值返回
}
//////////////////////////////////End of function//////////////////////////////////////////////

/**********************************************************************************************
功能:設置堆棧。任務創建時,要設置好其堆棧,使其看起來,就像任務剛被切換的任務一樣。
入口參數1:StackAddr。32位的堆棧入口地址值,堆棧是往下生長的,所以入口地址應該是堆棧區的最高地址。
入口參數2:TaskEntryAddr。32位的任務入口地址值。
入口參數3:Mode。被創建任務代碼的模式。可選擇為OS_ARM_MODE或者OS_THUMB_MODE。
返回:32位的堆棧地址。被壓入堆棧后,堆棧指針會更新。
使用資源:使用軟中斷號4。
備注:無。
**********************************************************************************************/
uint32 OSSetStack(uint32 StackAddr,uint32 TaskEntryAddr,uint32 Mode) __swi(4)
{
#define PushedBytes (16*4)    //壓入了16個字,共64字節
 //R0中保存的是堆棧入口地址
 __asm MOV R12,R0        //{}StackAddr傳進時,被放在了R0中。將R0轉存至R12中。
 __asm STMDB R12!,{R3}    //入口地址被TaskEntryAddr被編譯器轉移至R3中。將R3壓棧
 __asm MOV R8,#0         //{}R8清零
 __asm STMDB R12!,{R8}   //該位置保存的是R3。將其清0。
 __asm STMDB R12!,{R8}   //該位置保存的是R2。將其清0。
 __asm STMDB R12!,{R8}   //該位置保存的是R1。將其清0。
 __asm STMDB R12!,{R8}   //該位置保存的是R0。將其清0。
 
 __asm LDMIA SP,{R8}     //將剛壓入的SPSR(見SWI_VEC.S文件)出棧至R8中。


 Mode|=~(0x20);          //將Mode的其它位置1,只保留T位。
 __asm ORR R8,R8,#0x20   //將SPSR中的T位置1。
 __asm AND R8,R8,R2      //將SPSR的值與Mode相與。從而T位跟Mode的T位相同{}
 
 __asm STMDB R12!,{R8}   //將SPSR壓棧。任務被調度時,SPSR將被返回至CPSR。 
 
 __asm MOV R8,#0         //R8清0{}
 
 __asm STMDB R12!,{R8}  //該位置保存的是用戶模式下的R14。將其清0。
 
 __asm STMDB R12!,{R8}  //該位置保存的是R12。將其清0。
 __asm STMDB R12!,{R8}  //該位置保存的是R11。將其清0。
 __asm STMDB R12!,{R8}  //該位置保存的是R10。將其清0。
 __asm STMDB R12!,{R8}  //該位置保存的是9。將其清0。
 __asm STMDB R12!,{R8}  //該位置保存的是R8。將其清0。
 __asm STMDB R12!,{R8}  //該位置保存的是R7。將其清0。
 __asm STMDB R12!,{R8}  //該位置保存的是R6。將其清0。
 __asm STMDB R12!,{R8}  //該位置保存的是R5。將其清0。
 __asm STMDB R12!,{R8}  //該位置保存的是R4。將其清0。

 TaskEntryAddr=0;       //防止編譯器警告。請不要刪除該語句。

 return StackAddr-PushedBytes;   //返回堆棧指針
}
//////////////////////////////////End of function//////////////////////////////////////////////


/**********************************************************************************************
功能:切換任務。任務被切換到優先級最高的就緒態任務。
入口參數:無。
返回:無。
使用資源:使用軟中斷號3。
備注:該函數為任務切換函數,修改這里的代碼是要注意,可能會導致跑飛。
**********************************************************************************************/
void OSTaskSwitch(void) __swi(3)
{
//將用戶模式下的堆棧地址裝入到R8中
 __asm MOV R8,SP         //{}特權模式下的堆棧指針暫時放到R8{}
 __asm STMDB R8!,{R13}^  //將用戶模式下的堆棧指針R13放入到特權模式下的堆棧中{}
 __asm NOP               //插入一個NOP指令,在訪問用戶模式下的寄存器后,后面不能緊跟訪問備份寄存器的指令,所以插入一個NOP指令{}
 __asm MOV SP,R8         //剛剛是借用R8來訪問堆棧的,R8被更新后,應該將其寫回SP中{}
  
 __asm LDMIA SP!,{R8}    //將剛壓入的用戶堆棧地址彈出至R8
  
  
 __asm ADD SP,SP,#20   //{}調整SP的值,使SP指向堆棧內的返回地址。堆棧的結構:返回地址,R12,R8,R3,SPSR,R14。當前的SP指向R14
                       //調整后,SP指向返回地址 
  
 __asm LDMDA SP!,{R12}  //{}將返回地址彈出至R12
 
 __asm STMDB R8!,{R12}  //將返回地址壓入用戶棧

 __asm STMDB R8!,{R0-R3} //將R0-R3壓入用戶棧

 __asm LDMDA SP!,{R3}    //彈出R12放入到R3中

 __asm LDMDA SP!,{R2}    //彈出R8放入到R2中

 __asm SUB SP,SP,#4      //跳過被壓入的R3,這里未用到{}
 
 __asm LDMDA SP!,{R1}   //彈出SPSR放入到R1中

 __asm MOV R0,R8     //R8是堆棧地址,轉存到R0{}

 __asm STMDB R0!,{R1} //{}R1在SPSR中,將其壓入用戶堆棧中


 __asm STMDB R0!,{R14}^  //將用戶模式下的R14壓入用戶堆棧中
 __asm MOV R8,R2         //R2中保存的是R8,將其放入R8中{}
 __asm MOV R12,R3        //R3中保存的是R12,將其放入R12{}
 __asm STMDB R0!,{R4-R12} //將R4-R12壓入用戶堆棧中


 __asm BL OSSaveSP   //保存堆棧指針{}

  if(TimeOfTaskStart<T0VAL)   //T0VAL是計數器0的值。T0VAL的值是減小的。如果T0VAL大于上一次的值,則說明已經溢出
   {
    OSCurrentPcb->RunTimeInThisRefreshPeriod+=TimeOfTaskStart+MaxOfTimer0+1-T0VAL;  //計算時間差
   }
  else  //否則
   {
    OSCurrentPcb->RunTimeInThisRefreshPeriod+=TimeOfTaskStart-T0VAL;   //計算時間差

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜精品一区二区三区三上悠亚| 色婷婷久久综合| 日本在线不卡视频| 亚洲va欧美va国产va天堂影院| 亚洲一区在线看| 亚洲自拍偷拍九九九| 亚洲国产日韩a在线播放| 亚洲一区二区中文在线| 亚洲一区二区三区四区不卡| 亚洲一区二区影院| 午夜天堂影视香蕉久久| 日本美女视频一区二区| 精品影院一区二区久久久| 国产一区在线看| 国产99久久精品| 99久久久精品免费观看国产蜜| 91在线观看一区二区| 欧美性色黄大片| 在线成人午夜影院| 精品久久久久香蕉网| 国产精品五月天| 亚洲精品老司机| 日韩av电影一区| 国产麻豆视频一区| 91蜜桃传媒精品久久久一区二区| 日本乱码高清不卡字幕| 欧美精品粉嫩高潮一区二区| 欧美tk—视频vk| 国产精品久久久久久久久果冻传媒| 亚洲免费在线电影| 日本特黄久久久高潮| 国产美女主播视频一区| 色悠久久久久综合欧美99| 欧美精品丝袜中出| 国产欧美日韩激情| 一区二区三区成人在线视频| 蜜乳av一区二区三区| 99热在这里有精品免费| 欧美日韩视频一区二区| 久久久不卡网国产精品二区| 亚洲欧美一区二区三区久本道91| 日韩va亚洲va欧美va久久| 粉嫩一区二区三区性色av| 欧美日韩中字一区| 久久精品人人做| 亚洲大片一区二区三区| 国产福利一区在线观看| 欧美视频在线不卡| 久久久久久久免费视频了| 一区二区三区精品| 国产福利一区二区三区视频| 欧美日韩国产bt| 国产精品福利一区| 蜜臀av一区二区在线免费观看| av成人动漫在线观看| 欧美一级片免费看| 亚洲欧美激情一区二区| 韩国精品免费视频| 欧美精品一二三区| 亚洲色图欧洲色图| 国产成人精品综合在线观看 | av一区二区久久| 日韩欧美色综合| 亚洲成人精品一区二区| 国产a久久麻豆| 欧美mv日韩mv国产网站app| 亚洲高清免费一级二级三级| 成人污视频在线观看| 日韩精品专区在线| 亚洲高清在线精品| 91亚洲精品一区二区乱码| 久久久国产综合精品女国产盗摄| 日本中文在线一区| 欧美日韩一级黄| 亚洲欧洲精品一区二区三区| 国产麻豆精品theporn| 91精品国产全国免费观看| 亚洲精品国产品国语在线app| 懂色av中文一区二区三区 | 美脚の诱脚舐め脚责91| 一本久道久久综合中文字幕| 欧美国产日韩精品免费观看| 激情久久久久久久久久久久久久久久| 欧美日韩精品电影| 一区二区不卡在线视频 午夜欧美不卡在| 国产高清亚洲一区| 国产肉丝袜一区二区| 国产乱子伦视频一区二区三区| 日韩一二三四区| 美女mm1313爽爽久久久蜜臀| 欧美一区二区在线视频| 婷婷开心激情综合| 欧美日韩国产美| 亚洲小少妇裸体bbw| 91精品1区2区| 一区二区三区成人在线视频| 欧美亚洲高清一区| 亚洲va在线va天堂| 91精品国产一区二区三区蜜臀| 亚洲成人免费影院| 欧美日韩国产综合久久| 午夜成人免费电影| 欧美一级日韩一级| 国内精品写真在线观看| 精品不卡在线视频| 国产精品一二三区| 日本一区二区三区四区| 成人免费av在线| 日韩理论片中文av| 色综合天天在线| 亚洲制服欧美中文字幕中文字幕| 在线免费不卡电影| 亚洲国产精品一区二区久久| 精品视频色一区| 免费在线观看日韩欧美| 精品女同一区二区| 国产精品一区二区无线| 中文字幕精品—区二区四季| 91老师片黄在线观看| 亚洲在线一区二区三区| 欧美一区三区四区| 国产一二精品视频| 亚洲天堂2014| 884aa四虎影成人精品一区| 麻豆精品视频在线观看视频| 久久九九久久九九| 99久久精品一区| 丝袜美腿亚洲一区二区图片| 精品国产三级a在线观看| 成人午夜精品在线| 一区二区三区日韩| 日韩一二在线观看| av电影在线观看一区| 视频一区二区三区中文字幕| 精品少妇一区二区三区日产乱码 | 欧美人妖巨大在线| 久久精品国产秦先生| 中文无字幕一区二区三区| 色婷婷久久99综合精品jk白丝| 亚洲成人免费影院| 国产日韩欧美高清在线| 欧美中文字幕久久| 精品一区二区免费| 亚洲男帅同性gay1069| 欧美精品久久久久久久多人混战 | 精品久久国产字幕高潮| 成人午夜在线视频| 日本一区中文字幕| 自拍偷自拍亚洲精品播放| 911精品产国品一二三产区| 国产成人三级在线观看| 亚洲主播在线观看| 久久先锋影音av鲁色资源网| 色94色欧美sute亚洲线路一久 | 欧美精品一区二区三区四区| 91麻豆国产精品久久| 青青草成人在线观看| 国产精品成人免费在线| 日韩精品一区二区三区中文精品| 99精品桃花视频在线观看| 久久精品国产精品亚洲红杏| 亚洲欧洲综合另类| 国产欧美日韩精品一区| 4hu四虎永久在线影院成人| av网站一区二区三区| 久久国产精品99精品国产 | 国产91在线观看丝袜| 亚洲高清免费视频| 中文字幕一区二区三区在线不卡 | 91精品国产综合久久精品app| 成人午夜伦理影院| 国产自产高清不卡| 香蕉加勒比综合久久| 综合婷婷亚洲小说| 国产日产欧美精品一区二区三区| 日韩一区二区三区电影 | 亚洲男同性恋视频| 国产欧美综合在线| 欧美电影免费观看高清完整版在线观看 | 亚洲欧美怡红院| 久久婷婷一区二区三区| 欧美一区二区三区成人| 91官网在线免费观看| 成人免费黄色大片| 国产精品白丝jk黑袜喷水| 蜜桃在线一区二区三区| 亚洲无人区一区| 亚洲一区二区三区四区在线免费观看 | 成人综合婷婷国产精品久久免费| 日本不卡中文字幕| 亚洲超碰精品一区二区| 一区二区三区国产豹纹内裤在线| 一区精品在线播放| 亚洲国产高清在线观看视频| 久久久久国产精品人| 久久一二三国产| 日韩欧美国产系列| 日韩欧美高清dvd碟片| 欧美精品乱码久久久久久| 欧美精品久久一区|