2009年3月7日 星期六

uc-os ii - step by step to analysis

一個任務(ex : TaskStartyya)運行時,同時挪用的系統資源;
定義 : 系統棧 (SP 操作 ) v.s 任務棧 (TaskStartStkyya)
系統棧的深度 : call 的層數 + 中斷 push 的資料量 (worse case)
任務棧的深度 : re-enterance function 層數所累積的資料量,
( note : keil C51 呼叫函數以 r0~r7 傳遞, 標準 C 很像是以 Stack 傳遞 ?? )


觀察點 : 再進入函數所壓入的的資料,其所分配的記憶體是否衝突
add a watch : ?C_XBP
OSTaskStkInit
0x2e4
OSTCBInit
0x2df

一個任務運行時,同時挪用的系統資源;
1. 系統棧 SP 操作, call function / interrupt rs-232 / push, pop when interrupt
2. OS_STK TaskStartStkyya[MaxStkSize];//注意:我在ASM文件中設置?STACK空間為40H即64。 --> 會用到這個 stack 的頂端 as simulation stack for entrance function

( 其他問題點 :
1. OSStart 完成切換任務"前",0x2ff+1 的 simulation 永遠用不到,無法回收,因為不返回

2. Simulation stack 於 任務配置的TaskStartStkyya,因於 xram 中,所以操作速度不好
但相對系統棧要回存的資料只有當下 SP - SP-start;

另外的優點,系統棧可以小一點,與任務棧大小脫鉤

3. 可以改嗎 ?? simulation stack 操作於於系統棧之中,相對需回存所有的系統棧 to 任務棧之中


// 進入 TaskStartyya
?C_XBP 0x267 --> why ??
by 1 & 2 --> 0x22b + 60 = 0x22b + 0x3c = 0x267 ( 不是壓到 TaskStartyyb)
(與前面 0x2ff+1 有異曲同工; 堆棧都是先遞增或遞減操作 ++X)

1----------
#define MaxStkSize 60 //@ askey 100
2----------------------from m51--------
C:195DH PUBLIC main
X:022BH PUBLIC TaskStartStkyya
X:0267H PUBLIC TaskStartStkyyb
X:02A3H PUBLIC err
C:1A69H PUBLIC _?TaskStartyya



TaskStartyya 運行, PrintStr("\n123456789A123456789A123456789A1"); 時,發生串列中斷
?C_XBP 0x25c 當進入到 void serial(void) reentrant // 這一段很像不重要

?C_XBP 0x25f 當 OSTimeDly -> OSCtxSw --> & push all 此時 SP == 0x33,故有 0x13 Byte 需儲存

0x22b + 0x13 = 0x23e ....距離 0x25f 還有一段空間

// 當定義任務棧大小,編譯的結果
#define MaxStkSize 60 (xdata : 733) // 80 (xdata :793)
哈哈 編譯 xdata 爆了,竟然還可以跑 (0x733) --> 沒報,寫錯了
256*3= 768

當 793 看 m51 --肯定爆了
X:0317H PUBLIC OSTaskCtr
X:0318H PUBLIC OSRdyTbl

// 又做了一個實驗,設定成 #define MaxStkSize 70 (xdata 763)
沒爆,但也不會動 --> 因為 simulation stack 覆蓋到有些記憶體的配置,這個從記憶體配置中看不出來
X:02F9H PUBLIC OSTaskCtr
X:02F5H PUBLIC OSIdleCtr

//小結 : 只能說真是狗屎運,設成 60 竟然可以於 sm5964 跑起來,

沒有留言:

張貼留言