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

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

?? os_cpu.h

?? ucos注解版 內容大都是從邵貝貝和網上摘取的 有參考價值
?? H
字號:
/*
*********************************************************************************************************
*                                               uC/OS-II
*                                        The Real-Time Kernel
*
*                         (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
*                                          All Rights Reserved
*
*                                       80x86/80x88 Specific code
*                                          LARGE MEMORY MODEL
*
*                                          Borland C/C++ V4.51
*
* File         : OS_CPU.H
* By           : Jean J. Labrosse
*********************************************************************************************************
*/

#ifdef  OS_CPU_GLOBALS
#define OS_CPU_EXT
#else
#define OS_CPU_EXT  extern
#endif

/*
*********************************************************************************************************
*                                              DATA TYPES
*                                         (Compiler Specific)
*********************************************************************************************************
*/

typedef unsigned char  BOOLEAN;
typedef unsigned char  INT8U;                    /* Unsigned  8 bit quantity                           */
typedef signed   char  INT8S;                    /* Signed    8 bit quantity                           */
typedef unsigned int   INT16U;                   /* Unsigned 16 bit quantity                           */
typedef signed   int   INT16S;                   /* Signed   16 bit quantity                           */
typedef unsigned long  INT32U;                   /* Unsigned 32 bit quantity                           */
typedef signed   long  INT32S;                   /* Signed   32 bit quantity                           */
typedef float          FP32;                     /* Single precision floating point                    */
typedef double         FP64;                     /* Double precision floating point                    */

typedef unsigned int   OS_STK;                   /* Each stack entry is 16-bit wide                    */
typedef unsigned short OS_CPU_SR;                /* Define size of CPU status register (PSW = 16 bits) */

#define BYTE           INT8S                     /* Define data types for backward compatibility ...   */
#define UBYTE          INT8U                     /* ... to uC/OS V1.xx.  Not actually needed for ...   */
#define WORD           INT16S                    /* ... uC/OS-II.                                      */
#define UWORD          INT16U
#define LONG           INT32S
#define ULONG          INT32U

/* 
*********************************************************************************************************
*                              Intel 80x86 (Real-Mode, Large Model)
*
* Method #1:  Disable/Enable interrupts using simple instructions.  After critical section, interrupts
*             will be enabled even if they were disabled before entering the critical section.
*
* Method #2:  Disable/Enable interrupts by preserving the state of interrupts.  In other words, if 
*             interrupts were disabled before entering the critical section, they will be disabled when
*             leaving the critical section.
*
* Method #3:  Disable/Enable interrupts by preserving the state of interrupts.  Generally speaking you
*             would store the state of the interrupt disable flag in the local variable 'cpu_sr' and then
*             disable interrupts.  'cpu_sr' is allocated in all of uC/OS-II's functions that need to 
*             disable interrupts.  You would restore the interrupt disable state by copying back 'cpu_sr'
*             into the CPU's status register.
*********************************************************************************************************
*/
#define  OS_CRITICAL_METHOD    2

#if      OS_CRITICAL_METHOD == 1                          /*第一種方法是以最簡單的方式來實現這2個宏調用的:用
處理器指令關中斷,然而這種方法有點小問題,如果調用UCOS的功能函數時,中斷是關掉的,則從UCOS的函數返回時,中斷
就打開了。若調用UCOS的函數之前已將中斷關掉,那么用戶往往希望從UCOS的函數返回時,中斷仍然是關掉的。在此情況下
,這種實現方法就不妥當;但是對于一些特定的處理器和編譯器,使用這種方法是唯一的選擇*/
#define  OS_ENTER_CRITICAL()  asm  CLI                    /* Disable interrupts                        */
#define  OS_EXIT_CRITICAL()   asm  STI                    /* Enable  interrupts                        */
#endif

#if      OS_CRITICAL_METHOD == 2                          /*實現OS_ENTER_CRITICAL()的第二種方法是在堆棧中保存
中斷的開關狀態,然后再關中斷。在實現OS_EXIT_CRITICAL()時,只需簡單的從堆棧中彈出原來中斷的開關狀態即可。利用這種
機制,不論用戶在調用UCOS的函數之前中斷是開著的還是關著的,函數的進入和返回狀態都得到了保護。換句話說,如果調用前
中斷是關掉的,則調用后扔是關掉的。關中斷后調用UCOS的函數要特別小心,因為關中斷延長了應用程序的中斷延遲時間;
任務切換時間和中斷延遲時間是評估RTOS性能的兩個重要指標。任務切換時間可以反映出RTOS執行任務的速度,而中斷延遲時間
可以反映出RTOS對外界變化的反應速度。表3為這兩種操作系統任務切換時間和中斷延遲時間的比較 :任務切換時間/us 中斷延遲
時間/μs 測試環境 
μC/OS-II 29.7~34.2 78.8 Intel80186(33MHz) 
eCos 15.84 19.2 MPC860A3(33MHz) 
。*/
#define  OS_ENTER_CRITICAL()  asm {PUSHF; CLI}            /* Disable interrupts                        */
#define  OS_EXIT_CRITICAL()   asm  POPF                   /* Enable  interrupts                        */
#endif

#if      OS_CRITICAL_METHOD == 3                          /*一些編譯器提供了擴展功能,用戶可以得到當前處理器狀態字
的值,并保存在C函數的局部變量中這個變量可以用于恢復PSW*/
#define  OS_ENTER_CRITICAL()  (cpu_sr = OSCPUSaveSR())    /* Disable interrupts                        */
#define  OS_EXIT_CRITICAL()   (OSCPURestoreSR(cpu_sr))    /* Enable  interrupts                        */
#endif

/*
*********************************************************************************************************
*                           Intel 80x86 (Real-Mode, Large Model) Miscellaneous
*********************************************************************************************************
*/

#define  OS_STK_GROWTH        1                       /* Stack grows from HIGH to LOW memory on 80x86絕大多數微處理器和
微控制器的堆棧是從上往下遞減的,但是也有某些處理器使用的是相反的方式。UCOS被設計成2種情況都可以處理,只要在用被指常數
OS_STK_GROWTH指定堆棧的方向就可以了。OS_STK_GROWTH為0,表示堆棧從下(低地址)往上(高地址)遞增;置OS_STK_GROWTH為1,表示堆棧
從上(高地址)往下(低地址)遞減。之所以這樣處理,是出于2個原因:首先,OSInit()需要知道,當OS_TaskIdle()和OS_TaskStat()函數建立
任務時,堆棧的頂端地址在哪里;其次,在調用OSTaskStkChk()時,UCOS需要知道堆棧的底端地址在哪里,從而得到堆棧的使用情況。*/

#define  uCOS                 0x80                    /* Interrupt vector # used for context switch ;OS_TASK_SW()是一個宏
,是在UCOS從低優先級任務切換到高優先級任務時須用到的。OS_TASK_SW()總是在任務級代碼中調用。另一個函數OSIntExit()用在中斷服
務子程序ISR中。當中斷服務子程序使更高優先級任務進入就緒態時,OSIntExit()完成任務切換功能。任務切換只是簡單的將處理器的寄存
器保存到將被掛起的任務的堆棧中,并且從堆棧中恢復要運行的更高優先級的任務。
     在UCOS中,處于就緒態任務的堆棧結構看起來就像剛剛發生過中斷一樣,所有的寄存器都保存在堆棧中。換句話說,UCOS要運行處于
就緒態的任務必須要作的事就是,從任務堆棧中恢復處理器所有的寄存器,并且執行中斷返回指令。為了任務調度,可以通過執行
OS_TASK_SW()模仿中斷的產生。絕大多數處理器會提供軟中斷或指令陷阱(TRAP)來完成這項功能。中斷服務子程序或指令陷阱處理函數
也叫做異常處理函數的中斷向量地址必須指向匯編語言函數OSCtxSw()。用戶必須知道自己所使用的編譯器和處理器是如何實現讓中斷向量
指向OSCtxSw()的。80X86有256個軟中斷可供選用。中斷服務子程序ISR也稱為異常處理的入口地址必須指向匯編函數OSCtxSw()見
OS_CPU_A.ASM文件。這里需要確認0x80中斷向量指向OSCtxSw()。作者在PC機上做了測試,本章的代碼用到了向量號為128(0x80)的中斷,
因此此中斷是提供給用戶使用的。實際上,最初的PC將0x80~0xF0的中斷給BASIC解釋程序使用,后來機會在沒有內植BASIC解釋程序的PC機了
,所以用這些中斷向量是安全的。類似的,可用的中斷號還有0x4B~0x5B,0x5D~0x66以及0x68~0x6F。如果用的不是PC,而是其他嵌入式系統
,如80186處理器,則可能有更多的終端資源可供選用。*/

#define  OS_TASK_SW()         asm  INT   uCOS         

/*
*********************************************************************************************************
*                                            GLOBAL VARIABLES
*********************************************************************************************************
*/

OS_CPU_EXT  INT8U  OSTickDOSCtr;       /* Counter used to invoke DOS's tick handler every 'n' ticks 在這里聲明了一個8位
變量OSTickDOSCtr,用來保存時鐘節拍發生的次數。每發生11次,調用1次DOS的時鐘節拍函數,從而實現與DOS時鐘的同步。OSTickDOSCtr
在OS_CPU_A.ASM中使用,是專門為PC環境而定義的。如果在其他非PC的嵌入式系統中運行UCOS,就不必使用這種方法了,直接設定時鐘節拍
頻率就可以了。*/
                                       /*實時系統中時鐘節拍的頻率應該置為10~100HZ。通常但不是必須為了方便計
算,設為整數。不幸的是,在PC中,系統默認的時鐘節拍頻率是18.20648HZ,這對于計算和設置都不方便。本章中,將PC的時鐘節拍頻率從
18.20648HZ改為200HZ(間隔5ms)。這樣做的原因有3個:
1,200HZ近似18.206 48HZ的11倍,可以經過11次延時,在調用DOS中斷。在DOS中,時鐘節拍處理程序要求每隔54.93ms進行一次有關系統
維護的操作;
2,設定的間隔5ms對于時間延時和時間超時設置都很有用。若pc機處理器是80386,那么時鐘節拍最快也只能到200HZ;而如果是PentiumII
處理器,則很容易達到200HZ以上。
3,雖然將時鐘節拍頻率設定為20HZ或者100HZ也是可以的,但是這樣將難以產生18.206 48HZ的DOS中斷。這就是選擇整數倍頻,即選擇200hz
的原因。當然也可以選擇22倍頻,這樣就是400HZ間隔2.5ms。在一臺更快的PC上,使用這種時鐘節拍頻率甚至更高的頻率都不會有問題。
*/

/*
*********************************************************************************************************
*                                              PROTOTYPES
*********************************************************************************************************
*/

void       OSTaskStkInit_FPE_x86(OS_STK **pptos, OS_STK **ppbos, INT32U *psize); 
                                                 /*如前面所述,Borland編譯器提供了一個浮點仿真庫。但是該庫不具備可重入性。
           增加了一個函數,使用戶可以預處理任務的堆棧。這樣使BorlandC任務只有一個任務在使用浮點仿真庫,于是讓浮點仿真庫
           具備可重入性*/

#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
OS_CPU_SR  OSCPUSaveSR(void);
void       OSCPURestoreSR(OS_CPU_SR cpu_sr);
#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
青青草国产精品亚洲专区无| 色成年激情久久综合| 精品一区二区三区在线播放视频| 五月婷婷久久综合| 天堂av在线一区| 日韩精品国产精品| 蜜臀久久99精品久久久久宅男| 日本不卡中文字幕| 久久国产精品99久久人人澡| 国产精品丝袜一区| 一区二区三区中文字幕在线观看| 中文在线一区二区| 中文字幕一区二区三区在线播放| 欧美激情一区二区三区蜜桃视频| 亚洲国产成人自拍| 久久久亚洲高清| 国产人伦精品一区二区| 国产精品第13页| 亚洲一区二区三区国产| 一区二区三区国产精品| 日韩精品免费视频人成| 国产在线精品一区二区夜色| 国产激情一区二区三区桃花岛亚洲 | 26uuu亚洲| 亚洲国产成人在线| 一区二区三区四区不卡在线 | 日韩精品每日更新| 亚洲综合激情网| 青青草国产成人av片免费| 国内不卡的二区三区中文字幕| 成人深夜福利app| 91丨九色丨蝌蚪丨老版| 欧美日韩免费一区二区三区| 精品国产伦一区二区三区观看体验| 国产色产综合产在线视频| 亚洲欧美另类图片小说| 日韩激情在线观看| 国产成人精品免费一区二区| 色老汉一区二区三区| 欧美一级精品大片| 中文字幕亚洲区| 午夜精品久久久久久久久久| 国产成人夜色高潮福利影视| 欧美性受极品xxxx喷水| 精品国产一区二区精华| 1024亚洲合集| 九九久久精品视频| 91视频xxxx| 精品人伦一区二区色婷婷| 136国产福利精品导航| 久久国产精品99久久人人澡| 一本大道久久a久久精品综合| 精品人在线二区三区| 一区二区三区日韩欧美精品| 国内不卡的二区三区中文字幕| 色94色欧美sute亚洲线路一ni| 精品日韩欧美一区二区| 亚洲亚洲人成综合网络| 国产尤物一区二区在线| 欧美日韩精品一区二区三区四区 | 欧美在线看片a免费观看| 久久这里只精品最新地址| 一区二区三区欧美| 欧美日韩一区二区电影| 2020国产精品自拍| 亚洲国产精品一区二区久久恐怖片| 国产成人精品影视| 日韩一区二区三区av| 玉足女爽爽91| 成人一区二区三区视频| 欧美一区二区三区免费观看视频 | 天天影视色香欲综合网老头| 99久久精品国产一区二区三区| 欧美一区二区三区成人| 亚洲品质自拍视频| 成人午夜伦理影院| 久久亚洲欧美国产精品乐播| 蜜臀av一区二区| 欧美日韩日本视频| 亚洲综合激情网| av一区二区三区黑人| 久久精品亚洲精品国产欧美| 免费xxxx性欧美18vr| 欧美日本免费一区二区三区| 一区二区三区在线视频免费 | 中文字幕精品综合| 国内精品视频一区二区三区八戒| 日韩一级片网站| 日日夜夜精品视频免费| 欧美色视频一区| 一区二区三区蜜桃| 一道本成人在线| 亚洲精品一二三| 91在线码无精品| 亚洲天天做日日做天天谢日日欢 | 国产一区二区三区香蕉 | 综合中文字幕亚洲| 国产寡妇亲子伦一区二区| 精品国精品自拍自在线| 蜜臀av性久久久久蜜臀av麻豆| 欧美精三区欧美精三区| 亚洲h动漫在线| 欧美日韩国产精选| 偷拍自拍另类欧美| 欧美久久久久中文字幕| 午夜电影一区二区| 欧美日本国产视频| 亚洲大片免费看| 91精品国产欧美一区二区| 日本不卡123| 日韩欧美一区二区三区在线| 麻豆91在线观看| 久久蜜桃av一区精品变态类天堂| 国产综合色产在线精品| 国产午夜亚洲精品羞羞网站| 成人免费视频网站在线观看| 国产精品天干天干在线综合| 91在线播放网址| 五月天中文字幕一区二区| 在线日韩国产精品| 亚洲成人先锋电影| 欧美一级日韩一级| 国内精品国产成人国产三级粉色 | 亚洲国产精品一区二区久久恐怖片| 欧美精品久久久久久久多人混战| 视频一区视频二区中文字幕| 国产视频一区二区三区在线观看| 99久久综合99久久综合网站| 久99久精品视频免费观看| 成人欧美一区二区三区黑人麻豆| 国产精品久线在线观看| 日韩一区二区电影| 色综合激情久久| 3atv在线一区二区三区| 欧美日韩国产电影| 在线看日本不卡| 色婷婷激情一区二区三区| 91国产视频在线观看| 欧美激情一区不卡| 91麻豆视频网站| 日韩av午夜在线观看| 99re免费视频精品全部| 日日嗨av一区二区三区四区| 日韩精品一区二区三区中文精品| 久久精品72免费观看| 日本一区二区三区在线不卡| 欧美亚洲国产一区在线观看网站 | 午夜精品久久久久久久久| 精品国产免费人成电影在线观看四季 | 日韩国产欧美在线观看| 久久嫩草精品久久久久| 在线免费av一区| 激情另类小说区图片区视频区| 中文字幕日韩一区| 欧美一级专区免费大片| 99久久婷婷国产综合精品电影| 丝袜脚交一区二区| 国产精品三级av| 在线电影院国产精品| 99久久夜色精品国产网站| 免费av成人在线| 亚洲欧美综合在线精品| 精品噜噜噜噜久久久久久久久试看| 99久久精品国产精品久久| 美女一区二区久久| 丁香激情综合五月| 亚洲成人一二三| 1000精品久久久久久久久| 日韩免费一区二区| 久久―日本道色综合久久| 91福利国产精品| 国产成人av一区二区| 亚洲成年人网站在线观看| 国产精品久久久久三级| 精品日韩欧美在线| 欧美日韩在线直播| caoporen国产精品视频| 久久99国产精品尤物| 亚洲高清中文字幕| 亚洲色图在线看| 日本一区二区高清| 精品乱人伦一区二区三区| 欧美精三区欧美精三区| 色老汉一区二区三区| 成人av在线影院| 国产在线精品视频| 久久精品国产久精国产| 日韩电影免费一区| 亚洲成av人片一区二区| 一区二区三区日韩欧美| 最近中文字幕一区二区三区| 国产欧美久久久精品影院| 久久午夜色播影院免费高清| 欧美一区二区三区视频在线观看 | 精品久久久久久久久久久久包黑料 | 久久精品国产在热久久| 日韩影视精彩在线| 亚洲电影视频在线| 亚洲午夜电影在线观看| 亚洲一区二区三区四区中文字幕 |