2009年3月17日 星期二

03/16

小考:
void Task(void *pdata){
INT8U x;
INT8U y;
INT8U err;

for(;;){
OSSemPend(RandomSem, 0, &err);
x=random(80);
y=random(16);
OSSemPost(RandomSem);


PC_DispChar(x, y+5, *(char*)pdata, DISP_FGND_BLACK+DISP_BGND_LIGHT_GRAY);
OSTimeDly(1);
}
}
橘色部份是讓10個task在執行時隨機印出他 們的名子
此段程式碼用Semaphore去保護
若给為用OS_ENTER_CRITICAL(); OS_EXIT_CRITICAL();去保護
也就是disable interrupt, enable interrupt去保護, 可不可以?
ans:
可以, 但同時也禁止interrupt的執行
若用Semaphore去保護, 執行到critical section, 突然有interrupt進來要修改critical section中被保護的資料, 就保護不了.
這兩種方法各有優缺點, 到底要用哪種, 取決於該段保護的資料有可能被誰存取.
在此段程式碼中, 因為只有可能被task存取, 很少有機會被interrput存取, 所以用Semaphore去保護

開始上課...
idle task是priority最低的task, 功能是一直做加法(無意義的事...)
可以用來判斷CPU的使用率, ex: 加法做20次/毫秒=>CPU使用率0%, 加法做0次/毫秒=>CPU使用率100%

TaskStart():
AckMbox=OSMboxCreate((void*)0);
TxMbox=OSMboxCreate((void*)0);
用於建立MSN的IPC(inter process communication), 因為在建立TCP時就事先allocate了, 所以速度快
PC_DOSReturn();
修改pc值, 使強制回到main function

Task1(): 統計Stack空間
Task2(): 一直印 '', '/', '-', '\'
Task3(): 一直印 '', '/', '-', '\', 且將 '?' 填入dymmy[i] (很明顯的, stack使用率高於Task2())
char dymmy[500];
INT16U i;
此兩行資料誰放在stack最上方, 所造成的CPU使用率不同. 若發現比較高, 則把此兩行對掉即可改變stack方式使CPU使用率降低
Task4(): priority=4
Task5(): priority=5(永比task4高)
兩個task互相傳MSN(task4:" #*(&%@!... ", task5: "恩"....)
task4會在OSMboxPend(AckMbox, 0, &err)等待task5的回應, 且task5的OSTimeDlyHMSM(0, 0, 1, 0)會等待1秒, 所以priority高的task5不會一直執行

linux 2.6, linux 2.4 and uC/OS-II 之stack的比較:
linux2.6:
stack大小為4k or 8k
user mode下有的stack, kernel mode下也有一模一樣的stack
interrupt service routines(kernel mode)有的stack, kernel service routine(kernel mode )也有相對應的stack
優: 各自有各自的stack比較安全, 省記憶體空間
缺: 執行上比較慢
linux 2.4:
stack大小一定為8k, 因為要預留4k給ISR使用
將對於linux2.6不同的地方在於 interrupt service routines沒有stack, 而與kernel service routines下的stack共用
優: 速度上比linux2.6還要快一點
缺: 記憶體空間比linux2.6浪費
uC/OS-II:
stack大小一定為8k
只有kernel mode, 沒有user mode
kernel mode, kernel service rouutines and interrupt service routines 都使用同一個stack
優: 執行速度上是最快的
缺: 記憶體空間使用上是最浪費的

沒有留言:

張貼留言