|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
原創(chuàng)-新鮮出爐的最詳盡說明ucos2.84 移植到51in keil |
| 作者:roguebear 欄目:嵌入式系統(tǒng) |
//原創(chuàng)-新鮮出爐的最詳盡說明ucos2.84portto51inkeil.txt 在移植的時候 盡量保證得到的源代碼改動最少 并且調(diào)試方便 而且目錄結(jié)構(gòu)分類清晰 網(wǎng)上的各個項目都有如下特點: 1:一來就吭哧吭哧修改頭文件,每個文件都#include "includes.h" 2: ucos和其他文件 或者放在一個文件夾 或者在項目里面不管3721都加上 跳來跳去頭都是大的 而且調(diào)試的時候出些莫名其妙的問題:比如 設(shè)不了斷點 或者調(diào)試無法進入c文件等等 我的設(shè)想:前提 得到ucos2.84 1: 改動盡量少 即不按常規(guī)修改里面的#include "includes.h"等 ucos說放哪里我們就放哪里 2: 項目結(jié)構(gòu)和文件存放結(jié)構(gòu)合理,該有的有 不該有的就沒有 3: 調(diào)試時編譯器不會出現(xiàn)怪問題 4: 文檔盡量清楚 每處和每步小小的修改都要說明 建議最開始看完 楊屹 大蝦的文章 [里面的os_cfg_r.h->改成os_cfg.h] 至此,是ucos里面的[第一處修改] 1: 建立項目文件 拷貝原始文件 整理文件夾 目錄如下: FirstVersion: 根目錄 project.uv就放下面 -ucos : 拷貝ucos2.83源代碼和os_cpu_a.a51 等凡是ucos相關(guān)的到下面 去掉只讀和存檔屬性 自己加一個app_cfg.h(ucos2.83增 加的) 里面內(nèi)容是#include <reg51.h>嘿嘿 -OUTPUT: 項目設(shè)置: -SourceGroup ->STARTUP.A51 main.c --ucos ->os_task.c os_core.c 2: 設(shè)置 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:加入若干個函數(shù)的函數(shù)體 大體都是帶"hook"的, 這些個函數(shù)只在ucos_ii.h有個聲明,但由于只有頭文件有定義沒有函數(shù)體 ,keil會 把它編譯成LJMP STARTUP1的語句。知道有什么后果了吧 注意#if的條件頭文件和c文件要一致 在這里感覺ucos是不是搞了點”技術(shù)處理“?反正n個函數(shù)頭文件和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: 現(xiàn)在開始改OS_CPU_C.C里面的函數(shù) 將OSTaskStkInit()改成跟ucos_ii.h里面一樣。具體就是原來里面yy大蝦的函數(shù)是 void *OSTaskStkInit (void (*task)(void *pd), void *ppdata, void *ptos, INT16U opt) 總之網(wǎng)上各個版本都是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 不要問這個文件哪里來的 地球人都知道 編譯 會出現(xiàn)錯誤: *** 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定 |
| 2樓: | >>參與討論 |
| 作者: roguebear 于 2007/2/20 9:43:00 發(fā)布:
附件在這里 ../uploadfile/200705151419265928.jpg |
|
| 3樓: | >>參與討論 |
| 作者: 桂電飛天鼠 于 2007/2/25 21:55:00 發(fā)布:
謝謝分享! 寫得非常詳細呀~~! 回學校試試! |
|
| 4樓: | >>參與討論 |
| 作者: roguebear 于 2007/12/27 17:28:54 發(fā)布:
帖子居然在這里找到了。。。 現(xiàn)在有了更新。。2.86 結(jié)構(gòu)調(diào)整了。不用在改那些內(nèi)容。直接copy就可以。待會傳上來 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |