keil5怎么把別人的文件改為自己的

keil5怎么把別人的文件改為自己的

格式1、首先打開軟件keil5并點(diǎn)擊左上方的文件。2、其次在彈出的界面中選擇新建工程,選擇文件導(dǎo)入。

3、**在導(dǎo)入的文件名那里更改文件的后綴即可更改文件格式。

?win10 keil MDK5 在桌面是的文件無(wú)法保存如果是指?jìng)€(gè)人文件夾的話就在桌面右鍵–個(gè)性化–左上角點(diǎn)更改桌面圖標(biāo)—然后把“用戶的文件”前面的鉤打上–確定保存好桌面上就有了!keil5使用教程是怎么樣的?1、先建立一個(gè)工程,點(diǎn)擊Project,選擇**個(gè),建立新工程,給個(gè)名字,點(diǎn)擊確定,出現(xiàn)如下界面。2、選擇Atmel,找到AT89C51選中后,出現(xiàn)另一個(gè)界面。3、此時(shí)窗口左側(cè)出現(xiàn)工程欄,如果沒出現(xiàn),點(diǎn)擊工具欄中“iew”擇第三個(gè)”roject Window后即可出現(xiàn),此時(shí)工程已建立好。4、然后在工程中創(chuàng)建項(xiàng)目,操作如圖所示,給項(xiàng)目添加一個(gè)名字,注意,如果項(xiàng)目用C語(yǔ)言寫,則項(xiàng)目名后家“C”,如是C++寫的項(xiàng)目,則在名字后加“Cpp”。

5、接著就可以在窗口寫程序了,寫完后點(diǎn)擊窗口左上角的”build\”和\”rebuild“按鈕進(jìn)行編譯,觀察下面的“project output”,無(wú)錯(cuò)誤則編譯完成。6、要想燒寫程序,還需要生產(chǎn)HEX文件,具體做法是點(diǎn)擊”option for target“按鈕,進(jìn)入界面,選擇”O(jiān)utput”選中“Creat HEX file“即可。Keil C51是美國(guó)Keil Software公司出品的51系列兼容單片機(jī)C語(yǔ)言軟件開發(fā)系統(tǒng),與匯編相比,C語(yǔ)言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢(shì),因而易學(xué)易用。

Keil提供了包括C編譯器、宏匯編、鏈接器、庫(kù)管理和一個(gè)功能強(qiáng)大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個(gè)集成開發(fā)環(huán)境(μVision)將這些部分組合在一起。運(yùn)行Keil軟件需要WIN98、NT、WIN2000、WINXP等操作系統(tǒng)。如果你使用C語(yǔ)言編程,那么Keil幾乎就是你的不二之選,即使不使用C語(yǔ)言而僅用匯編語(yǔ)言編程,其方便易用的集成環(huán)境、強(qiáng)大的軟件仿真調(diào)試工具也會(huì)令你事半功倍。

keil5使用教程1、先建立一個(gè)工程,點(diǎn)擊Project,選擇**個(gè),建立新工程,給個(gè)名字,點(diǎn)擊確定,出現(xiàn)如下界面。2、選擇Atmel,找到AT89C51選中后,出現(xiàn)另一個(gè)界面。3、此時(shí)窗口左側(cè)出現(xiàn)工程欄,如果沒出現(xiàn),點(diǎn)擊工具欄中“iew”擇第三個(gè)”roject Window后即可出現(xiàn),此時(shí)工程已建立好。

4、然后在工程中創(chuàng)建項(xiàng)目,操作如圖所示,給項(xiàng)目添加一個(gè)名字,注意,如果項(xiàng)目用C語(yǔ)言寫,則項(xiàng)目名后家“C”,如是C++寫的項(xiàng)目,則在名字后加“.Cpp”。5、接著就可以在窗口寫程序了,寫完后點(diǎn)擊窗口左上角的”build\”和\”rebuild“按鈕進(jìn)行編譯,觀察下面的“project output”,無(wú)錯(cuò)誤則編譯完成。6、要想燒寫程序,還需要生產(chǎn)HEX文件,具體做法是點(diǎn)擊”option for target“按鈕,進(jìn)入界面,選擇”O(jiān)utput”選中“Creat HEX file“即可。參考資料來(lái)源:百度百科-keilkeil怎么生成hex文件keil生成hex文件可以在軟件中設(shè)置后導(dǎo)出,具體辦法如下:1、打開已寫好的工程項(xiàng)目,可通過雙擊工程項(xiàng)目打開,也可以在keil中,菜單欄的Project-OpenProject…找到項(xiàng)目后進(jìn)行打開。

2、點(diǎn)擊菜單Project–OptionstoFile,進(jìn)入到選擇對(duì)話框中。3、在Optionsfortarget對(duì)話框中,切換到target欄中,輸入與自己實(shí)際使用晶振的頻率。4、切換到output欄中,點(diǎn)擊SecletFolderObjects,可以設(shè)置生成HEX文件的目錄,如果不設(shè)置默認(rèn)為與源代碼同一目錄下。5、切換到output欄中,勾選CreateHEXfile選項(xiàng),并點(diǎn)擊確定。

6、依次點(diǎn)擊工具欄中的編譯、構(gòu)建,重構(gòu)建,提示無(wú)警告錯(cuò)誤后,就可以在提示中看到。creatinghexfilefrom\”.\\obj\\****\”…代表已生成HEX文件。7、**在目錄下的obj文件夾中就能看到生成的HEX文件。

ucos-ii是怎樣移植到Keil C上的?

在移植的時(shí)候 盡量保證得到的源代碼改動(dòng)最少 并且調(diào)試方便 而且目錄結(jié)構(gòu)分類清晰網(wǎng)上的各個(gè)項(xiàng)目都有如下特點(diǎn): 1:一來(lái)就吭哧吭哧修改頭文件,每個(gè)文件都#include \”includes.h\” 2: ucos和其他文件 或者放在一個(gè)文件夾 或者在項(xiàng)目里面不管3721都加上 跳來(lái)跳去頭都是大的 而且調(diào)試的時(shí)候出些莫名其妙的問題:比如 設(shè)不了斷點(diǎn) 或者調(diào)試無(wú)法進(jìn)入c文件等等我的設(shè)想:前提 得到ucos2.84 1: 改動(dòng)盡量少 即不按常規(guī)修改里面的#include \”includes.h\”等 ucos說放哪里我們就放哪里 2: 項(xiàng)目結(jié)構(gòu)和文件存放結(jié)構(gòu)合理,該有的有 不該有的就沒有 3: 調(diào)試時(shí)編譯器不會(huì)出現(xiàn)怪問題 4: 文檔盡量清楚 每處和每步小小的修改都要說明建議最開始看完 楊屹 大蝦的文章[里面的os_cfg_r.h->改成os_cfg.h] 至此,是ucos里面的[**處修改]1: 建立項(xiàng)目文件 拷貝原始文件 整理文件夾目錄如下: FirstVersion: 根目錄 project.uv就放下面 -ucos : 拷貝ucos2.83源代碼和os_cpu_a.a51 等凡是ucos相關(guān)的到下面 去掉只讀和存檔屬性 自己加一個(gè)app_cfg.h(ucos2.83增加的) 里面內(nèi)容是#include <reg51.h>嘿嘿 -output: 項(xiàng)目設(shè)置: -SourceGroup ->STARTUP.A51 main.c –ucos ->os_task.c os_core.c2: 設(shè)置 1: Target1 -> options->output和Listing里面點(diǎn)\”Select Folder for Objects\” 改為\\output 2: Target1->options -> C51和A51里面的 Include Paths->加入ucos 4: Target1 -> options->Target的MemoryModel和CodeRomSize都用Large編譯: 有四個(gè)警告 \’OSIntCtxSw\’: missing function-prototype \’OSStartHighRdy\’: missing function-prototype \’OSCtxSw\’: missing function-prototype UCOS\\OS_CORE.C(1356): warning C275: expression with possibly no effect 第四個(gè)警告是由于OS_TaskIdle()里面 (void)p_arg; /* Prevent compiler warning for not using \’parg\’ */ 沒有起到作用 改成p_arg = p_arg;即可。 至此,是在ucos里面的[第二處修改]3:加入 OS_CPU_C.C 不要問這個(gè)文件哪里來(lái)的 地球人都知道 在不管它通不通前 還有修改 1: 最前面保持跟其他.c文件一致 加入#ifndef OS_MASTER_FILE#include <ucos_ii.h>#endif2:加入若干個(gè)函數(shù)的函數(shù)體 大體都是帶\”hook\”的, 這些個(gè)函數(shù)只在ucos_ii.h有個(gè)聲明,但由于只有頭文件有定義沒有函數(shù)體 ,keil會(huì)把它編譯成LJMP STARTUP1的語(yǔ)句。

知道有什么后果了吧注意#if的條件頭文件和c文件要一致 在這里感覺ucos是不是搞了點(diǎn)”技術(shù)處理“?反正n個(gè)函數(shù)頭文件和c文件的#if條件不一致一不小心會(huì)造成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_ENvoid OSTimeTickHook (void);#endif 4: 現(xiàn)在開始改OS_CPU_C.C里面的函數(shù) 將OSTaskStkInit()改成跟ucos_ii.h里面一樣。

具體就是原來(lái)里面yy大蝦的函數(shù)是void *OSTaskStkInit (void (*task)(void *pd), void *ppdata, void *ptos, INT16U opt) 總之網(wǎng)上各個(gè)版本都是ppdata..呵呵 。ucos2.83里面用的是p_arg.我們把它修改成OS_STK *OSTaskStkInit (void (*task)(void *p_arg) , void *p_arg, OS_STK *ptos, INT16U opt) 編譯能通過 先不管運(yùn)行起來(lái)對(duì)不對(duì)5: 在ucos組里面加入os_cpu百科_a.a51 不要問這個(gè)文件哪里來(lái)的 地球人都知道編譯 會(huì)出現(xiàn)錯(cuò)誤: *** ERROR L102: EXTERNAL ATTRIBUTE MISMATCH 這是因?yàn)閛s_cpu_a.a51里面 EXTRN IDATA (OSTCBHighRdy) EXTRN IDATA (OSRunning) EXTRN IDATA (OSPrioCur) EXTRN IDATA (OSPrioHighRdy) 對(duì)引用的外部變量作了idata的定義,而ucos_ii.h里面沒有在這里 os_cpu.h里面 先增加一個(gè)#define DATATYPE_1 idata在ucos_ii.h找到這四個(gè)變量 增加idata定義 至此,是在ucos里面的[第三處修改]編譯能通過6:在ucos_ii.h里面#if 0void OSStartHighRdy (void);void OSIntCtxSw (void);void OSCtxSw (void);#endif這就是造成上面的其中三個(gè)編譯警告的原因 既然ucos2.83里面有說* IMPORTANT: These prototypes MUST be placed in OS_CPU.H那么我們就把它們placed in OS_CPU.H 不改動(dòng)原來(lái)的代碼 只copyvoid OSStartHighRdy (void);void OSIntCtxSw (void);void OSCtxSw (void); 到os_cpu.h里面 再編譯 現(xiàn)在就只有*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS的警告了Program Size: data=84.0 xdata=2348 code=8721 //keil 8.06至此 整個(gè)框架就搭起來(lái)了 下面就來(lái)慢慢對(duì)付OSTaskStkInit()這個(gè)函數(shù)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 等等等等 題外話: 做一個(gè)Configuration Wizard的OS_CFG.H 這下方便多了 。這可是個(gè)體力活! 嘿嘿 也不違背了不改動(dòng)原始文件的初衷開始go了。建立最簡(jiǎn)單的一個(gè)東西#include <ucos_ii.h>void main(void){ OSInit(); OSStart();}發(fā)現(xiàn)走到os_cpu_a.a51里面的OSStartHighRdy: USING 0 ;上電后51自動(dòng)關(guān)中斷,此處不必用CLR EA指令,因?yàn)榈酱颂庍€未開中斷,本程序退出后,開中斷。

LCALL _?OSTaskSwHook –》一call就call復(fù)位了 我靠搗鼓了下建一個(gè)os_cpu_a.c 加入工程 且右鍵的options->Generate Assembleer SRC File打勾內(nèi)容為#ifndef OS_MASTER_FILE#include <ucos_ii.h>#endif void OSStartHighRdy(void) { OSTaskSwHook(); } 看了看 生成的東西是這樣的 ?PR?OSStartHighRdy?OS_CPU_A SEGMENT CODE EXTRN CODE (OSTaskSwHook) PUBLIC OSStartHighRdyRSEG ?PR?OSStartHighRdy?OS_CPU_AOSStartHighRdy: USING 0 LJMP OSTaskSwHook END簡(jiǎn)直莫名其妙 于是 將os_cpu_a.a51改成 ;EXTRN CODE (_?OSTaskSwHook) EXTRN CODE (OSTaskSwHook) ;keil8.06 <—–改這里;子程序;————————————————————————- RSEG ?PR?OSStartHighRdy?OS_CPU_AOSStartHighRdy: USING 0 ;上電后51自動(dòng)關(guān)中斷,此處不必用CLR EA指令,因?yàn)榈酱颂庍€未開中斷,本程序退出后,開中斷。 ;LCALL _?OSTaskSwHook LCALL OSTaskSwHook <—–改這里再測(cè)試 ok 能進(jìn)入OSIdleStask 并在里面循環(huán) 看來(lái)是c和匯編連接的一些問題 先把它放一邊以后解決 [待解決的問題2]繼續(xù)測(cè)試 這里又想到個(gè)問題 萬(wàn)一#define OS_TASK_SW_HOOK_EN 0 那么OSTaskSwHook()就不被編譯。在匯編里面調(diào)用會(huì)不會(huì)又復(fù)位?keil這點(diǎn)太……[不知道哪里可以設(shè)置 待解決的問題2],測(cè)試了下 果然復(fù)位 我靠!作個(gè)說明“如果用keil,那么OS_TASK_SW_HOOK_EN 一定要為1好了 就算**步測(cè)試搞定 現(xiàn)在來(lái)做個(gè)”笨活路“ 給所有的函數(shù)加上reentrant! 內(nèi)部的static就不用了。

現(xiàn)在開始調(diào)試serial 將yy大蝦的serial.c搞過來(lái) 加入工程1: 看到匯編和c混合頭都是大的 把#pragma a** push IE EA = 0;之類的東東全部改成 _push_(IE); EA = 0;嘿嘿 當(dāng)然不要忘記在app_cfg.h加#include <intrins.h>現(xiàn)在有:#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文件中設(shè)置?STACK空間為40H即64。OS_STK Task2Stack[MaxStkSize];OS_STK Task3Stack[MaxStkSize];void main(void){ unsigned char ucReturn; OSInit(); OSInitTimer0(); //也就是原來(lái)的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); }}運(yùn)行 我靠 怎么就顯示\”Task 1 is active\” 任務(wù)不切換 ?為啥。原來(lái)os_time.c還沒有加到項(xiàng)目里面去(因?yàn)檫@個(gè)項(xiàng)目沒有把ucos_ii.c加入項(xiàng)目);OSTimeDly()哪里會(huì)工作加進(jìn)去,運(yùn)行->OKOS_timr 把OS_Timr.c加入 并打開en的開關(guān)編譯的時(shí)候會(huì)出現(xiàn)err。

原因是回調(diào)函數(shù)參數(shù)太多的問題解決方法見 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 ; 附加一點(diǎn)就是項(xiàng)目里面直接加如.a文件 不用在include c51L.lib然后加入一個(gè)lcd的驅(qū)動(dòng) 呵呵很簡(jiǎn)單1602的。前提就是盡量不修改ucos的變量 函數(shù)名稱和調(diào)用方式等詳細(xì)見工程。調(diào)試通過 不過是在proteus里面。

在這里感謝jjj www.proteus.com.cn 記得因?yàn)閘cd.c里面用到了sempost函數(shù) 所以如果要用就必須把OS_MAX_EVENTS 算進(jìn)去,在你原來(lái)的設(shè)定值加一到此 新鮮的ucos2.84出爐了。奉獻(xiàn)此身體給大家。想來(lái)想去 **的賣點(diǎn)就是寫了點(diǎn)細(xì)節(jié),二是改了個(gè)os_cfg.h…呵呵打包文件在下 ! 只有文檔的兄臺(tái)也不用發(fā)mail給我 自己網(wǎng)上找去 應(yīng)該有下 熊偉 于大年初一 深圳 xiongxiaowei@126.com jdsu光電version2: 不知道怎么回事,一到 LCALL OSTaskSwHook –》一call就call復(fù)位了 我靠 又改回來(lái) LCALL _?OSTaskSwHook 又好了 想了想 是不是我又加了.a文件的原因?因?yàn)楹髞?lái)我又加了一個(gè)INT0Function.c 和INT0Function_a.a51void Int0Function() keilReentrant{ //中斷在匯編中實(shí)現(xiàn),去掉interrupt {//INT0中斷服務(wù)子程序}#include <include_a.h>NAME INT0FUNCTION_A ;模塊名?PR?_?INTOFunction?INT0FUNCTION_A SEGMENT CODEEXTRN CODE (_?INTOFunction);————————————————————————- CSEG AT 0013H ;INT0中斷 LJMP INT0ISR ;工作于系統(tǒng)態(tài),無(wú)任務(wù)切換。 RSEG ?PR?_?INTOFunction?INT0FUNCTION_A INT0ISR: USING 0 CLR EA ;先關(guān)中斷,以防中斷嵌套。

Keil中的工程移植到IAR中需要做哪些修改?

電子產(chǎn)品設(shè)計(jì)階段的成本控制盡量使用各種EDA(電子設(shè)計(jì)自動(dòng)化)工具。綜合使用各種EDA工具來(lái)完成設(shè)計(jì),可以大幅度加快開發(fā)進(jìn)度,減少差錯(cuò),提高工程質(zhì)量。

一提起EDA工具很多人就會(huì)想起Protel、Orcad、Pads等電路板布線軟件。

其實(shí)這些工具不僅包含原理圖和電路板布線,一般也包含了可編程邏輯器件(PLD)設(shè)計(jì)、信號(hào)仿真等模塊,充分利用這些功能往往可以在設(shè)計(jì)階段就發(fā)現(xiàn)很多構(gòu)思和圖紙上的缺陷。對(duì)減少設(shè)計(jì)階段的返工和修改有事半功倍的效果。此外,還有一些別的種類的軟件,雖然不是專門的電子設(shè)計(jì)軟件,但我們依然可以借用。比如:如果項(xiàng)目中包含了復(fù)雜一些的數(shù)學(xué)算法(如模糊邏輯和人工神經(jīng)元算法等),我們還可以動(dòng)用專門的數(shù)學(xué)CAD軟件――MATLAB先仿真一下你的信號(hào)處理流程,然后根據(jù)仿真的結(jié)果來(lái)設(shè)計(jì)相關(guān)的硬件和軟件。

就節(jié)約了很多在目標(biāo)機(jī)上反復(fù)寫片、反復(fù)調(diào)試算法的時(shí)間。在設(shè)計(jì)電路的時(shí)候,修改硬件在所難免。為了便于電路修改,要注意電路的可塑性。

電路的可塑性是指電路的可修改能力。如果電路便于修改,會(huì)減少很多開發(fā)人員更改電路的低級(jí)勞動(dòng)。提高電路的可塑性一般有以下幾種方法:1. 能夠使用軟件實(shí)現(xiàn)的功能不要用硬件實(shí)現(xiàn)。

由于硬件和軟件的物理結(jié)構(gòu)的差異,在修改硬件的時(shí)候要付出比軟件多得多的代價(jià)。用軟件代替硬件后還能降低產(chǎn)成品的成本,便于批量生產(chǎn)和銷售。2. 如果電路中有CMOS、TTL電路要盡量使用PLD(可編程邏輯器件)來(lái)實(shí)現(xiàn),因?yàn)镻LD本身具有可修改的特性。

用它們實(shí)現(xiàn)數(shù)字邏輯后,要改變邏輯關(guān)系的時(shí)候,只要在計(jì)算機(jī)上修改它們的邏輯描述文件,然后經(jīng)過編譯、寫片就得到一片新的邏輯關(guān)系的集成電路。就像修改軟件一樣容易。用PLD代替不同的普通數(shù)字集成電路后,有利于減少元器件種類。方便采購(gòu)和庫(kù)存管理。

3. 試制過程中適當(dāng)在電路板上多留一些資源,比如PLD的容量要比你預(yù)期的容量稍大一些,單片機(jī)的ROM、RAM、I/O端口等資源都要留適當(dāng)?shù)目沼唷R驗(yàn)樵谠O(shè)計(jì)過程中隨時(shí)會(huì)有很多不可預(yù)見的情況發(fā)生,解決這些問題,通常會(huì)增加對(duì)硬件資源的需求量。如果沒有在電路板上保留適當(dāng)?shù)娜哂噘Y源,將不得不在電路板外面再搭一塊小電路板。事實(shí)證明,這樣修改電路不僅容易給電路引入干擾信號(hào),而且會(huì)大幅度降低試制樣機(jī)的可靠性,同時(shí)會(huì)使技術(shù)人員的很多時(shí)間花費(fèi)在反復(fù)修改電路的簡(jiǎn)單勞動(dòng)上。

編寫單片機(jī)的軟件的時(shí)候,應(yīng)該盡量使用高級(jí)語(yǔ)言來(lái)編寫。現(xiàn)在許多開發(fā)單片機(jī)的技術(shù)人員依然保留了80年代的開發(fā)方法。使用匯編語(yǔ)言,逐條指令編寫,并且手工分配單片機(jī)中的內(nèi)存資源。這種方法在寫小規(guī)模軟件還可以,可一旦軟件規(guī)模變大之后,由于匯編語(yǔ)言的低可讀性、低結(jié)構(gòu)性往往會(huì)讓設(shè)計(jì)人員被自己軟件中的復(fù)雜的邏輯關(guān)系搞得暈頭轉(zhuǎn)向,在一個(gè)軟件的邏輯關(guān)系混亂后,要保證寫出來(lái)的軟件能安全運(yùn)轉(zhuǎn)是很困難的。

我們推薦使用C語(yǔ)言來(lái)寫軟件單片機(jī)代碼。(對(duì)于常見的8051系列,我們一般使用KEIL、FLANKLIN 等軟件。其它類型的單片機(jī)一般都有其配套的C語(yǔ)言編譯器,該型號(hào)單片機(jī)的經(jīng)銷商一般可提供)用C語(yǔ)言有這么幾個(gè)好處:1. 可以大幅度加快開發(fā)進(jìn)度。

2. 可以實(shí)現(xiàn)軟件的結(jié)構(gòu)化編程,它使得軟件的邏輯結(jié)構(gòu)變得清晰、有條理。3. 在寫一些數(shù)學(xué)算法和循環(huán)、判斷語(yǔ)句的時(shí)候有比匯編語(yǔ)言高得多的效率。4. 省去了人工分配內(nèi)存資源的工作,在匯編語(yǔ)言中我們不得不為每一個(gè)子程序來(lái)分配儲(chǔ)存變量的空間,這是一個(gè)復(fù)雜、乏味又容易出差錯(cuò)的工作。

而使用C語(yǔ)言后你只要在代碼中申明一下變量的類型,編譯器就會(huì)自動(dòng)為你分配寄存器和內(nèi)存,低級(jí)重復(fù)易出差錯(cuò)的事情都由計(jì)算機(jī)代勞了。根本不要人工干預(yù)。5. 因?yàn)檠h(huán)、判斷語(yǔ)句和變量名字都使用自然語(yǔ)言,因此寫出來(lái)代碼的可維護(hù)性和軟件可讀性很好。這樣當(dāng)需要更換軟件開發(fā)人員的時(shí)候,可以比較容易地進(jìn)行代碼移交和消化。

即使沒有更換人員,他們?cè)诰S護(hù)自己的代碼的時(shí)候也比較容易。6. 當(dāng)寫好了一個(gè)算法后,以后需要在不同種類的CPU上也需要這個(gè)算法時(shí),可以直接引用原來(lái)的代碼,再配合這種CPU專用的編譯器重新編譯就可以了。這樣可以實(shí)現(xiàn)軟件的低成本跨平臺(tái)移植。

而匯編語(yǔ)言在這種情況下,除了重新寫代碼,沒有別的辦法。因?yàn)镃語(yǔ)言的這種特性,如果在設(shè)計(jì)復(fù)雜算法時(shí)(比如視頻/音頻信號(hào)處理、模糊邏輯和人工神經(jīng)元算法等),可以在PC機(jī)上使用Visual C++、C++ Build等x86平臺(tái)的C語(yǔ)言編譯器設(shè)計(jì)、調(diào)試該算法的代碼,調(diào)試成功后就可以移植到單片機(jī)的軟件系統(tǒng)中去。由于PC機(jī)上有充足的系統(tǒng)資源,開發(fā)調(diào)試進(jìn)度會(huì)有大幅度的提高,這樣就節(jié)約了軟件的時(shí)間成本。7. 在團(tuán)體寫作的軟件中,軟件接口容易做到規(guī)范統(tǒng)一。

雖然使用C語(yǔ)言寫出來(lái)的代碼會(huì)比匯編語(yǔ)言所占用的空間要大5%~20%,但是由于半導(dǎo)體技術(shù)的發(fā)展,芯片的容量和速度有了大幅度的提高。在這種情況下,代碼占用的空間差異已經(jīng)不是很關(guān)鍵的了。相比之下,我們更應(yīng)該注重軟件是否可以長(zhǎng)期穩(wěn)定運(yùn)行的能力,注重使用先進(jìn)開發(fā)工具所帶來(lái)的時(shí)間成本的優(yōu)勢(shì)。

怎樣將IAR程序移植到keil5里

可以,IAR和KEIL只是編譯環(huán)境和編譯器的區(qū)別,只要程序本身沒問題,移植沒什么大問題。 因?yàn)榫幾g器不一樣,所以,都某些C語(yǔ)句的理解可能也不一樣,例如,沒有顯式說明的變量在使用時(shí)是按有符號(hào)數(shù)還是無(wú)符號(hào)數(shù)處理,這個(gè)可能引起邏輯上的錯(cuò)誤。

C語(yǔ)言函數(shù)庫(kù) 怎樣移植到嵌入式系統(tǒng)中 比如C的 數(shù)學(xué)函數(shù) 怎樣用在 keil4編譯器中

大多數(shù)嵌入式C編譯器都自帶標(biāo)準(zhǔn)C庫(kù)的,像數(shù)學(xué)函數(shù)這樣的庫(kù)keil里面是有的,你到keil的安裝目錄下去搜索下*.h;有很多庫(kù)頭文件。應(yīng)該是#include <math.h> 就可以用了;如果發(fā)現(xiàn)Link不過,就需要項(xiàng)目屬性去設(shè)置下,把庫(kù)包含進(jìn)來(lái)。

keil上一些平臺(tái)相關(guān)的庫(kù)需要做些接口移植才能使用,比如printf;平臺(tái)不相關(guān)的直接使用就是了。

keil5怎么**group文件

將插件包文件全部**。2、找到keil的整理項(xiàng)目文件目錄文件夾,并將其粘貼到此文件夾下。

3、打開keil安裝目錄文件夾,然后雙擊設(shè)置插件。

4、通過以上設(shè)置即可安裝好keil5代碼整理項(xiàng)目文件插件。