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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 6488|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

ucos堆棧和任務(wù)控制塊初始化

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:82781 發(fā)表于 2015-6-13 16:44 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
當(dāng)操作系統(tǒng)要建立一個(gè)進(jìn)程時(shí)操作系統(tǒng)首先要對(duì)棧空間和進(jìn)程控制塊進(jìn)行初始化,這里的棧是為任務(wù)在內(nèi)存里開辟的一塊的模擬的堆棧區(qū)域,主要用來保存CPU的所有寄存器和任務(wù)的入口首地址,在任務(wù)切換時(shí),保存CPU寄存器和程序入口,注意這里由于這是人造的堆棧所以你必須提供入口,這個(gè)入口就是取得函數(shù)的入口地址,這是棧,那么進(jìn)程控制塊主要是保存一些與任務(wù)密切相關(guān)的數(shù)據(jù),比如本任務(wù)的堆棧在哪里,本任務(wù)的狀態(tài),本任務(wù)在就緒表中的坐標(biāo)等參數(shù),加速任務(wù)切換等,
那么堆棧是怎樣初始化的呢或者說初始化之后的結(jié)果是多少呢?結(jié)構(gòu)是什么樣的?
其實(shí)堆棧就是一個(gè)數(shù)組,這個(gè)數(shù)組創(chuàng)建的時(shí)候內(nèi)部數(shù)據(jù)全部清0,那么運(yùn)行對(duì)戰(zhàn)初始化后堆棧變成了什么樣子?就那空閑任務(wù)來做例子吧
空閑任務(wù)他什么也不做,只是傻傻對(duì)一個(gè)32位的變量進(jìn)行++,操作,他的優(yōu)先級(jí)最低,也就是任何一個(gè)任務(wù)就緒了就可以搶占他,他只是在
操作系統(tǒng)沒有就緒的任務(wù)時(shí)運(yùn)行,但他確實(shí)是一個(gè)任務(wù),因此他擁有所有任務(wù)的特性。又因?yàn)樗?jiǎn)單所以比較好分析。
首先創(chuàng)建一個(gè)堆棧:
static  OS_STK DT_XDATA OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE];
這就是創(chuàng)建的那個(gè)空閑任務(wù)的堆棧,創(chuàng)建空閑任務(wù)時(shí)調(diào)用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是一個(gè)指向堆棧首地址的指針,用它修改堆棧的值,最后執(zhí)行完堆棧的值如下
OSTaskIdleStk【0】=0
OSTaskIdleStk【1】=15
OSTaskIdleStk【2】=任務(wù)入口函數(shù)地址高八位
OSTaskIdleStk【3】=任務(wù)入口函數(shù)地址低八位
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
表示每個(gè)字節(jié)代表的存入的寄存器名字,他的堆棧是由下向上生長(zhǎng)的!
然后函數(shù)返回一個(gè)堆棧的首地址,至此堆棧的初始化就完成了
接下來是任務(wù)控制塊(TCB)
任務(wù)控制塊到底在哪里呢?在這里看下面的定義
static  OS_TCB DT_XDATA OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS];
這就是書上所謂的TCB池,書總是愛故弄玄虛,你媽逼的不就是個(gè)數(shù)組嗎?瞎比比什么!記住所有的一切的操作的核心就是對(duì)這個(gè)數(shù)組的操作
他就是TCB,而且作者把他開辟為一塊靜態(tài)的內(nèi)存區(qū),不被擾動(dòng)的,因?yàn)樗苤匾?/font>
什么是空TCB呢?他在程序中的樣子是這樣的
OS_EXT  OS_TCB DT_XDATA * DT_XDATA OSTCBFreeList;
不難看出,他就是個(gè)結(jié)構(gòu)指針,但是一個(gè)指針怎么和空表聯(lián)系起來?原來他里面的值存著尚未用的OSTCBTbl【】,也就是說,當(dāng)有任務(wù)要求占一個(gè)TCB時(shí),首先要通過這個(gè)空表指針得到,還要看看這個(gè)表示不是用完了,獲得了這個(gè)空閑的表的地址后,還要更新OSTCBFreeList,讓他指向下一個(gè)沒有使用的空的TCB表,這也就是他的作用了
還有一個(gè)優(yōu)先級(jí)和TCB對(duì)應(yīng)的指針數(shù)組,為什么要做這個(gè)數(shù)組呢?這個(gè)數(shù)組存著什么?先看定義
OS_EXT  OS_TCB DT_XDATA * DT_XDATA OSTCBPrioTbl[OS_LOWEST_PRIO + 1];
這就是那個(gè)指針數(shù)組,為什么要這個(gè)數(shù)組現(xiàn)在我還不知道,但是有一點(diǎn)可以看出來,他可以快速的通過任務(wù)對(duì)應(yīng)香型的TCB,也就是說
知道了任務(wù)的優(yōu)先級(jí)我就知道這任務(wù)的TCB在哪里,和目錄一樣,它里面存的全部是任務(wù)的TCB首地址,
還有一個(gè)指針這個(gè)指針叫做
OS_EXT  OS_TCB DT_XDATA * DT_XDATA OSTCBList;
他是做什么的呢?他用來存一個(gè)地址,這個(gè)地址如果是第一次分配這個(gè)TCB表,那么他的值是0,第二次就是第一次的地址,依次向下,他的值
給了鏈表指針里的下一個(gè)表的指針,可見它是用來更新鏈表的!我感覺他只是個(gè)中間量而已,角色并不是很重要。
哈哈,定義不高明白,是看不進(jìn)去的,因?yàn)樗鲜翘鴣硖,而且有?shù)組,有指針,還有指針數(shù)組,
搞明白定義家簡(jiǎn)單了,初始化大致分為如下幾部:
取得空表,
占用空表
空表指針下移
TCB初始化,
優(yōu)先級(jí)和TCB目錄寫入
加載鏈表的下個(gè)和上個(gè)TCB塊
結(jié)束
主要還是對(duì)這四個(gè)的定義的理解,其他的都是小事,水到渠則成!







分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品一区二区三区在线观看 | 成人18亚洲xxoo| 国产一区二区在线视频 | 亚洲综合在线一区二区 | 99久久精品免费看国产小宝寻花 | 97色在线观看免费视频 | 成年人国产在线观看 | 综合在线视频 | 狠狠干天天干 | 91精品久久久 | 久久亚洲一区二区 | 日日噜噜噜夜夜爽爽狠狠视频, | 国产精品久久久久久久久久久久久 | 欧美三级三级三级爽爽爽 | 亚洲综合天堂网 | 在线观看中文字幕av | 欧美日韩亚洲国产综合 | 国产精品成人久久久久 | 成人在线不卡 | 在线成人 | 成人免费毛片片v | 国产成人综合一区二区三区 | 欧美日韩中文字幕 | 91精品国产综合久久久动漫日韩 | 成人午夜激情 | 亚洲精品欧美 | 午夜精品久久久 | 91精品国产综合久久久亚洲 | 日批日韩在线观看 | 中国一级特黄真人毛片 | 国产日产精品一区二区三区四区 | 天堂久久一区 | 精品一级电影 | 96国产精品久久久久aⅴ四区 | 青青久草 | 久久蜜桃精品 | 青青久在线视频 | 在线观看亚洲专区 | 99久久婷婷| 日韩精品一区二 | 亚洲国产免费 |