久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: ucos堆棧和任務控制塊初始化 [打印本頁]

作者: xuwei    時間: 2015-6-13 16:44
標題: ucos堆棧和任務控制塊初始化
當操作系統要建立一個進程時操作系統首先要對棧空間和進程控制塊進行初始化,這里的棧是為任務在內存里開辟的一塊的模擬的堆棧區域,主要用來保存CPU的所有寄存器和任務的入口首地址,在任務切換時,保存CPU寄存器和程序入口,注意這里由于這是人造的堆棧所以你必須提供入口,這個入口就是取得函數的入口地址,這是棧,那么進程控制塊主要是保存一些與任務密切相關的數據,比如本任務的堆棧在哪里,本任務的狀態,本任務在就緒表中的坐標等參數,加速任務切換等,
那么堆棧是怎樣初始化的呢或者說初始化之后的結果是多少呢?結構是什么樣的?
其實堆棧就是一個數組,這個數組創建的時候內部數據全部清0,那么運行對戰初始化后堆棧變成了什么樣子?就那空閑任務來做例子吧
空閑任務他什么也不做,只是傻傻對一個32位的變量進行++,操作,他的優先級最低,也就是任何一個任務就緒了就可以搶占他,他只是在
操作系統沒有就緒的任務時運行,但他確實是一個任務,因此他擁有所有任務的特性。又因為他簡單所以比較好分析。
首先創建一個堆棧:
static  OS_STK DT_XDATA OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE];
這就是創建的那個空閑任務的堆棧,創建空閑任務時調用OSTaskStkInit來初始化這堆棧代碼如下:
OS_STK DT_XDATA *stk;
    ppdata = ppdata;      
    opt    = opt;                              


     stk    = (OS_STK DT_XDATA *)ptos;         
    *stk++ = (0xFF + 1);                 
     *stk++ = 2 + 13;      
    *stk++ = (INT16U)task & 0xFF;         

    *stk++ = (INT16U)task >> 8;               
    *stk++ = 0x0A;                              
    *stk++ = 0x0B;                             
    *stk++ = 0xD1;                             
    *stk++ = 0xD0;                             
    *stk++ = 0x00;                              
    *stk++ = 0x00;                              
    *stk++ = 0x01;                           
    *stk++ = 0x02;                           
    *stk++ = 0x03;                              
    *stk++ = 0x04;                              
    *stk++ = 0x05;                              
    *stk++ = 0x06;                             
    *stk++ = 0x07;                             
                                                
    return ((void DT_XDATA *)ptos);   


STK是一個指向堆棧首地址的指針,用它修改堆棧的值,最后執行完堆棧的值如下
OSTaskIdleStk【0】=0
OSTaskIdleStk【1】=15
OSTaskIdleStk【2】=任務入口函數地址高八位
OSTaskIdleStk【3】=任務入口函數地址低八位
OSTaskIdleStk【4】=ACC=10
OSTaskIdleStk【5】=B=11
OSTaskIdleStk【6】=DPH=0XD1
OSTaskIdleStk【7】=DPL=0XD0
OSTaskIdleStk【8】=PSW=0
OSTaskIdleStk【9】=R0=0
OSTaskIdleStk【10】=R1=1
OSTaskIdleStk【11】=R2=2
OSTaskIdleStk【12】=R3=3
OSTaskIdleStk【13】=R4=4
OSTaskIdleStk【14】=R5=5
OSTaskIdleStk【15】=R6=6
OSTaskIdleStk【16】=R7=7
表示每個字節代表的存入的寄存器名字,他的堆棧是由下向上生長的!
然后函數返回一個堆棧的首地址,至此堆棧的初始化就完成了
接下來是任務控制塊(TCB)
任務控制塊到底在哪里呢?在這里看下面的定義
static  OS_TCB DT_XDATA OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS];
這就是書上所謂的TCB池,書總是愛故弄玄虛,你媽逼的不就是個數組嗎?瞎比比什么!記住所有的一切的操作的核心就是對這個數組的操作
他就是TCB,而且作者把他開辟為一塊靜態的內存區,不被擾動的,因為他很重要,
什么是空TCB呢?他在程序中的樣子是這樣的
OS_EXT  OS_TCB DT_XDATA * DT_XDATA OSTCBFreeList;
不難看出,他就是個結構指針,但是一個指針怎么和空表聯系起來?原來他里面的值存著尚未用的OSTCBTbl【】,也就是說,當有任務要求占一個TCB時,首先要通過這個空表指針得到,還要看看這個表示不是用完了,獲得了這個空閑的表的地址后,還要更新OSTCBFreeList,讓他指向下一個沒有使用的空的TCB表,這也就是他的作用了
還有一個優先級和TCB對應的指針數組,為什么要做這個數組呢?這個數組存著什么?先看定義
OS_EXT  OS_TCB DT_XDATA * DT_XDATA OSTCBPrioTbl[OS_LOWEST_PRIO + 1];
這就是那個指針數組,為什么要這個數組現在我還不知道,但是有一點可以看出來,他可以快速的通過任務對應香型的TCB,也就是說
知道了任務的優先級我就知道這任務的TCB在哪里,和目錄一樣,它里面存的全部是任務的TCB首地址,
還有一個指針這個指針叫做
OS_EXT  OS_TCB DT_XDATA * DT_XDATA OSTCBList;
他是做什么的呢?他用來存一個地址,這個地址如果是第一次分配這個TCB表,那么他的值是0,第二次就是第一次的地址,依次向下,他的值
給了鏈表指針里的下一個表的指針,可見它是用來更新鏈表的!我感覺他只是個中間量而已,角色并不是很重要。
哈哈,定義不高明白,是看不進去的,因為他老是跳來跳去,而且有數組,有指針,還有指針數組,
搞明白定義家簡單了,初始化大致分為如下幾部:
取得空表,
占用空表
空表指針下移
TCB初始化,
優先級和TCB目錄寫入
加載鏈表的下個和上個TCB塊
結束
主要還是對這四個的定義的理解,其他的都是小事,水到渠則成!












歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 欧美日韩第一页 | 日本午夜一区二区三区 | 成人精品一区亚洲午夜久久久 | 视频在线亚洲 | 一级片视频免费观看 | 精品乱码一区二区三四区 | 日韩欧美在线观看视频 | 正在播放一区二区 | 国产高清在线观看 | 成人美女免费网站视频 | 日韩视频在线免费观看 | 成在线人视频免费视频 | 天堂资源 | 久久久久久成人 | 蜜臀久久99精品久久久久野外 | 国产高清性xxxxxxxx | 国产欧美一区二区三区久久手机版 | 国产一区三区在线 | 精品二区 | 久久狠狠| a免费视频| 国产一级电影网 | 91影视| 国产视频福利一区 | 伦理一区二区 | 中文字幕亚洲区一区二 | 你懂的在线视频播放 | 欧美极品在线播放 | 久久免费高清视频 | 国产免费福利小视频 | hitomi一区二区三区精品 | 日本不卡一区二区三区在线观看 | 久久久久久成人 | 中文字幕日韩欧美 | www狠狠干| 日本人和亚洲人zjzjhd | 精品美女在线观看 | 九九热精 | 久久专区 | 欧美日韩久久久久 | 国产精品永久免费 |