當前位置:首頁 » 編程語言 » c語言中tcb
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言中tcb

發布時間: 2022-08-20 00:59:14

㈠ 這是老司機來解答

對土壤要求不嚴,沙土、

等~你《 8 8 Еeγ 、 c o m~》

粘土和微酸性土壤均能

生長,但以土層深厚、肥沃疏鬆

的土壤最為適宜。象草再生能力強,生長迅速,

故對肥料要求較高,需施用大量有機肥和氮肥。象草在水分、溫度適宜的條件下,一般種植後7--10天即可出苗,15--20天開始分櫱。肥地分櫱多,瘠薄地分櫱少;雨季分櫱多,旱季分櫱少。所以只有水肥充足,才能獲得高產。

㈡ linux 線程式控制制塊tcb中包含了哪些內容

進程式控制制塊(Process Control Block,PCB),是操作系統內核中一種數據結構,主要表示進程狀態,它是對系統的進程進行管理的重要依據,和進程管理相關的操作無一不用到PCB中的內容。雖各實際情況不盡相同,PCB通常記載進程之相關信息。

㈢ [Linux]編寫一個簡單的c語言程序,編寫Makefile文件。

八 環境變數
8.1 查看環境變數
$ env  顯示所有的環境變數設置
$ echo $ENV_VARIABLE  顯示指定環境變數的設置
例:
$ echo $PATH
/bin:/etc:/usr/bin:/tcb/bin

8.2 設定環境變數
$ ENV_VARIABLE=XXX;export ENV_VARIABLE
例:
$ PATH=$PATH:$INFORMIXDIR/bin;export PATH  將環境變數PATH設定為原PATH值+$INFORMIXDIR/bin

8.3 取消環境變數設置
$ unset $ENV_VARIABLE
例:
$ set GZJ=gzj;export GZJ  設置環境變數GZJ
$ echo $GZJ
gzj  顯示環境變數值
$ unset $GZJ  取消環境變數GZJ的設置
$ echo $GZJ
 已取消

一 makefile規則
makefile是一個make的規則描述腳本文件,包括四種類型行:目標行、命令行、宏定義行和make偽指令行(如「include」)。makefile文件中注釋以「#」開頭。當一行寫不下時,可以用續行符「\」轉入下一行。
1.1 目標行
目標行告訴make建立什麼。它由一個目標名表後面跟冒號「:」,再跟一個依賴性表組成。
例:
example: depfile deptarget
該目標行指出目標example與depfile和deptarget有依賴關系,如果depfile或deptarget有修改,則重新生成目標。
example1 example2 example3: deptarget1 deptarget2 depfile
該目標行指出目標名表中的example1、example2、example3這三個各自獨立的目標是用相同的依賴列表和規則生成的。
clean:
空的依賴列表說明目標clean沒有其他依賴關系。

目標行後續的以Tab 開始的行是指出目標的生成規則,該Tab字元不能以空格代替。例如:
example.o:example.c example.h
cc –c example.c
該例子指出目標example.o依賴於example.c和example.h。如果example.c或example.h其中之一改變了,就需要執行命令cc –c example.c重新生成目標example.o。
可以用文件名模式匹配來自動為目標生成依賴表,如:
prog: *.c

以下是一個簡單的makefile的例子:

圖 1 最簡單的makefile例
make使用makefile文件時,從第一個目標開始掃描。上例中的第一個目標為all,所以目標clean不會自動被執行,可以通過命令make clean來生成目標。

1.2 命令行
命令行用來定義生成目標的動作。
在目標行中分號「;」後面的文件都認為是一個命令,或者一行以Tab製表符開始的也是命令。
如在上面的makefile例中,第三行以Tab字元開始的cc命令即是一個命令行,說明要生成hello應執行的命令。也可以寫成:hello:hello.o;cc –c hello –L…
一般情況下,命令行的命令會在標准輸出中回顯出來,如對上面的makefile執行make時,標准輸出如下:
cc -c hello.c
cc -o hello -L/usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11 hello.o
cc -c hello1.c
cc -o hello1 -L/usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11 hello1.o
如果不希望命令本身回顯,可在命令前加@字元,如在上例中不希望回顯cc –c hello.c和cc –c hello1.c,可修改makefile文件如下:

圖 2 抑制回顯的makefile例
對該makefile文件執行make時,標准輸出如下:
cc -o hello -L/usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11 hello.o
cc -o hello1 -L/usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11 hello1.o
可以看出,命令行前有@字元的不回顯。

1.3 宏定義行
在makefile中,可以使用宏定義減少用戶的輸入,例如上例中對hello和hello1的編譯選項均為「-L/usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11」,此時可以用宏來代替,如:
圖 3 使用宏定義的makefile例
宏定義的基本語法是:
name=value
在定義宏時,次序不重要。宏不需要在使用前定義。如果一個宏定義多次,則使用最後一次的定義值。
可以使用「$」字元和「()」或「{}」來引用宏,例如:
cc –o hello.o $(CCFLAGS) hello.o
也可以將一個宏賦值給另一個宏,但這樣的定義不能循環嵌套,如:
A=value1
B=value2
C=$(A) $(B)等價於C=value1 value2

1.4 偽指令
makefile大部分由宏定義行、命令行和目標行組成。第四種類型是make偽指令行。make偽指令沒有標准化,不同的make可能支持不同的偽指令集,使得makefile有一定的不兼容性。如果要考慮移植性問題,則要避免使用make偽指令。但有一些偽指令,如include,由於使用比較多,很多不同make都提供該偽指令。
1.4.1 偽指令include
該偽指令類似C語言中的#include,它允許一次編寫常用的定義並包括它。include偽指令必須在一行中,第一個元素必須是include,並且跟一個要包含的文件名,如:
include default.mk

1.4.2 偽指令「#」
「#」字元也是make的偽指令,它指出「#」後面的文件是注釋,如:
PROGNAME=test # define macro
#don't modify this

二 後綴規則
2.1 雙後綴規則
在前面的makefile例中有許多重復內容,例如,生成hello和hello1的命令類似,生成hello.o和hello1.o的命令也類似,除了編譯或鏈接的文件不一樣外,其它均相同,這時,我們就可以使用後綴規則。首先看一個雙後綴的例子:
圖 4 使用雙後綴規則的makefile例
後綴規則使用特殊的目標名「.SUFFIXES」。
第一行中.SUFFIXES的依賴表為空,用來清除原有的後綴規則,因為.SUFFIXES可以在makefile中多次使用,每一次都將新的後綴規則加入以前的後綴規則中。
第二行中指定後綴規則為「.c .o」,即表示將所有的.c文件轉換為.o文件。
第三行指定將.c文件轉換成.o文件的方法。$(CC)為make的預定義宏,其默認值為cc,$<為特殊的宏,代替當前的源文件,即所有要編譯的.c文件。
第六行指定目標hello和hello1的生成方法。$@為特殊的宏,代替當前的目標名,即hello和hello1,[email protected]即為hello.o和hello1.o。

上例介紹的是雙後綴規則,即它包含兩個後綴,如.c.o,用來把一個C源文件編譯為目標文件。雙後綴規則描述如何由第一個後綴類型的文件生成第二個後綴類型的文件,例如:.c.o規則描述如何由.c文件生成.o文件。

2.2 單後綴規則
單後綴規則描述了怎樣由指定後綴的文件生成由它基名為名字的文件。例如使用單後綴規則.c,可以由hello.c和hello1.c生成hello和hello1文件。例如將前面的makefile改為:
圖 5 使用單後綴規則的makefile例
由於.c後綴規則為make標准後綴規則,make為其指定了相應的命令行,所以在makefile中可以不用再指定其目標生成的具體命令行。

下表是make提供的標准後綴規則。
表 1 make標准後綴規則
後綴規則 命令行
.c $(LINK.c) –o $@ $< $(LDLIBS)
.c.ln $(LINK.c) $(POUTPUT OPTPUT OPTION) –i $<
.c.o $(COMPILE.c) $(OUTPUT OPTION) $<
.c.a $(COMPILE.c) –o $% $<
$(AR) $(ARFLAGS) $@ $%
$(RM) $%

三 特殊目標
在後綴規則中使用了特殊目標.SUFFIXES,用來指定新增的後綴規則。make還提供了幾個特殊目標來設置make的行為,下面為一些特殊的目標:
 .IGNORE
make在執行命令行時,如果返回的是錯誤碼,make的預設動作是停止並退出。增加該目標後,make將忽略命令行返回的錯誤碼,並繼續執行後續的操作。

 .SILENT
前面已經介紹過,make在執行命令行時會回顯命令行內容,在命令行前增加「@」字元將抑制該命令行的回顯。
如果增加該目標,所有的命令行不再回顯,相當於在每個命令行前均增加了「@」字元。

 .PRECIOUS
當收到一個信號或從shell命令返回非零的錯誤碼時,make刪除它所有已建立的文件。但有些文件即使出了錯誤,用戶也不想讓make刪除,這些文件可以作為.PRECIOUS目標的參數。它可以在一個makefile中出現多次,每一次都累積文件列表。

 .SUFFIXES
它為makefile指定新的後綴規則,新的後綴規則作為.SUFFIXES的依賴表給出。.SUFFIXES可以在一個makefile中多次使用,每一次都將新的後綴規則加入以前的後綴規則中,如果.SUFFIXES的依賴表為空,則設置後綴規則表為空。

四 特殊的宏
為簡單使用規則,make提供了幾個特殊的宏:
 $@
整個當前目標名的值可以由宏「$@」來代替。

 $<
當前的源文件由「$<」來代替。例如,在前面的例子中用到了$(CC) –c $<,其中的「$<」是所有要編譯的.c文件。宏「$<」僅在後綴規則或.DEFAULT中有效。

 $*
當前目標的基名由宏「$*」來代替。例如目標的名字是hello.o,則基名就是除去了後綴.o的hello。

以上介紹的特殊宏使用了make自身的規則,用戶不可以改變。下表介紹了C中預定義的宏。
用途 宏 默認值
庫文檔匯編命令 AR ar
ARFLAGS rv
AS as
ASFLAGS
COMPILE.s $(AS) $(ASFLAGS) $(TARGET ARCH)
C編譯器命令 CC cc
CFLAGS
CPPFLAGS
COMPILE.c $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET ARCH) –c
LINK.c $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET ARCH)
鏈接編輯器命令 LD ld
LDFLAGS
rm命令 RM rm
後綴列表 SUFFIXES .o .c .c~ .s .s~ .S .S~ .ln .f .f~ .F .F~ .l .mod .mod~ .sym
.def .def~ .p .p~ .r .r~ .y .y~ .h .h~ .sh .sh~ .cps .cps~

五 makefile的應用
當調用make時,它在當前目錄下搜索文件名是「makefile」或「Makefile」的文件,並執行。
如果不想使用上述預設文件,可以使用命令行中的「-f」來指定文件,如將編寫的makefile命名為mklib,則指定為「make –f mklib」。

㈣ C語言編單純形法程序怎麼寫

#include<stdio.h>
#include<math.h>

intm;//記錄約束條件方程組的個數
intn;//記錄未知量的個數
floatM=1000000.0;
floatA[100][100];//用於記錄方程組的數目和系數
floatC[100];//用於存儲目標函數中各個變數的系數
floatb[100];//用於存儲常約束條件中的常數
floatCB[100];//用於存儲基變數的系數
floatseta[100];//存放出基與入基的變化情況
floatcn[100];//存儲檢驗數矩陣
floatx[100];
intnum[100];//用於存放出基與進基變數的情況
floatZ=0;//記錄目標函數值

voidshuru();
voidprint();
intmincz();
intfind_line(inta);
voidexchange(inta,intb);
intmain()
{
inti,j=0;
intp,q,temp;//q:換入,p:換出
shuru();
printf(" -------------------------------------------------------------------------- ");
printf(" CB XB b ");
for(i=0;i<n;i++)
printf("X(%d) ",i+1);
for(i=0;i<n;i++)
x[i]=0;
printf(" ");
while(1){
q=mincz();
if(q==-1){
print();
printf(" 所得解已經是最優解! ");
printf(" 最優解為: ");
for(j=0;j<m;j++){
temp=num[j]-1;
x[temp]=b[j];
}
for(i=0;i<n;i++){
printf("x%d=%.2f",i+1,x[i]);
Z=Z+x[i]*C[i];
}
printf("Z=%.2f",Z);
break;
}
print();
p=find_line(q);
printf(" p=%d,q=%d",p,q);
if(q==-1)break;
exchange(p,q);
}
return0;
}
intmincz()
{
inti,k=0;
intflag=0;//檢驗數標記
floatmin=0;
for(i=0;i<n;i++)
if(cn[i]>=0)
flag=1;
else{
flag=0;
break;
}
if(flag==1)
return-1;
//進行到此處,說明存在<0的檢驗數
//找到最小的檢驗數,作為換入變數
for(i=0;i<n;i++){
if(min>cn[i]){
min=cn[i];
k=i;
}
}
returnk;
}
intfind_line(inta)
{
inti,k,j;
intflag=0;
floatmin;
k=a;
for(i=0;i<m;i++)
if(A[i][k]<=0)
flag=1;
else{
flag=0;
break;
}
if(flag==1){
printf(" 該線性規劃無最優解! ");
return-1;
}
for(i=0;i<m;i++){
if(A[i][k]>0)
seta[i]=b[i]/A[i][k];
elseseta[i]=M;
}
min=M;
for(i=0;i<m;i++){
if(min>=seta[i]){
min=seta[i];
j=i;
}
}
num[j]=k+1;
CB[j]=C[k];
returnj;
}
voidexchange(intp,intq)
{
inti,j,c,l;
floattemp1,temp2,temp3;
c=p;//行號,換出
l=q;//列號,換入
temp1=A[c][l];//A[c][l]主元
b[c]=b[c]/temp1;
for(j=0;j<n;j++)
A[c][j]=A[c][j]/temp1;//主元化為1
for(i=0;i<m;i++){
if(i!=c)
if(A[i][l]!=0){
temp2=A[i][l];
b[i]=b[i]-b[c]*temp2;
//主元所在列,其餘元素化為0
for(j=0;j<n;j++)
A[i][j]=A[i][j]-A[c][j]*temp2;
}
}
temp3=cn[l];
for(i=0;i<n;i++)
cn[i]=cn[i]-A[c][i]*temp3;
}
voidprint()
{
inti,j=0;
printf(" -------------------------------------------------------------------------- ");
for(i=0;i<m;i++){
printf("%8.2f X(%d)%8.2f",CB[i],num[i],b[i]);
for(j=0;j<n;j++)
printf("%8.2f",A[i][j]);
printf(" ");
}
printf(" -------------------------------------------------------------------------- ");
printf(" ");
for(i=0;i<n;i++)
printf("%8.2f",cn[i]);
printf(" -------------------------------------------------------------------------- ");
}
voidshuru()
{
inti,j;//循環變數
intk;
printf("請輸入線性規劃問題的約束條件個數M:");
scanf("%d",&m);
printf("請輸入線性規劃問題的決策變數個數N:");
scanf("%d",&n);
printf(" 請輸入方程組的系數矩陣A(%d行%d列): ",m,n);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%f",&A[i][j]);
printf(" 請輸入初始基變數的數字代碼矩陣: ");
for(i=0;i<m;i++)
scanf("%d",&num[i]);
printf(" 請輸入方程組右邊的值矩陣b: ");
for(i=0;i<m;i++)
scanf("%f",&b[i]);
printf(" 請輸入目標函數各個變數的系數所構成的系數陣C: ");
for(i=0;i<n;i++)
scanf("%f",&C[i]);
for(i=0;i<n;i++)
cn[i]=-C[i];
for(i=0;i<m;i++){
k=num[i]-1;
CB[i]=C[k];
}
}

㈤ 案例3:某年8月3日,美國德克薩斯商業銀行(TCB)將單據寄給信用證的開征行——中

問題不完整,請給出完整案例介紹,以便分析解答。

㈥ uC/os-ii在進行任務切換時,為什麼SP(堆棧指針)不和其他寄存器一樣壓棧而是存放在TCB(任務控制塊)中

uC/OS II的源碼中,OS_TCB結構體的定義中並沒有單獨保存SP的成員,而是由結構體中的OSTCBStkPtr指針指向的任務堆棧保存著任務切換需要保存的CPU寄存器內容。uC/OS會給每個創建的任務分配一個TCB,TCB中包含了該任務的全部信息。


(6)c語言中tcb擴展閱讀:

uC/os-ii工作原理:

1,要實現多任務機制,那麼目標CPU必須具備一種在運行期更改PC的途徑,否則無法做到切換。不幸的是,直接設置PC指針,還沒有哪個CPU支持這樣的指令。但是一般CPU都允許通過類似JMP,CALL這樣的指令來間接的修改PC。

2,事實上,在使用CALL指令或者軟中斷指令來修改PC,主要是軟中斷。但在一些CPU上,並不存在軟中斷這樣的概念,所以,我們在那些CPU上,使用幾條PUSH指令加上一條CALL指令來模擬一次軟中斷的發生。

3,在uC/OS-II里,每個任務都有一個任務控制塊(Task Control Block),這是一個比較復雜的數據結構。在任務控制塊的偏移為0的地方,存儲著一個指針,它記錄了所屬任務的專用堆棧地址。

4,事實上,在uC/OS-II內,每個任務都有自己的專用堆棧,彼此之間不能侵犯。這點要求程序員在它們的程序中保證。一般的做法是把它們申明成靜態數組。而且要申明成OS_STK類型。當任務有了自己的堆棧,那麼就可以將每一個任務堆棧在那裡記錄到前面談到的任務控制快偏移為0的地方。

5,以後每當發生任務切換,系統必然會先進入一個中斷,這一般是通過軟中斷或者時鍾中斷實現。然後系統會先把當前任務的堆棧地址保存起來,僅接著恢復要切換的任務的堆棧地址。由於哪個任務的堆棧里一定也存的是地址,這樣,就達到了修改PC為下一個任務的地址的目的。

㈦ 線程式控制制塊tcb中包含了哪些內容

進程式控制制塊(Process
Control
Block,PCB),是操作系統內核中一種數據結構,主要表示進程狀態,它是對系統的進程進行管理的重要依據,和進程管理相關的操作無一不用到PCB中的內容。雖各實際情況不盡相同,PCB通常記載進程之相關信息。
第一種描述
[1]
(1)進程狀態:可以是new、ready、running、waiting或halted等。
(2)程序計數器:接著要運行的指令地址。
(3)CPU寄存器:如累加器、索引寄存器(Index
Register)、堆棧指針以及一般用途寄存器、狀況代碼等,主要用途在於中斷時暫時存儲數據,以便稍後繼續利用;其數量及類因計算機架構有所差異。
(4)CPU排班法:優先順序、排班隊列等指針以及其他參數。
(5)存儲器管理:如分頁表(Page
Table)等。
(6)會計信息:如CPU與實際時間之使用數量、時限、帳號、工作或進程號碼。
(7)輸入輸出狀態:配置進程使用I/O設備,如磁帶機。
第二種描述[2]
(1)進程標識符(內部,外部)
(2)處理機的信息:通用寄存器,指令計數器,PSW,用戶的棧指針。
(3)進程調度信息:進程狀態,進程的優先順序,進程調度所需的其它信息,事件。
(4)進程式控制制信息:程序的數據的地址,資源清單,進程同步和通信機制,鏈接指針。

㈧ (OS_TCB *)0怎麼理解

關於對(OS_TCB *)0是否是指向空的任務塊的理解:
(OS_TCB *)0雖然可以看成指向了一個起始地址為0的任務塊,但是實際一塊只是作為一個標志。如果您對鏈表等數據結構有一些接觸的話會更容易理解。在內核有關TCB構成的鏈表中,用(OS_TCB *)0指向該鏈表已經到達尾部,或者鏈表為空。
同樣的,(OS_TCB *)1,也是作為一個標志。這個值,我想在內核中應該是用在OSPrioTable[]相關的操作代碼中。將OSPrioTable[ X] 置為(OS_TCB *)1,這樣就表明該任務優先順序已經被佔用。因為其它的代碼是通過檢查OSPrioTable[x] 是否等於(OS_TCB *)0來判定對應的優先順序是否已經使用。