Ⅰ borland c3.1(集成開發環境下)怎麼編譯和連接多個文件
起點-SDK和IDE的選擇
本文主要為學習Symbian開發的初學者講授如何准備開發環境。對Symbian開發有興趣、具備一定軟體設計基礎的朋友都可以來一起研究。需要說明的是,對於學習Symbian開發,需要有較為牢固的編程經驗(這里我們暫時要求具有較好的C++程序語言設計能力),需要較好的英語基礎,需要堅持不懈的精神;另外,如果你重來沒有接觸過VS2003,不懂DOS命令、不懂如何設置環境變數,請先學習相關知識。另外,本文的作用僅僅是總結和引導,強烈建議初學者結合本文和SDK文檔動手實踐
本文主要針對S60的開發環境的建立,因此首先為大家列出S60系統的各種版本。因為開發者應該根據需要,選擇自己適合的SDK版本。
1、Series60 第一版 - Symbian OS 6.1
2、Series60 第二版 - Symbian OS 7.0s
3、Series60 第二版 Pack 1 - Symbian OS 7.0s
4、Series60 第二版 Pack 2 - Symbian OS 8.0a
5、Series60 第二版 Pack 3 - Symbian OS 8.1a
6、Series60 第三版 - Symbian OS 9.0
需要要說明的是,Nokia的Symbian/Series60開發包支持的集成開發環境[IDE]工具有很多種,下面列出主要使用的一些IDE:
1、Microsoft Visual Studio 6 / Visaul C++ 6
2、Microsoft Visual Studio .NET [2003] / Visaul C++ 7
3、Borland C++ Builder 6
4、Borland C++ Builder X 1.0
5、Metrowerks CodeWarrior Studio for Symbian Personal/Professional 2.0/2.5
選擇哪種開發工具依據是你個人的習慣和喜好,需要注意的是,對於不同的開發環境,我們需要選擇不同SDK。本文所使用的SDK支持Series60 第二版 Pack 2 - Symbian OS 8.0a,IDE為VS2003:
=============================================
SDK:SERIES 60 2ND EDITION SDK FOR SYMBIAN OS SUPPORTING FEATURE PACK 2
SUPPORTING MICROSOFT VISUAL C++ CHINESE SIMPLIFIED EDITION
IDE:Microsoft Visual Studio .NET 2003
=============================================
若你使用的IDE是VC6,那麼步驟與本文將有所不同,你可以參考網上其他教程,網上講授Symbian環境設置的90%以上的文章都是基於VC6的。若你使用VS2003,但是所使用的SDK與本文使用的有所出入,那麼本文仍然適用,不過個別地方也許會有改動。有什麼問題可以提出來,大家一起討論。
本文並未講述安裝Nokia Developer Suite - Carbide.vs 來配合VS2003導入、建立S60工程。這部分內容將在下一篇文章講解如何建立、導入工程的時候詳細講解。因此你可以暫時不安裝該軟體。等你按照下面的說明將環境設置好以後,再安裝此軟體做更深一步研究。涉及此項內容的細節,請參閱:Symbian OS開發入門(二) :VS2003環境下Symbian工程的導入與建立。
我個人原來是使用VC6作為IDE,對VS2003下的開發也不是特別熟悉,我是一個Symbian開發的初學者,這里寫的東西是大多數基於SDK的開發文檔,結合自己測試的時候的一些經驗教訓。寫出來,一方面象引導象我一樣的初學者盡快入門,另外一方面大家也可以在此基礎上討論,解決一些經驗錯誤。幫助後來者少走彎路。
【開發環境建立詳細步驟】
一、系統要求
文檔中寫了一些對你PC的要求,反正就是保證你的電腦能運行VS2003和SDK。一般沒有什麼問題。系統要求Win2000 SP3以上, WinXP SP1以上,Win2003中任意一種。
二、軟體安裝
說明:在安裝SDK以前保證下列1-3項先被正確安裝。安裝軟體的時候必須保證你所使用的帳號是你PC的管理員帳號,否則可能導致某些環境變數不能被正確設置。SDK和IDE要安裝在電腦上的同一個分區。SDK的安裝路徑不能含有空格。下面詳細說明需要安裝的軟體及其步驟:
1、在安裝SDk之前必須安裝ActivePerl(官方文檔要求安裝Perl 5.6.1 build 531,並說明安裝其他版本可能會有問題,我自己測試使用ActivePerl-5.6.1.638-MSWin32-x86,運行情況良好)。該軟體可以到官方網站下載:
2、安裝java Run-Time1.4.1_02 或者新版本,下載地址java.sun.com/downloads/index.html"
說明:在使用命令行編譯程序的時候事實上是不需要用到JAVA Run-Time1的。但是以後我會提到,若要使用SDK的一個強大的工具ApplicationWizard,就必須安裝該組件,同時若要使用Sisar等工具的話,JRE也必不可少。這里請你就先安裝吧。
3、安裝IDE,如前所述,安裝Microsoft Visual Studio .NET 2003
4、安裝SDK,注意前面所說的SDK的安裝路徑不能含有空格。並且要和IDE裝在同一個分區,這樣可以避免一些麻煩。下載地址:,6566,034-4,00.html
5、安裝Nokia Developer Suite - Carbide.vs 。這相當於VS2003的一個插件,用於幫助你導入或者建立S60工程,從而似的你可以在VS2003中編寫代碼。(本文暫時不講解怎麼使用,你可以先安裝,也可以以後用的時候再安裝)
下載地址:,,034-902,00.html
三、環境變數檢查
在2.0版本的SDK之前[不包括1.2For CW],你需要在系統變環境量中設置一個名為EPOCROOT的環境變數,(什麼是環境變數,如何設置,這個去自學),他要指向你的SDK包含有epoc32的路徑,前面沒有盤符,後面要加一個"\",這個一般在你安裝了SDK之後系統會自動替你加好。不過2.0之後的[包括1.2 For CW]就不必設置了,有一個名為devices的SDK管理工具會為一些需要使用這個變數的工具提供類似模擬EPOCROOT環境變數的功能。可以把devices看作是多個Symbian SDK,不限於S60,得切換工具,他的使用方法可以在你安裝了2.0SDK之後,在命令行模式下輸入 devices -help 來獲得幫助。
我們使用的這個版本的SDK不需要設置太多環境變數,這里只需要自己加入修改一下環境變數,在系統環境變數path中加入:
{VS2003的安裝路徑}\Microsoft Visual Studio .NET 2003\Vc7\bin;這樣才能保證後面用到的LINK.EXE被正確設置。
四、編譯運行「Helloworld」 - 檢查開發環境是否被正確設置
上面的安裝步驟完成以後,還沒有大功告成,這時你需要做的是檢查你的環境是否被正確設置。怎樣來確認開發環境已經正確建立了呢?最好的方式就是通過編譯、運行一個例子來檢驗。需要指出的一點是,下面的步驟可以在可以在Windows的命令行工具中操作,也可以在VS 2003自帶的工具「Visual Studio .NET 2003 命令提示」中操作。在VS 2003的命令行工具中操作,其優點是可以避免某些環境變數設置有誤而導致的錯誤,因為它不但包含系統環境下PATH變數的內容,同時也包含安裝VC++.NET過程中,添加的一些路徑,包括主要的編譯鏈接等工具。而缺點就是:若你僅僅在這里通過驗證,而在WINDOWS自帶的命令行界面沒有通過的話,那麼後期會遇到一些麻煩(例如使用ApplicationWizard建立工程)。所以,如果不使用VC++.NET帶的「命令提示」工具,您也許就會因為找不到相應編譯工具,而無法繼續下去。如果自己勤快一些,可以手動把環境變數加到系統PATH中去,這樣就可以用Windows「附件」菜單中的那個「命令提示」工具了,後面也許會順利一點。
1、打開Windows的命令行界面(或者VC++.NET自帶的命令行工具)
2、將剛剛安裝的SDK設置為默認的devices.這個可以通過下面的命令設置:
devices -setdefault @S60_2nd_FP2_SC:com.nokia.Series60
事實上SDK的安裝過程中就會提示你設置默認的devices。做這個工作的原因是你的系統中很可能安裝了多個SDK,那麼使用哪個SDK作為當前的開發工具,就需要正確設置。你可以使用命令行devices -default來查看當前的默認SDK是什麼。
3、找到Symbian工程文件所在的目錄
現在我們就通過SDK中自帶的例子來驗證你的環境是不是被正確設置。注意安裝了SDK以後,在其安裝目錄中的Series60Ex文件夾中有很多例子,我們使用helloworldbasic來驗證。在命令行界面中用cd命令進入helloworldbasic的group目錄:
cd sdk_installation _directory\Series60Ex\helloworldbasic\group
在group目錄下應該包含bld.inf和helloworldbasic.mmp這兩個文件。這兩個文件的簡要描述如下:
HelloWorld.mmp:項目定義文件,描述了將要構建的項目信息,還定義了一些資源文件和應用程序信息文件。它是一個環境中立的文件,可以使用各種工具來處理並生成各種目標環境的make文件。您可以使用文本編輯器查看該文件。裡面的信息還是很簡明的,包括構建目標,構建類型,源路徑,庫文件,頭文件等等信息。
Bld.inf:組件描述文件,它列出了一個組件當中包括的所有項目,還包括一些額外的構建指令。您也可以使用文本編輯器查看該文件。對於本實例來說,僅包括一個項目HelloWorld.mmp。
4、在命令行中輸入bldmake bldfiles
這個命令會處理當前目錄下的bld.inf文件,具體來說會執行以下處理過程
(1)、生成目錄C:\Symbian\8.0a\S60_2nd_FP2_SC\epoc32\BUILD\SYMBIAN\8.0A\S60_2ND_FP2_SC\SERIES60EX\HELLOWORLDBASIC
(2)、在這個目錄下,生成一系列的Make文件,針對各種目標環境。比如VC7.MAKE,CW_IDE.MAKE等等。
(3)、在當前目錄下生成abld.bat文件,這個文件會在隨後用到。您可以查看該文件的內容。但是建議不要手工的更改它的內容。
Bldmake命令也支持其他的命令行選項,您可以直接輸入bldmake來查看簡要的介紹,還可以查看SDK文檔了解詳細信息。
5、在命令行中輸入abld build wins
由bldmake處理bld.inf文件得到的abld.bat文件,使得abld命令可用。Abld.bat控制著構建一個項目的方方面面。Abld命令的語法非常地靈活,它擁有許多命令行選項,它們的組合涵蓋了各種構建需求。
注意:這里如果你被提示缺少了一個文件mspdb71.dll,那麼可以通過如下方法解決:在Microsoft Visual Studio .NET 2003的安裝目錄下。你可以在\Common7\IDE這個目錄下找到這個文件。把他拷貝到\Vc7\bin下就可以了。再次提醒前面的環境變數要設置好,否則這里你還會因為缺少link.exe而中止運行。
6、在命令行中輸入:epoc
這時模擬器就會出現。如果你的環境都設置正確的話,那麼模擬器中就會有你剛剛編譯的helloworld,它在模擬器上的名字是「HW」
五、檢查SDK和IDE是否兼容工作
1、重復上面的1-4
2、在命令行中輸入:makmake helloworldbasic vc7,這時會在group文件夾下生成一些文件,其中包含VS2003的工程文件HELLOWORLDBASIC.sln
3、打開VS2003,選擇「打開解決方案(Open Solution)」,打開HELLOWORLDBASIC.sln,然後進行編譯、運行,就會得到第四部分第6步中的效果。(運行的時候可能需要選擇程序epoc.exe)
Ⅱ 用ucos有什麼好處嗎
多任務,相當你同時在用多幾個單片機,可以用任務分解去寫代碼,更加簡單,更加穩定。
調試也容易。
Ⅲ C語言有什麼作用,編寫軟體或者游戲是用C語言編寫的嗎
我也是去年剛學完C語言的,這是一門非常基礎的編程語言,有許多的程序員都在用它編寫程序。至於你說的C++嘛,也是和C語言一樣性質的編程語言。編程語言還有許多,諸如Basic,java等等。當然他們的規則也是不同的,但是也有相同之處。
語法限制不太嚴格,程序設計自由度大。雖然C語言也是強類型語言,但它的語法比較靈活,允許程序編寫者有較大的自由度。允許直接訪問物理地址,對硬體進行操作。由於C語言允許直接訪問物理地址,可以直接對硬體進行操作,因此它既具有高級語言的功能,又具有低級語言的許多功能,能夠像匯編語言一樣對位、位元組和地址進行操作,而這三者是計算機最基本的工作單元,可用來寫系統軟體。生成目標代碼質量高,程序執行效率高。一般只比匯編程序生成的目標代碼效率低10へ20%。適用范圍大,可移植性好,C語言有一個突出的優點就是適合於多種操作系統,如DOS、UNIX、windows 98.windows NT;也適用於多種機型。C語言具有強大的繪圖能力,可移植性好,並具備很強的數據處理能力,因此適於編寫系統軟體,三維,二維圖形和動畫,它也是數值計算的高級語言。
缺點也有, C語言的缺點主要表現在數據的封裝性上,這一點使得C在數據的安全性上有很大缺陷,這也是C和C++的一大區別。C語言的語法限制不太嚴格,對變數的類型約束不嚴格,影響程序的安全性,對數組下標越界不作檢查等。從應用的角度,C語言比其他高級語言較難掌握。
像電腦游戲或者手機游戲其他編程語言都可以編寫,只是有難易繁簡之分罷了。
總之c語言是基礎,一定要重視!!!!!因為我們班現在學數據結構就受C語言之苦!還兼學java語言,痛煞我也,如何道哉!
最後,不要指望什麼語言都通,學精一門勝過樣樣疏鬆啊!兄台!
求加分!
Ⅳ 為什麼說操作系統ucos是實時的ucos是多任務的
白話一點解釋一下,希望納大能幫助你:
實時:指OS能夠滿足用戶根據需求所設計的切換時機和切換延時的要求。任意時刻,你希望你的系統里嫌茄模,哪一個事務最應該被優先處理?如果ucOS能滿足你的要求(通過你對任務的合理設計),那麼就可以說他是實時的OS。
使用ucOS構建系統時,你的所有用戶事務(需要做的事情)可以被劃分到多個任務里,ucOS可以根據你的實際設計,按優先順序調度他們(協調該先執行哪一個任務,並立即執行),芹緩這就可以說,ucOS是多任務了。
Ⅳ ucos-ii是怎樣移植到Keil C上的
在移植的時候 盡量保證得到的源代碼改動最少
並且調試方便 而且目錄結構分類清晰
網上的各明滾個項目都有如下特點:
1:一來就吭哧吭哧修改頭文件,每個文件都#include "includes.h"
2: ucos和其他文件 或者放在一個文件夾 或者在項目裡面不管3721都加上
跳來跳去頭都是大的 而且調試的時候出些莫名其妙的問題:比如賀扮
設不了斷點 或者調試無法進入c文件等等
我的設想:前提 得到ucos2.84
1: 改動盡量少 即不按常規修改裡面的#include "includes.h"等
ucos說放哪裡我們就放哪裡
2: 項目結構和文件存放結構合理,該有的有 不該有的就沒有
3: 調試時編譯器不會出現怪問題
4: 文檔盡量清楚 每處和每步小小的修改都要說明
建議最開始看完 楊屹 大蝦的文章
[裡面的os_cfg_r.h->改成os_cfg.h] 至此,是ucos裡面的[第一處修改]
1: 建立項目文件 拷貝原始文件 整理文件夾
目錄如下:
FirstVersion: 根目錄 project.uv就放下面
-ucos : 拷貝ucos2.83源代碼和os_cpu_a.a51 等凡是ucos相關的到下面 去掉只讀和存檔屬性 自己加一個app_cfg.h(ucos2.83增
加的) 裡面內容是#include <reg51.h>嘿嘿
-output:
項目設置:
-SourceGroup
->STARTUP.A51 main.c
--ucos
->os_task.c os_core.c
2: 設置
1: Target1 -> options->output和Listing裡面點"Select Folder for Objects" 改為\output
2: Target1->options -> C51和A51裡面的 Include Paths->加入ucos
4: Target1 -> options->Target的MemoryModel和CodeRomSize都用Large
編譯: 有四個警告 'OSIntCtxSw': missing function-prototype
'OSStartHighRdy': missing function-prototype
'OSCtxSw': missing function-prototype
UCOS\OS_CORE.C(1356): warning C275: expression with possibly no effect
第四個警告是由於OS_TaskIdle()裡面
(void)p_arg; /* Prevent compiler warning for not using 'parg' */
沒有起到作用 改成p_arg = p_arg;即可。 至此,是在ucos裡面的[第二處修改]
3:加入 OS_CPU_C.C 不要問這個文件哪裡來的 地球人都知道
在不管它通不通前 還有修改
1: 最前面保持跟其他.c文件一致 加入
#ifndef OS_MASTER_FILE
#include <ucos_ii.h>
#endif
2:加入若干個激拍余函數的函數體 大體都是帶"hook"的, 這些個函數只在ucos_ii.h有個聲明,但由於只有頭文件有定義沒有函數體 ,keil會
把它編譯成LJMP STARTUP1的語句。知道有什麼後果了吧
注意#if的條件頭文件和c文件要一致
在這里感覺ucos是不是搞了點」技術處理「?反正n個函數頭文件和c文件的#if條件不一致
一不小心會造成LJMP STARTUP1! 注意把os_core.c ucos_ii.h和os_cpu_c裡面都要改完
至此,是在ucos裡面的[第三處修改] 要改的地方還不少
//in ucos_ii.h
#if OS_CPU_HOOKS_EN
void OSInitHookBegin (void);
void OSInitHookEnd (void);
void OSTCBInitHook (OS_TCB *ptcb);
void OSTaskCreateHook (OS_TCB *ptcb);
void OSTaskDelHook (OS_TCB *ptcb);
void OSTaskStatHook (void);
void OSTaskIdleHook (void);
#endif
#if OS_TASK_SW_HOOK_EN
void OSTaskSwHook (void);
#endif
#if OS_TIME_TICK_HOOK_EN
void OSTimeTickHook (void);
#endif
4: 現在開始改OS_CPU_C.C裡面的函數
將OSTaskStkInit()改成跟ucos_ii.h裡面一樣。具體就是原來裡面yy大蝦的函數是
void *OSTaskStkInit (void (*task)(void *pd), void *ppdata, void *ptos, INT16U opt)
總之網上各個版本都是ppdata..呵呵 。ucos2.83裡面用的是p_arg.我們把它修改成
OS_STK *OSTaskStkInit (void (*task)(void *p_arg) ,
void *p_arg,
OS_STK *ptos,
INT16U opt)
編譯能通過 先不管運行起來對不對
5: 在ucos組裡面加入os_cpu_a.a51 不要問這個文件哪裡來的 地球人都知道
編譯 會出現錯誤: *** ERROR L102: EXTERNAL ATTRIBUTE MISMATCH
這是因為os_cpu_a.a51裡面
EXTRN IDATA (OSTCBHighRdy)
EXTRN IDATA (OSRunning)
EXTRN IDATA (OSPrioCur)
EXTRN IDATA (OSPrioHighRdy)
對引用的外部變數作了idata的定義,而ucos_ii.h裡面沒有
在這里 os_cpu.h裡面 先增加一個#define DATATYPE_1 idata
在ucos_ii.h找到這四個變數 增加idata定義 至此,是在ucos裡面的[第三處修改]
編譯能通過
6:在ucos_ii.h裡面
#if 0
void OSStartHighRdy (void);
void OSIntCtxSw (void);
void OSCtxSw (void);
#endif
這就是造成上面的其中三個編譯警告的原因 既然ucos2.83裡面有說
* IMPORTANT: These prototypes MUST be placed in OS_CPU.H
那麼我們就把它們placed in OS_CPU.H
不改動原來的代碼 只
void OSStartHighRdy (void);
void OSIntCtxSw (void);
void OSCtxSw (void);
到os_cpu.h裡面 再編譯 現在就只有
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS的警告了
Program Size: data=84.0 xdata=2348 code=8721 //keil 8.06
至此 整個框架就搭起來了 下面就來慢慢對付OSTaskStkInit()這個函數
gogogo!!!!!!!!!!!!!!!!!!
1: os_cfg.h裡面先 disable掉
OS_DEBUG_EN OS_FLAG_EN OS_MBOX_EN OS_MEM_EN OS_MUTEX_EN OS_Q_EN OS_SEM_EN
等等等等
題外話: 做一個Configuration Wizard的OS_CFG.H 這下方便多了 。這可是個體力活! 嘿嘿
也不違背了不改動原始文件的初衷
開始go了。建立最簡單的一個東西
#include <ucos_ii.h>
void main(void)
{
OSInit();
OSStart();
}
發現走到os_cpu_a.a51裡面的
OSStartHighRdy:
USING 0 ;上電後51自動關中斷,此處不必用CLR EA指令,因為到此處還未開中斷,本程序退出後,開中斷。
LCALL _?OSTaskSwHook --》一call就call復位了 我靠
搗鼓了下建一個os_cpu_a.c 加入工程 且右鍵的options->Generate Assembleer SRC File打勾
內容為
#ifndef OS_MASTER_FILE
#include <ucos_ii.h>
#endif
void OSStartHighRdy(void) {
OSTaskSwHook();
} 看了看 生成的東西是這樣的
?PR?OSStartHighRdy?OS_CPU_A SEGMENT CODE
EXTRN CODE (OSTaskSwHook)
PUBLIC OSStartHighRdy
RSEG ?PR?OSStartHighRdy?OS_CPU_A
OSStartHighRdy:
USING 0
LJMP OSTaskSwHook
END
簡直莫名其妙 於是 將os_cpu_a.a51改成
;EXTRN CODE (_?OSTaskSwHook)
EXTRN CODE (OSTaskSwHook) ;keil8.06 <-----改這里
;子程序
;-------------------------------------------------------------------------
RSEG ?PR?OSStartHighRdy?OS_CPU_A
OSStartHighRdy:
USING 0 ;上電後51自動關中斷,此處不必用CLR EA指令,因為到此處還未開中斷,本程序退出後,開中斷。
;LCALL _?OSTaskSwHook
LCALL OSTaskSwHook <-----改這里
再測試 ok 能進入OSIdleStask 並在裡面循環 看來是c和匯編連接的一些問題 先把它放一邊以後解決 [待解決的問題2]繼續測試
這里又想到個問題 萬一#define OS_TASK_SW_HOOK_EN 0 那麼OSTaskSwHook()就不被編譯。
在匯編裡面調用會不會又復位?keil這點太……[不知道哪裡可以設置 待解決的問題2],
測試了下 果然復位 我靠!作個說明「如果用keil,那麼OS_TASK_SW_HOOK_EN 一定要為1
好了 就算第一步測試搞定 現在來做個」笨活路「 給所有的函數加上reentrant! 內部的static就不用了。
現在開始調試serial 將yy大蝦的serial.c搞過來 加入工程
1: 看到匯編和c混合頭都是大的 把
#pragma asm
push IE
EA = 0;
之類的東東全部改成 _push_(IE); EA = 0;嘿嘿 當然不要忘記在app_cfg.h加#include <intrins.h>
現在有:
#include <ucos_ii.h>
void Task1(void *p_arg) keilReentrant;
void Task2(void *p_arg) keilReentrant;
void Task3(void *p_arg) keilReentrant;
OS_STK Task1Stack[MaxStkSize];//注意:我在ASM文件中設置?STACK空間為40H即64。
OS_STK Task2Stack[MaxStkSize];
OS_STK Task3Stack[MaxStkSize];
void main(void)
{
unsigned char ucReturn;
OSInit();
OSInitTimer0(); //也就是原來的InitTimer0();
InitSerial();
InitSerialBuffer();
ucReturn = OSTaskCreate(Task1, (void *)0, &Task1Stack[0] ,2);
ucReturn = OSTaskCreate(Task2, (void *)0, &Task2Stack[0] ,3);
ucReturn = OSTaskCreate(Task3, (void *)0, &Task3Stack[0] ,4);
OSStart();
}
void Task1(void *p_arg) keilReentrant
{
p_arg = p_arg;
ET0=1;
for(;;){
//PrintStr("Task 1 is active. \n");
OSTimeDly(3*OS_TICKS_PER_SEC);
}
}
void Task2(void *p_arg) keilReentrant
{
p_arg = p_arg;
for(;;){
PrintStr("Task 2 is active. \n");
OSTimeDly(2*OS_TICKS_PER_SEC);
}
}
void Task3(void *p_arg) keilReentrant
{
p_arg = p_arg;
for(;;){
PrintStr("Task 3 is active. \n");
OSTimeDly(3*OS_TICKS_PER_SEC);
}
}
運行 我靠 怎麼就顯示"Task 1 is active" 任務不切換 ?為啥。
原來os_time.c還沒有加到項目裡面去(因為這個項目沒有把
ucos_ii.c加入項目);OSTimeDly()哪裡會工作
加進去,運行->OK
OS_timr 把OS_Timr.c加入 並打開en的開關編譯的時候會出現err。原因是回調函數參數太多的問題
解決方法見 http://www.keil.com/support/docs/2066.htm
在ucos-ii.h裡面
/* add keilReentrant to to solve the Error 212: Indirect call: Parameters do not fit within registers */
typedef void (*OS_TMR_CALLBACK)(void *ptmr, void *parg) reentrant ;
附加一點就是項目裡面直接加如.a文件 不用在include c51L.lib
然後加入一個lcd的驅動 呵呵很簡單1602的。前提就是盡量不修改ucos的變數 函數名稱和調用方式等
詳細見工程。調試通過 不過是在proteus裡面。在這里感謝jjj www.proteus.com.cn
記得因為lcd.c裡面用到了sempost函數 所以如果要用就必須把OS_MAX_EVENTS 算進去,在你原來的設定值加一
到此 新鮮的ucos2.84出爐了。奉獻此身體給大家。想來想去 唯一的賣點就是寫了點細節,二是改了個os_cfg.h...呵呵
打包文件在下 ! 只有文檔的兄台也不用發mail給我 自己網上找去 應該有下
熊偉 於大年初一 深圳 [email protected] jdsu光電
version2:
不知道怎麼回事,一到 LCALL OSTaskSwHook --》一call就call復位了 我靠
又改回來 LCALL _?OSTaskSwHook 又好了
想了想 是不是我又加了.a文件的原因?
因為後來我又加了一個INT0Function.c 和INT0Function_a.a51
void Int0Function() keilReentrant
{ //中斷在匯編中實現,去掉interrupt {//INT0中斷服務子程序
}
#include <include_a.h>
NAME INT0FUNCTION_A ;模塊名
?PR?_?INTOFunction?INT0FUNCTION_A SEGMENT CODE
EXTRN CODE (_?INTOFunction)
;-------------------------------------------------------------------------
CSEG AT 0013H ;INT0中斷
LJMP INT0ISR ;工作於系統態,無任務切換。
RSEG ?PR?_?INTOFunction?INT0FUNCTION_A
INT0ISR:
USING 0
CLR EA ;先關中斷,以防中斷嵌套。
PUSHALL
LCALL _?INTOFunction
POPALL
SETB EA
RETI
;-------------------------------------------------------------------------
END
;-------------------------------------------------------------------------