一個任務(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 跑起來,
2009年3月7日 星期六
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言