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

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

?? os_cpu_c.c

?? ucos注解版 內容大都是從邵貝貝和網上摘取的 有參考價值
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
*********************************************************************************************************
*                                               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_C.C
* By           : Jean J. Labrosse
*********************************************************************************************************
*/

#define  OS_CPU_GLOBALS
#include "includes.h"

/*
*********************************************************************************************************
*                                       OS INITIALIZATION HOOK
*                                            (BEGINNING)
*
* Description: This function is called by OSInit() at the beginning of OSInit().進入OSInit()函數后,OSInitHookBegin()就會
立即被調用。添加這個函數的原因在于,想把與OS有關的初始化代碼也放在OSInit()函數中。這個函數使得用戶可以將自己特定的代碼也
放在OSInit()函數中。這樣代碼會簡潔明了。
*
* Arguments  : none
*
* Note(s)    : 1) Interrupts should be disabled during this call.
*********************************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203
void  OSInitHookBegin (void)
{
}
#endif

/*
*********************************************************************************************************
*                                       OS INITIALIZATION HOOK
*                                               (END)
*
* Description: This function is called by OSInit() at the end of OSInit().OSInitHookEnd()與OSInitHookBegin()函數相似,只是
它在OSInit()函數返回之前被調用。添加這個函數的原因與添加OSInitHookBegin()的原因是相同的??梢栽诘?5章看到OSInitHookEnd()的
例子。
*
* Arguments  : none
*
* Note(s)    : 1) Interrupts should be disabled during this call.
*********************************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203
void  OSInitHookEnd (void)
{
}
#endif

/*$PAGE*/
/*
*********************************************************************************************************
*                                          TASK CREATION HOOK
*
* Description: This function is called when a task is created.每當添加任務時,OS_TCBInit()函數都會調用OSTaskCreateHook()函
數。該函數允許擴展UCOS的功能。當UCOS設置完任務控制塊(OS_TCB)初始化的絕大部分工作后,但在任務控制塊被鏈接到相應的任務鏈中之
前, 以及在該任務就緒運行之前,UCOS會調用OSTaskCreateHook()。該函數被調用時中斷是開著的。
當OSTaskCreateHook()被調用時,它會收到指向剛剛建立任務的任務控制塊的指針。這樣,OSTaskCreateHook()就可訪問任務控制塊結構所
有的成員了。當用OSTaskCreate()建立任務時,OSTaskCreateHook()的功能是有限的;但當使用OSTaskCreateExt()建立任務時,會得到
OS_TCB中的擴展指針(OSTCBExtPtr)。該指針可用來訪問任務的附加數據,如浮點寄存器,MMU寄存器,任務計數器以及調試信息。可以檢查
OS_TCBInit(),看都做了哪些工作。
*
* Arguments  : ptcb   is a pointer to the task control block of the task being created.
*
* Note(s)    : 1) Interrupts are disabled during this call.
*********************************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0                /*只有當OS_CFG.H中的OS_CPU_HOOKS_EN置一時,才會生成OS_CPU_C.C文件中的相應OS???Hook()
函數。這些在本節和以下各節描述的HOOK函數的代碼中,OS???Hook()函數是始終需要的,'#define constant OS_CPU_HOOKS_EN'并不意味著
OS???Hook()是否被調用。OS_CPU_HOOKS_EN只是表明OS???Hook()函數是在OS_CPU_C.C文件中(OS_CPU_HOOKS_EN==1),還是在其他文件中
(OS_CPU_HOOKS_EN==0)。這個特點使得用戶可以在自己的移植實例中,在OS_CPU_C.C文件之外定義自己的HOOK函數。顯然,使用該移植范例
其他源文件的用戶,應將OS_CPU_HOOKS_EN設置為0,以防止鏈接時出現重復定義錯誤。如果不需要使用HOOK函數這種機制來擴展UCOS的功能
,可以將這些HOOK函數寫成空函數。需要再次強調的是,UCOS需要這些HOOK函數(這些函數必須在某處定義)。*/
void  OSTaskCreateHook (OS_TCB *ptcb)
{
    ptcb = ptcb;                       /* Prevent compiler warning                                     */
}
#endif


/*
*********************************************************************************************************
*                                           TASK DELETION HOOK
在任務從就緒態列表或等待列表(若任務在等待某事件發生)中被刪除后,OSTaskDel()就會調用OSTaskDelHook()。該函數在將任務從UCOS
的內部有效任務鏈表中刪除之前被調用。當調用OSTaskDelHook()時,它會收到一個指向正在被刪除任務的任務控制塊的指針,這樣它就可
以訪問該任務控制塊所有的結構成員了。OSTaskDelHook()可以用來檢驗TCB擴展部分是否已建立了(一個非空的指針),并進行一些清0等操
作。OSTaskDelHook()被調用時,中斷是關掉的,所以該函數的代碼太長會影響中斷響應時間。
*
* Description: This function is called when a task is deleted.
*
* Arguments  : ptcb   is a pointer to the task control block of the task being deleted.
*
* Note(s)    : 1) Interrupts are disabled during this call.
*********************************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0 
void  OSTaskDelHook (OS_TCB *ptcb)
{
    ptcb = ptcb;                       /* Prevent compiler warning                                     */
}
#endif

/*
*********************************************************************************************************
*                                             IDLE TASK HOOK
*
* Description: This function is called by the idle task.  This hook has been added to allow you to do  
*              such things as STOP the CPU to conserve power.很多處理器都允許執行相應的指令,將CPU置于低功耗模式。而當接受
到中斷信號時,CPU就會退出低功耗模式。OSTaskIdle()函數可調用OSTaskIdleHook()函數,實現CPU的這種低功耗模式。詳見邵貝貝UCOSII
*P300
* Arguments  : none
*
* Note(s)    : 1) Interrupts are enabled during this call.
*********************************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0 && OS_VERSION >= 251
void  OSTaskIdleHook (void)
{
}
#endif

/*
*********************************************************************************************************
*                                           STATISTIC TASK HOOK
*
* Description: This function is called every second by uC/OS-II's statistics task.  This allows your 
*              application to add functionality to the statistics task.OSTaskStatHook函數每秒都會被統計任務OSTaskStat()調用
一次??梢杂肙STaskStatHook()擴展統計任務的功能。例如,可以跟蹤并顯示每個任務的執行時間,每個任務所用的CPU份額以及每個任務
執行的頻率等等。
*
* Arguments  : none
*********************************************************************************************************
*/

#if OS_CPU_HOOKS_EN > 0 
void  OSTaskStatHook (void)
{
}
#endif

/*$PAGE*/
/*
*********************************************************************************************************
*                                        INITIALIZE A TASK'S STACK 
UCOS的移植范例要求用戶編寫10個簡單的C函數。唯一必要的是OSTaskStkInit(),其他9個函數必須聲明,但并不一定要包含任何代碼。
在本移植中就是這么作的。用#define語句定義的常數OS_CPU_HOOKS_EN(見OS_CFG.H)應該置為1.該函數由OSTaskCreate()或
OSTaskCreateExt()調用,用來初始化任務堆棧。將堆棧的結構初始化成看起來好像剛剛發生過中斷一樣,處理器的所有寄存器被推入堆棧。
當調用OSTaskCreate()或OSTaskCreateExt()建立一個新任務時,須傳遞的參數是:任務代碼的起始地址(task),參數指針(pdata),任務堆棧
頂端的地址(ptos)以及任務的優先級(prio).OSTaskCreateExt()還需要一些其他參數,但與OSTaskStkInit()沒有關系。為了合理地初始化
堆棧結構,OSTaskStkInit()只需要以上提到的前三個參數(task,pdata,ptos)。關于opt是調用OSTaskStkInit()函數時須要傳遞過去的參數
。因為只有OSTaskCreate()函數不支持附加的opt選項,因此,當OSTaskCreate()調用OSTaskStkInit()時,將opt設置為0x0000.
*
* Description: This function is called by either OSTaskCreate() or OSTaskCreateExt() to initialize the
*              stack frame of the task being created.  This function is highly processor specific.
*
* Arguments  : task          is a pointer to the task code
*
*              pdata         is a pointer to a user supplied data area that will be passed to the task
*                            when the task first executes.
*
*              ptos          is a pointer to the top of stack.  It is assumed that 'ptos' points to
*                            a 'free' entry on the task stack.  If OS_STK_GROWTH is set to 1 then 
*                            'ptos' will contain the HIGHEST valid address of the stack.  Similarly, if
*                            OS_STK_GROWTH is set to 0, the 'ptos' will contains the LOWEST valid address
*                            of the stack.
*
*              opt           specifies options that can be used to alter the behavior of OSTaskStkInit().
*                            (see uCOS_II.H for OS_TASK_OPT_???).
*
* Returns    : Always returns the location of the new top-of-stack' once the processor registers have
*              been placed on the stack in the proper order.
*
* Note(s)    : Interrupts are enabled when your task starts executing. You can change this by setting the
*              PSW to 0x0002 instead.  In this case, interrupts would be disabled upon task startup.  The
*              application code would be responsible for enabling interrupts at the beginning of the task
*              code.  You will need to modify OSTaskIdle() and OSTaskStat() so that they enable 
*              interrupts.  Failure to do this will make your system crash!
*********************************************************************************************************
*/

OS_STK  *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
{
    INT16U *stk;


    opt    = opt;                           /* 'opt' is not used, prevent warning                      */
    stk    = (INT16U *)ptos;                /* Load stack pointer由于80x86堆棧是16位寬的(以字為單位),OSTaskStkInit()將建
    立并初始化一個局部指針變量。該指針變量指向以字為單位的內存區,同時UCOS要求指針ptos指向空堆棧的入口。*/
    *stk-- = (INT16U)FP_SEG(pdata);         /* Simulate call to function with argument;BorlandC編譯器用堆棧而不是寄存器來
    傳遞參數pdata,此時從參數pdata得到的段地址和偏移量都將按次序保存在堆棧中。
                                             函數名: FP_SEG 
                                             功 能: 獲取遠地址段值 
                                             用 法: unsigned FP_SEG(void far *farptr); 
                                             函數名: FP_OFF 
                                             功 能: 獲取遠地址偏移量 
                                             用 法: unsigned FP_OFF(void far *farptr); 

*/
    *stk-- = (INT16U)FP_OFF(pdata);         
    *stk-- = (INT16U)FP_SEG(task);          /*堆棧中緊接著是任務函數的起始地址。理論上,此處應該為任務的返回地址;但在UCOS
    中,任務函數必須為無限循環結構,不能有返回點,所以這里保存的內容實際上無關緊要。*/
    *stk-- = (INT16U)FP_OFF(task);
    *stk-- = (INT16U)0x0202;                /* SW = Interrupts enabled返回地址下面是狀態字SW,設置狀態字也是為了模擬中斷發
    生或的堆棧結構。堆棧中的SW初始化為0x0202,這將使任務啟動后中斷是開著的;如果設為0x0002,則任務啟動后將關中斷。UCOS不能
    設置成一些任務啟動后中斷是開著的,而另一些任務啟動后中斷是關掉的。也就是說,要么所有的任務啟動時中斷都是開著的,要么都
    是關掉的。如果確實要突破上述限制,則可以在用OSTaskCreateExt()函數建立任務時,通過參數pdata或者opt向任務傳遞啟動時想要
    的中斷狀態。然而,目前沒有這么作。如果選擇任務啟動后中斷是關掉的,那么每個任務運行時都需要重新開中斷。在這種情況下,還
    要修改OSTaskIdle()和OSTaskStat()函數,運行時開中斷。如果以上任何一個環節出了問題,系統就會崩潰,所以推薦設置SW為0x0202
    ,在任務啟動時開中斷。*/
    *stk-- = (INT16U)FP_SEG(task);          /* Put pointer to task   on top of stack                   */
    *stk-- = (INT16U)FP_OFF(task);
    *stk-- = (INT16U)0xAAAA;                /* AX = 0xAAAA堆棧中還須留出各個寄存器的空間。注意寄存器在堆棧中的位置要和運行
    指令PUSHA,PUSH ES以及PUSH DS后壓入堆棧的次序相同。AX,BX,CX,DX,SP,BP,SI,DI的次序是與指令PUSHA的壓棧次序相同的。
    PUSHA和POPA能用一系列的push和pop指令來代替   
  在8086cpu下   
  pusha等價于   
  push   ax   
  push   bx   

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲综合在线电影| 日韩欧美国产一二三区| 国产精品欧美经典| 成人性生交大合| 久久精品一区二区三区不卡| 国产精品69毛片高清亚洲| 精品欧美久久久| 国产69精品久久久久777| 国产精品乱码一区二区三区软件 | 亚洲欧美日韩一区| 日韩制服丝袜先锋影音| 欧美一级高清大全免费观看| 蜜臀av性久久久久蜜臀aⅴ四虎| 日韩区在线观看| 激情久久五月天| 中文字幕一区二区日韩精品绯色| 91影视在线播放| 婷婷亚洲久悠悠色悠在线播放| 91精品国产综合久久精品app | 美女国产一区二区三区| 久久精品人人做人人爽人人| 91美女在线观看| 日韩黄色一级片| 国产精品久久影院| 欧美高清一级片在线| 国产精品综合av一区二区国产馆| 亚洲色图清纯唯美| 日韩欧美国产精品一区| 不卡一区二区三区四区| 日韩av不卡一区二区| 中文字幕日韩av资源站| 欧美日韩精品久久久| 国产成人午夜高潮毛片| 五月综合激情婷婷六月色窝| 久久精品一二三| 在线播放欧美女士性生活| 成人免费观看视频| 日本午夜精品视频在线观看| 亚洲欧洲无码一区二区三区| 日韩欧美www| 欧美午夜电影网| 东方欧美亚洲色图在线| 三级久久三级久久| 日韩码欧中文字| 2021国产精品久久精品| 欧美美女视频在线观看| 成人av在线影院| 免费久久精品视频| 亚洲一区二区三区小说| 欧美激情一区二区三区蜜桃视频| 3d动漫精品啪啪一区二区竹菊| 99精品欧美一区二区三区小说| 久草这里只有精品视频| 亚洲超碰97人人做人人爱| 国产精品国产三级国产普通话99| 久久精品网站免费观看| 精品国产网站在线观看| 91丨九色丨蝌蚪丨老版| 成人黄色电影在线| 狠狠色丁香婷综合久久| 美女视频免费一区| 日韩在线卡一卡二| 亚洲欧美日韩中文播放| 日本一区二区视频在线| 久久久久久久久久久久久久久99| 538prom精品视频线放| 欧美日韩一级大片网址| 色综合中文字幕| 99久久国产免费看| 成人免费毛片a| 国产乱一区二区| 久久99久久久欧美国产| 美女尤物国产一区| 免费看日韩a级影片| 秋霞午夜鲁丝一区二区老狼| 亚洲www啪成人一区二区麻豆| 亚洲美女区一区| 亚洲自拍偷拍九九九| 亚洲福利一区二区三区| 亚洲国产aⅴ天堂久久| 亚洲国产精品久久艾草纯爱| 亚洲影视在线观看| 偷拍亚洲欧洲综合| 日韩二区三区在线观看| 秋霞午夜av一区二区三区| 免费在线一区观看| 麻豆国产91在线播放| 久国产精品韩国三级视频| 国产精品一区免费在线观看| 高清国产一区二区| 97久久久精品综合88久久| 色综合天天综合网国产成人综合天 | 中文字幕精品一区 | 亚洲女同ⅹxx女同tv| 亚洲男女毛片无遮挡| 午夜一区二区三区在线观看| 日韩精品国产精品| 狠狠色伊人亚洲综合成人| 国产精品一区一区三区| 99久久综合精品| 欧美老人xxxx18| 成人黄动漫网站免费app| 欧美日韩二区三区| 久久老女人爱爱| 久久久亚洲国产美女国产盗摄| 日韩一区二区三区av| 欧美一二三在线| 欧美日韩夫妻久久| 91麻豆精品国产91久久久久久 | 国产精品一区二区你懂的| 国产精品伦理一区二区| 国产欧美日韩在线看| 成人午夜av电影| 久久精品国产秦先生| 国产麻豆一精品一av一免费| 99精品视频一区二区| 欧美日本国产视频| 欧美精品一区二区三区蜜臀| 亚洲欧美一区二区三区极速播放| 亚洲成人一区二区在线观看| 国产毛片一区二区| 欧美日韩电影一区| 国产精品电影院| 日韩高清一区二区| 91美女在线观看| 精品盗摄一区二区三区| 亚洲精品成人在线| 国产成人午夜视频| 欧美裸体bbwbbwbbw| 国产欧美精品日韩区二区麻豆天美| 亚洲国产精品视频| 成人激情av网| 精品免费一区二区三区| 亚洲一区电影777| 成人av电影免费观看| 日韩精品一区二区三区中文精品| 亚洲天堂成人在线观看| 国产精品一级片| 欧美一区二区成人6969| 一区二区三区精品| 成人精品视频一区| 精品国产免费视频| 午夜伦欧美伦电影理论片| 91在线精品一区二区| 国产日韩欧美一区二区三区乱码| 天堂久久一区二区三区| 在线免费观看日韩欧美| 中文天堂在线一区| 国产一区激情在线| 精品福利一区二区三区| 日韩国产一区二| 欧美性做爰猛烈叫床潮| 亚洲精品中文在线影院| 成人黄色小视频在线观看| 久久久一区二区三区捆绑**| 毛片基地黄久久久久久天堂| 欧美日韩国产精品自在自线| 亚洲午夜久久久久久久久久久 | 亚洲午夜羞羞片| 欧洲精品一区二区三区在线观看| 国产精品久久久久久福利一牛影视 | 成人av电影在线网| 日韩视频免费观看高清完整版在线观看 | 国产精品久久一卡二卡| 精品国产乱码久久久久久夜甘婷婷| 亚洲一区二区三区视频在线| 99国内精品久久| 国产精品久久久久久久久快鸭| 美日韩黄色大片| 亚洲乱码国产乱码精品精可以看| 国产精品一区二区免费不卡 | 波多野结衣中文字幕一区二区三区| 久久精品亚洲一区二区三区浴池| 国产一区二区视频在线| 精品国产不卡一区二区三区| 国模少妇一区二区三区| 久久人人97超碰com| 国产成人在线影院| 国产精品每日更新| 色综合久久久网| 亚洲一区电影777| 欧美疯狂做受xxxx富婆| 美女视频黄频大全不卡视频在线播放| 日韩欧美专区在线| 国产精品综合一区二区三区| 中文字幕成人网| 91欧美一区二区| 午夜激情一区二区| 日韩一区二区影院| 国产黄色91视频| 一区二区成人在线观看| 91麻豆精品国产91久久久资源速度 | 一区二区三区电影在线播| 777午夜精品免费视频| 蜜臀av在线播放一区二区三区| 国产日韩欧美电影| 一本到不卡免费一区二区| 天堂va蜜桃一区二区三区| 精品国产123| 色婷婷精品久久二区二区蜜臂av |