2009年3月6日 星期五

us-osii run on sm5964

這個版本是 yy 的版本,有一點修動;
因sm5964 的 xram (internal) 最大為 0x2ff,故這部份要修訂

; Stack Space for reentrant functions in the LARGE model.
XBPSTACK EQU 1 ; set to 1 if large reentrant is used.
XBPSTACKTOP EQU 02FFH+1 ;07FFFH+1; set top of stack to highest location+1.


另串列接收的時候一直有亂碼,以為程式那邊有錯 ??
(看起來很像是 Tera Term 不穩定 - 於 19200 baud rate)




Further check ?? if i increase baud rate to 57600 -> 115200,
沒什麼作用,或說不大;字串轉進緩衝區,有很大的區塊是關閉中斷---無法同步發送資料

what is side effect ?? ( probably may i use less buffer to keep the data wait for transfer ??
but it also increase the times (次數) of rs-232 interrupt -> may cause timer interrupt less responsive to context switch ?? )



note : about PrintChar()
// can not direct use inTxBuf as operation,because it may warp around at begin inTxBuf==TxBuf+LenTxBuf"
// it's not easy to go back what has do, so used a tempraray variable "t"


目標確認 : 串列緩衝區 & Stack 大小的合理值,因為設太大也會丟資料錯誤
serial.h
#define LenTxBuf 100 // 2000 Don't too small,because it will cause display abnormal.
#define LenRxBuf 50
#define MaxLenStr 100 /*buf[MaxLenStr+1] for '\0'*/
os_cfg.h
#define MaxStkSize 60 //@ askey 100


出錯原因 : A 只有單字; ****....一行有31個字 /n 又兩個 --> 總共 33 個
塞 3 行就爆了(指緩衝區 #define LenTxBuf 100 )

而後資料就進不去了




// not 與 C -lang 中差異 --> extern v.s EXTRN
Os_cpu_a.asm
;聲明引用全局變量和外部子程序
EXTRN DATA (?C_XBP) ;仿真堆棧指針用於重入局部變量保存

EXTRN IDATA (OSTCBCur)
EXTRN IDATA (OSTCBHighRdy)


;對外聲明4個不可重入函數
PUBLIC OSStartHighRdy
PUBLIC OSCtxSw

// 設定 IP (d:0xb8) 中斷優先權的 side effect

//
IF XBPSTACK <> 0
EXTRN DATA (?C_XBP)

MOV ?C_XBP,#HIGH XBPSTACKTOP
MOV ?C_XBP+1,#LOW XBPSTACKTOP
ENDIF

//Os_cpu_a.asm
;保存仿真堆棧指針?C_XBP
INC DPTR
MOV A,?C_XBP ;?C_XBP 仿真堆棧指針高8位
MOVX @DPTR,A
INC DPTR
MOV A,?C_XBP+1 ;?C_XBP 仿真堆棧指針低8位
MOVX @DPTR,A




// m51 看記憶體配置,找方法使配置有效率
目前是於sm5964 ( 8051 type mcu),記憶體沒有很大,不向 arm 一樣;所以有點斤斤計較
256*3=768 (目前用 733 ) --引發問題,如何確認仿真堆棧的佔用大小

1.


2. 與 3.配套使用,似乎沒必要那麼大 ??
結果 還是要大一點.因為系統棧上方要放 simulation stack for entrance function

?STACK SEGMENT IDATA // 也是大陸書的說法,51 有系統棧
RSEG ?STACK
OSStack:
DS 40H
OSStkStart IDATA OSStack-1

51 使用系統棧的時機 --1. call 2. 中斷發生--自動push & push r0~r7 等 register
實際測試沒用到那麼多, 13H 已經夠了; 容餘設成 20H ?? 尚待驗證





3.Keil C for 8051 的編譯與大系統不同 ??
(下次有空試一下 mdk ?? 參數傳遞以堆棧,所有函數都是在進入 ?? )













引發問題 : 仿真棧的佔用情形 ??
上圖 看 m51 知變數分配位置,下圖 ?C_XBP (Keil 仿真的情形);已經快衝到了 ??
跑一段時間,看起來真的沖到了,但程式還是繼續跑 ??

(沒沖到,每一task分配stack,而stack的頂段就是simulated stack for entrance function)










TYPE BASE LENGTH RELOCATION SEGMENT NAME
-----------------------------------------------------

* * * * * * * D A T A M E M O R Y * * * * * * *
REG 0000H 0008H ABSOLUTE "REG BANK 0"
DATA 0008H 0002H UNIT ?C?LIB_DATA
IDATA 000AH 0009H UNIT ?ID?UCOS_II
0013H 000DH *** GAP ***
BIT 0020H.0 0000H.1 UNIT ?BI?SERIAL
0020H.1 0000H.7 *** GAP ***
IDATA 0021H 0041H UNIT ?STACK

* * * * * * * X D A T A M E M O R Y * * * * * * *
XDATA 0000H 0189H UNIT ?XD?OS_CORE
XDATA 0189H 00A2H UNIT ?XD?SERIAL
XDATA 022BH 0079H UNIT ?XD?DEMO
XDATA 02A4H 0039H UNIT ?XD?UCOS_II

沒有留言:

張貼留言