?? faq.txt
字號:
問:
chenmingji,您好!
有個苯苯的問題想請教一下:
如果我在您編寫的SMALL RTOS上編寫tcp/ip 協議棧(含http)是否可行?
如果可行,該方案和不采用RTOS的方案,其效率和費用方面有什么差別?
我是搞CS的,以前沒有搞過單片機,腦袋里面是糊涂的,您的一言將對我將是極大的啟示!
thank you!!
答:
SMALL RTOS是為小ram系統單片機編寫的,目前僅在51系列單片機上成功運行,還沒有在其它單片機上移植(目前我僅有51和avr的開發系統).在小ram系統單片機如51系列上運行tcp/ip 協議棧是不太現實的.一般tcp/ip 協議棧需要在32位單片機上運行,在8位機上運行太勉強(51是8位機),除非您只運行ip協議.建議使用ucos/ii操作系統或是嵌入式linux,并選用arm或龍珠系列單片機..
-------------------------------------------------------------------------------
問:
您好,首先感謝您在C51bbs上無私提供了small rtos for 51的源碼,謝謝!
現我有一個問題要請教:在您的軟件說明文檔中提到:
/////
通過調用OSWait進行任務切換,保存任務環境需要RAM空間為(4+除
OSWait外調用層次*2)字節。通過中斷進行任務切換保存任務環境需
要RAM空間為(調用層次*2+15)字節,這15字節包括R0 R7,ACC,B,
PSW,DPH和DPL。
/////
請問用調用OSWait進行任務切換時,需要保護的任務環境為什么只有那么多?
麻煩請具體說明一下”4“的含義,還有為什么不用保存r0--r7,acc,b等呢?
謝謝!
麻煩請具體說明一下”4“的含義,還有為什么不用保存r0--r7,acc,b等呢?
答:
我先解釋4的問題,其實它是兩個調用返回地址,一個是用戶任務調用OSWait的返回地址,用戶任務調用OSWait時會把它壓入堆棧,另一個為OSWait調用OSSched(非中斷的任務切換函數)的返回地址,當調用OSWait被喚醒時,從這里開始執行。
我再解釋為什么不用保存r0--r7,acc,b等的問題。這是利用了Keil C51編譯器的特性。Keil C51編譯器在編譯C語言程序時,如果發現一個函數調用了一個復雜的函數,它就認為這個函數返回時r0--r7,acc,b,PSW,DPH和DPL已經變化,因此,它不會在調用復雜函數前用這些寄存器保存有用數據,復雜的函數返回時這些寄存器是什么值不影響程序執行(其它編譯器應該是類似的)。我想我已經把這個問題闡述清楚了,如果還有什么疑問,歡迎來email提問,我們共同探討。
-------------------------------------------------------------------------------
問:
你好:
非常感謝你的回復!
我現在有個問題想問一下,在OSWait(K_SIG,0)情況下OSWait的第2個參數的含義是什么?
謝謝你!
答:
您好!
OSWait(K_SIG,0)情況下OSWait的第2個參數沒有任何意義。
-------------------------------------------------------------------------------
問:
明計老師:
您好,打攪您了,不好意思。
我看了您的那篇代碼公開的small rtos,感覺很有啟迪,也很實用,是很不錯的一個實時操作系統。
但我有一些疑慮,想向您請教:
1。small rtos 是允許中斷嵌套的,您說:“通過中斷進行任務切換保存任務環境需
要RAM空間為(調用層次*2+15)字節,這15字節包括R0 R7,ACC,B,PSW,DPH和DPL。”這樣夠用么?是不是應該這樣認為:ram空間為(調用層次*15),這樣才能保證數據的完整性,是么?但是如果這樣的話,假設現在有15個任務出現中斷嵌套的話,好像內部ram又不夠用了,更不用說具有256級嵌套了。這一點我沒有明白您是如何解決的。
2。我認為應該加上任務的刪除功能,因為在實際應用中,有些任務是不需要長時間駐留內存的,譬如有些通信方面的任務,這樣可以節省內部ram空間,也可以在任務調度時減少不必要的查詢時間,相應的可以提高一些系統的實時性。你說是么?
3。我不太清楚系統時鐘對系統實時性的影響會怎樣。資料上表示,系統時鐘一般設為10毫秒,而您設為100毫秒,您為什么這樣設呢?這樣對系統的實時性會有什么樣的影響呢?
這時我的幾個疑點,想向您請教。
總的來說,我認為small rtos再是實行要求不太高,任務數不太多的情況下是很好的一個應用系統。多謝您的研究和開發。
答:
您好!謝謝您small rtos的關注。對您的問題解答如下:
1、small rtos在所有中斷退出后進行任務切換的。這里所說的“調用層次”是指用戶任務在被被高優先級的任務中斷時它的函數調用層次,而不是中斷嵌套層次(此時所有中斷已經退出);“任務環境”是指這個任務再次恢復運行時必須保存的內容。針對cpu,任何時候,最多只有一個任務在運行(不是就緒),此時不論中斷嵌套多少層,只是占用這個任務的堆棧,而small rtos 51把所有自由ram分配給正在運行的任務,因此,中斷是對應RTOS的,不是對應任務的。當然,中斷嵌套太多,ram也不夠用的。說得沒有什么條理,不知是否明白。
2、任務的刪除功能并不是刪除任務代碼(它在rom中,刪除不了既使在ram中,rtos也不會刪除它,不然如何恢復呢?除非你有硬盤,但是但多數單片機不會這么奢侈),僅僅是rtos不再調度它,也不再保存它的任務環境。如果要實現任務的刪除功能,就要多分配一些ram空間存儲任務狀態,調度算法也變得復雜,調度時間反而變長,總的ram占有也未必減少。因此,我沒有加入任務的刪除功能。你可以使用使任務睡眠和喚醒的方法實現類似功能。
3、系統時鐘的設置是多方面權衡的結果。系統時鐘間隔設置短一點,系統是實性好一些,但是cpu效率會低一些;系統時鐘間隔設置大一點,系統是實性差一些,但是cpu效率會高一些。我設置為100毫秒,并不是說您必須要設置為100毫秒(我的一個項目中,定時器中斷頻率為800hz,系統時鐘頻率為其1/8,我在一個任務中調用OSTimeTick,而不是在定時中斷中調用,定時中斷只是激活那個任務)。
-------------------------------------------------------------------------------
問:
你好:
再麻煩你一下,源文件中定義的宏
#define OS_TICKS_PER_SEC 10 /* 設置1秒系統系統節拍數
在什么地方使用了?
謝謝!!!!!!
答:
您好!
OS_TICKS_PER_SEC暫時沒有在small rtos 本身代碼中使用。
-------------------------------------------------------------------------------
問:
老陳:
我用了這個SMALL-RTOS,發現沒有設置TIME1(THO,TH1)的值,也只在開始設置為0;那么這個下面定義就沒有用了。
“#define OS_TICKS_PER_SEC 10 /* 設置1秒系統系統節拍數 ”
用戶如何定義新系統的節拍呢?還是不需要?
謝謝!
答:
您好!
“#define OS_TICKS_PER_SEC 10 /* 設置1秒系統系統節拍數 ”
只是一個或許未來SMALL-RTOS需要使用到的宏,沒有什么實際意義。如何定義新系統的節拍,需要用戶個根據系統設計自己解決。
-------------------------------------------------------------------------------
問:(注在1.10.4及以上版本只有一個匯編文件,1.11及以上版本ex3和ex4已經合并)
cmj:
你好,很有幸我得到了你的 small rtos,他的確是個好東西,尤其是對于吾等這些新
手。我粗略的看了一下,現有幾個問題想向你請教的。
1、ex3與ex4的顯示為什么不同?就因為它們使用的~~.asm文件不同嗎?為什么在
他們的相應文件(ex3.c、ex4.c)里體現不出來呢?他們的~~.asm文件主要差別在那
里?
答:
您好!
1、ex3與ex4的顯示為不同主要是OS_CFG.H和config.h定義不同。
ex3的OS_CFG.H中,有如下定義:
“#define OS_MAX_TASKS 7 /* 最大任務數1~16 */”
ex4的OS_CFG.H中,則為:
“#define OS_MAX_TASKS 11 /* 最大任務數1~16 */”
ex3的config.h中,有如下定義:
“void (* const TaskFuction[OS_MAX_TASKS])(void)={TaskA,TaskB,TaskB,TaskB,TaskB,TaskB,TaskC};”
ex4的config.h中,則為:
“void (* const TaskFuction[OS_MAX_TASKS])(void)={TaskA,TaskB,TaskB,TaskB,TaskB,TaskB,TaskB,TaskB,TaskB,TaskB,TaskC};”
至于有兩個asm文件,主要是為了使用戶在不多于8個任務時,節省一些ram和cpu時間占用。
2、TaskB代碼被多個任務共享,在ex3中,使用TaskB代碼的任務ID為1、2、3、4、5,在ex4中,使用TaskB代碼的任務ID為1、2、3、4、5、6、7、8、9;TaskB顯示數字。
3、16任務版的asm文件并非只能使用16個任務,9~16個任務均可,小于9個任務時用8任務版的asm文件。其它參見1和2。
4、TMOD=(TMOD&0XF0)|0X01是為了只設置time0,不改變time1,您可以根據需要設置。PCON=PCON|0X01雷同,是避免改變其它位。
5、最后一個任務的編寫有以下限制:不能有放棄cpu的企圖,換句話說,它必須一直處于就緒狀態。沒有其它限制。我使用PCON=PCON|0X01是為了使cpu進入節能狀態。(這一條僅針對1.10.5及以前版本)
-------------------------------------------------------------------------------
陳老師:
您好。我是個對RTOS感興趣的初學者,這里向您請教幾個問題。
1 RTOS系統中,程序設計和不用RTOS有什么不同?說簡單點就是怎么在RTOS下編程?在您的small
rtos中,怎么設計應用軟件?
2 在您提供的示例程序中用到了一個用于pc顯示的dll文件,我用keil
c 6.02進行仿真,結果根本沒有您所說的pc窗口啊。
注:本來我用 keil c 623和7.0的,為了運行這個特意下載了個6.02.
3. 如果我只是想應用您的這個small
rtos是否需要閱讀全部源代碼?我大致讀了一下您的代碼,量很大,盡管您都有詳細的注釋,可是您是否能夠提供比如流程圖之類的東西,讓讀者能夠明白您的rtos的運行機制?如果讓讀者自己分析,確實比較辛苦。
謝謝您。
答:
您好!
1 這個問題可以專門寫文章論述,現在發送以前寫的文章給你,它只說明部分問題。
2 將dll拷貝到keil c51的c51/bin目錄下,重起uv2,進入仿真狀態,在peripherals菜單下有Virtual Screen菜單,點擊它即可。注意使用我提供的工程。6.02我沒有試過,6.14肯定行。
3 果我只是應用,不必閱讀全部源代碼,看一看使用手冊和例子即可。源代碼分析暫時不提供。
-------------------------------------------------------------------------------
問:
陳老師:
您的small rtos中OS_CPU.h中有定義這樣一個宏
#define OS_ENTER_CRITICAL() EA = 0,Os_Enter_Sum++
我看了c語言的語法書 是不是中間該用;而不是對號啊?
對于宏來說 只是替換而已。
答:
參見C語言中逗號可以把多個語句組成復合語句,請參見c語言語法書。
-------------------------------------------------------------------------------
問:
是否為筆誤?
OSTsakStackBotton[0] = STACK;
OSTsakStackBotton[OS_MAX_TASKS] = (uint8 idata *)(IDATA_RAM_SIZE%256);
是否為OSTaskStackBotton?
請查OSStart()函數
答:
不是筆誤,OSTsakStackBotton定義為OSTsakStackBotton[OS_MAX_TASKS+1],OSTsakStackBotton[OS_MAX_TASKS]保存IDATA的大小(256時為0)。
-------------------------------------------------------------------------------
問:
請問您的 Small RTOS(51) 1.10v 能否提供對硬盤(FAT32)寫文件?如何進行?謝謝!
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -