roguebear 发表于 2007-2-20 09:39

原创-新鲜出炉的最详尽说明ucos2.84 移植到51in keil

//原创-新鲜出炉的最详尽说明ucos2.84portto51inkeil.txt<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;在移植的时候&nbsp;尽量保证得到的源代码改动最少<br />&nbsp;&nbsp;&nbsp;&nbsp;并且调试方便&nbsp;而且目录结构分类清晰<br /><br />网上的各个项目都有如下特点:<br />&nbsp;&nbsp;&nbsp;&nbsp;1:一来就吭哧吭哧修改头文件,每个文件都#include&nbsp;&quot;includes.h&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;2:&nbsp;ucos和其他文件&nbsp;或者放在一个文件夹&nbsp;或者在项目里面不管3721都加上<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;跳来跳去头都是大的&nbsp;而且调试的时候出些莫名其妙的问题:比如<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设不了断点&nbsp;或者调试无法进入c文件等等<br /><br />我的设想:前提&nbsp;得到ucos2.84<br />&nbsp;&nbsp;&nbsp;1:&nbsp;改动尽量少&nbsp;&nbsp;即不按常规修改里面的#include&nbsp;&quot;includes.h&quot;等<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ucos说放哪里我们就放哪里<br />&nbsp;&nbsp;&nbsp;2:&nbsp;&nbsp;项目结构和文件存放结构合理,该有的有&nbsp;不该有的就没有<br />&nbsp;&nbsp;&nbsp;3:&nbsp;&nbsp;调试时编译器不会出现怪问题<br />&nbsp;&nbsp;&nbsp;4:&nbsp;文档尽量清楚&nbsp;每处和每步小小的修改都要说明<br /><br />建议最开始看完&nbsp;杨屹&nbsp;&nbsp;大虾的**<br /><br /><br /><br />[里面的os_cfg_r.h-&gt改成os_cfg.h]&nbsp;至此,是ucos里面的[第一处修改]<br /><br />1:&nbsp;&nbsp;建立项目文件&nbsp;拷贝原始文件&nbsp;整理文件夹<br />目录如下:&nbsp;<br />&nbsp;&nbsp;&nbsp;FirstVersion:&nbsp;&nbsp;根目录&nbsp;project.uv就放下面<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-ucos&nbsp;:&nbsp;&nbsp;拷贝ucos2.83源代码和os_cpu_a.a51&nbsp;等凡是ucos相关的到下面&nbsp;&nbsp;去掉只读和存档属性&nbsp;&nbsp;自己加一个app_cfg.h(ucos2.83增<br /><br />加的)&nbsp;里面内容是#include&nbsp;&ltreg51.h&gt嘿嘿<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-output:&nbsp;<br /><br />项目设置:<br />&nbsp;&nbsp;&nbsp;&nbsp;-SourceGroup<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gtSTARTUP.A51&nbsp;&nbsp;main.c<br />&nbsp;&nbsp;&nbsp;--ucos<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gtos_task.c&nbsp;&nbsp;os_core.c<br /><br /><br />&nbsp;&nbsp;&nbsp;<br />2:&nbsp;设置<br />&nbsp;&nbsp;&nbsp;&nbsp;1:&nbsp;Target1&nbsp;-&gt&nbsp;options-&gtoutput和Listing里面点&quot;Select&nbsp;Folder&nbsp;for&nbsp;Objects&quot;&nbsp;改为\output<br />&nbsp;&nbsp;&nbsp;&nbsp;2:&nbsp;&nbsp;Target1-&gtoptions&nbsp;-&gt&nbsp;C51和A51里面的&nbsp;Include&nbsp;Paths-&gt加入ucos<br />&nbsp;&nbsp;&nbsp;&nbsp;4:&nbsp;&nbsp;Target1&nbsp;-&gt&nbsp;options-&gtTarget的MemoryModel和CodeRomSize都用Large<br /><br />编译:&nbsp;有四个警告&nbsp;'OSIntCtxSw':&nbsp;missing&nbsp;function-prototype<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'OSStartHighRdy':&nbsp;missing&nbsp;function-prototype<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'OSCtxSw':&nbsp;missing&nbsp;function-prototype<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UCOS\OS_CORE.C(1356):&nbsp;warning&nbsp;C275:&nbsp;expression&nbsp;with&nbsp;possibly&nbsp;no&nbsp;effect<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第四个警告是由于OS_TaskIdle()里面<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(void)p_arg;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Prevent&nbsp;compiler&nbsp;warning&nbsp;for&nbsp;not&nbsp;using&nbsp;'parg'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;没有起到作用&nbsp;改成p_arg&nbsp;=&nbsp;p_arg;即可。&nbsp;至此,是在ucos里面的[第二处修改]<br /><br /><br />3:加入&nbsp;OS_CPU_C.C&nbsp;&nbsp;不要问这个文件哪里来的&nbsp;地球人都知道&nbsp;<br />&nbsp;&nbsp;&nbsp;在不管它通不通前&nbsp;还有修改<br />&nbsp;&nbsp;&nbsp;&nbsp;1:&nbsp;最前面保持跟其他.c文件一致&nbsp;加入<br />#ifndef&nbsp;&nbsp;OS_MASTER_FILE<br />#include&nbsp;&ltucos_ii.h&gt<br />#endif<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;2:加入若干个函数的函数体&nbsp;大体都是带&quot;hook&quot;的,&nbsp;这些个函数只在ucos_ii.h有个声明,但由于只有头文件有定义没有函数体&nbsp;,keil会<br /><br />把它编译成LJMP&nbsp;STARTUP1的语句。知道有什么后果了吧<br />注意#if的条件头文件和c文件要一致&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;在这里感觉ucos是不是搞了点”技术处理“?反正n个函数头文件和c文件的#if条件不一致<br />一不小心会造成LJMP&nbsp;STARTUP1!&nbsp;&nbsp;注意把os_core.c&nbsp;ucos_ii.h和os_cpu_c里面都要改完<br />至此,是在ucos里面的[第三处修改]&nbsp;&nbsp;要改的地方还不少<br /><br />//in&nbsp;ucos_ii.h<br />#if&nbsp;OS_CPU_HOOKS_EN&nbsp;<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSInitHookBegin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(void);<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSInitHookEnd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(void);<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTCBInitHook&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(OS_TCB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*ptcb);<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTaskCreateHook&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(OS_TCB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*ptcb);<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTaskDelHook&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(OS_TCB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*ptcb);<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTaskStatHook&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(void);<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTaskIdleHook&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(void);&nbsp;&nbsp;&nbsp;&nbsp;<br />#endif<br /><br />#if&nbsp;OS_TASK_SW_HOOK_EN&nbsp;<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTaskSwHook&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(void);<br />#endif<br /><br />#if&nbsp;OS_TIME_TICK_HOOK_EN<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTimeTickHook&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(void);<br />#endif&nbsp;<br /><br /><br />4:&nbsp;现在开始改OS_CPU_C.C里面的函数<br />&nbsp;&nbsp;&nbsp;&nbsp;将OSTaskStkInit()改成跟ucos_ii.h里面一样。具体就是原来里面yy大虾的函数是<br />void&nbsp;*OSTaskStkInit&nbsp;(void&nbsp;(*task)(void&nbsp;*pd),&nbsp;void&nbsp;*ppdata,&nbsp;void&nbsp;*ptos,&nbsp;INT16U&nbsp;opt)&nbsp;<br />&nbsp;&nbsp;&nbsp;总之网上各个版本都是ppdata..呵呵&nbsp;。ucos2.83里面用的是p_arg.我们把它修改成<br />OS_STK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*OSTaskStkInit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*task)(void&nbsp;*p_arg)&nbsp;,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*p_arg,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_STK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*ptos,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT16U&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;opt)&nbsp;<br />编译能通过&nbsp;先不管运行起来对不对<br /><br /><br /><br />5:&nbsp;在ucos组里面加入os_cpu_a.a51&nbsp;不要问这个文件哪里来的&nbsp;地球人都知道<br />编译&nbsp;&nbsp;会出现错误:&nbsp;***&nbsp;ERROR&nbsp;L102:&nbsp;EXTERNAL&nbsp;ATTRIBUTE&nbsp;MISMATCH<br />&nbsp;&nbsp;&nbsp;这是因为os_cpu_a.a51里面<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXTRN&nbsp;IDATA&nbsp;(OSTCBHighRdy)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXTRN&nbsp;IDATA&nbsp;(OSRunning)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXTRN&nbsp;IDATA&nbsp;(OSPrioCur)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXTRN&nbsp;IDATA&nbsp;(OSPrioHighRdy)<br />&nbsp;&nbsp;&nbsp;对引用的外部变量作了idata的定义,而ucos_ii.h里面没有<br /><br />在这里&nbsp;os_cpu.h里面&nbsp;&nbsp;先增加一个#define&nbsp;DATATYPE_1&nbsp;&nbsp;idata<br />在ucos_ii.h找到这四个变量&nbsp;增加idata定义&nbsp;&nbsp;&nbsp;至此,是在ucos里面的[第三处修改]<br />编译能通过<br />&nbsp;<br /><br /><br />6:在ucos_ii.h里面<br />#if&nbsp;0<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSStartHighRdy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(void);<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSIntCtxSw&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(void);<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSCtxSw&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(void);<br />#endif<br /><br />这就是造成上面的其中三个编译警告的原因&nbsp;既然ucos2.83里面有说<br />*&nbsp;IMPORTANT:&nbsp;These&nbsp;prototypes&nbsp;MUST&nbsp;be&nbsp;placed&nbsp;in&nbsp;OS_CPU.H<br />那么我们就把它们placed&nbsp;in&nbsp;OS_CPU.H<br />&nbsp;&nbsp;不改动原来的代码&nbsp;只copy<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSStartHighRdy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(void);<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSIntCtxSw&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(void);<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSCtxSw&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(void);<br />&nbsp;&nbsp;到os_cpu.h里面&nbsp;再编译&nbsp;现在就只有<br />***&nbsp;WARNING&nbsp;L16:&nbsp;UNCALLED&nbsp;SEGMENT,&nbsp;IGNORED&nbsp;FOR&nbsp;OVERLAY&nbsp;PROCESS的警告了<br />Program&nbsp;Size:&nbsp;data=84.0&nbsp;xdata=2348&nbsp;code=8721&nbsp;&nbsp;&nbsp;//keil&nbsp;8.06<br />至此&nbsp;整个框架就搭起来了&nbsp;&nbsp;下面就来慢慢对付OSTaskStkInit()这个函数<br /><br /><br /><br /><br />gogogo!!!!!!!!!!!!!!!!!!<br /><br />1:&nbsp;os_cfg.h里面先&nbsp;disable掉<br />OS_DEBUG_EN&nbsp;&nbsp;OS_FLAG_EN&nbsp;OS_MBOX_EN&nbsp;OS_MEM_EN&nbsp;OS_MUTEX_EN&nbsp;OS_Q_EN&nbsp;OS_SEM_EN&nbsp;<br />等等等等<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;题外话:&nbsp;做一个Configuration&nbsp;Wizard的OS_CFG.H&nbsp;这下方便多了&nbsp;。这可是个体力活!&nbsp;嘿嘿&nbsp;<br />也不违背了不改动原始文件的初衷<br /><br /><br />&nbsp;&nbsp;开始go了。建立最简单的一个东西<br /><br /><br />#include&nbsp;&ltucos_ii.h&gt<br /><br />void&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;OSInit();<br />&nbsp;&nbsp;&nbsp;&nbsp;OSStart();<br />}<br /><br />发现走到os_cpu_a.a51里面的<br />OSStartHighRdy:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USING&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;;上电后51自动关中断,此处不必用CLR&nbsp;EA指令,因为到此处还未开中断,本程序退出后,开中断。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LCALL&nbsp;_?OSTaskSwHook&nbsp;&nbsp;--》一call就call复位了&nbsp;**<br /><br />捣鼓了下建一个os_cpu_a.c&nbsp;加入工程&nbsp;且右键的options-&gtGenerate&nbsp;Assembleer&nbsp;SRC&nbsp;File打勾<br />内容为<br />#ifndef&nbsp;&nbsp;OS_MASTER_FILE<br />#include&nbsp;&ltucos_ii.h&gt<br />#endif&nbsp;&nbsp;<br /><br />&nbsp;void&nbsp;OSStartHighRdy(void)&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTaskSwHook();<br />&nbsp;}&nbsp;&nbsp;&nbsp;看了看&nbsp;生成的东西是这样的&nbsp;<br />?PR?OSStartHighRdy?OS_CPU_A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SEGMENT&nbsp;CODE&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;EXTRN&nbsp;&nbsp;&nbsp;&nbsp;CODE&nbsp;(OSTaskSwHook)<br />&nbsp;&nbsp;&nbsp;&nbsp;PUBLIC&nbsp;&nbsp;&nbsp;&nbsp;OSStartHighRdy<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;RSEG&nbsp;&nbsp;?PR?OSStartHighRdy?OS_CPU_A<br />OSStartHighRdy:<br />&nbsp;&nbsp;&nbsp;&nbsp;USING&nbsp;&nbsp;&nbsp;&nbsp;0<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;LJMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTaskSwHook<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;END<br /><br />简直莫名其妙&nbsp;于是&nbsp;将os_cpu_a.a51改成&nbsp;<br /><br />&nbsp;;EXTRN&nbsp;CODE&nbsp;&nbsp;(_?OSTaskSwHook)<br />&nbsp;&nbsp;EXTRN&nbsp;CODE&nbsp;(OSTaskSwHook)&nbsp;&nbsp;;keil8.06&nbsp;&nbsp;&lt-----改这里<br /><br />;子程序<br />;-------------------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RSEG&nbsp;?PR?OSStartHighRdy?OS_CPU_A<br />OSStartHighRdy:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USING&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;;上电后51自动关中断,此处不必用CLR&nbsp;EA指令,因为到此处还未开中断,本程序退出后,开中断。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;LCALL&nbsp;_?OSTaskSwHook<br />&nbsp;&nbsp;&nbsp;&nbsp;LCALL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTaskSwHook&nbsp;&nbsp;&nbsp;&lt-----改这里<br /><br />再测试&nbsp;ok&nbsp;能进入OSIdleStask&nbsp;并在里面循环&nbsp;&nbsp;&nbsp;看来是c和汇编连接的一些问题&nbsp;先把它放一边以后解决&nbsp;[待解决的问题2]继续测试<br /><br />&nbsp;&nbsp;这里又想到个问题&nbsp;万一#define&nbsp;OS_TASK_SW_HOOK_EN&nbsp;&nbsp;0&nbsp;&nbsp;那么OSTaskSwHook()就不被编译。<br />在汇编里面调用会不会又复位?keil这点太……[不知道哪里可以设置&nbsp;待解决的问题2],<br />测试了下&nbsp;果然复位&nbsp;**!作个说明“如果用keil,那么OS_TASK_SW_HOOK_EN&nbsp;一定要为1<br /><br /><br /><br />好了&nbsp;就算第一步测试搞定&nbsp;现在来做个”笨活路“&nbsp;&nbsp;给所有的函数加上reentrant!&nbsp;内部的static就不用了。<br /><br />现在开始调试serial&nbsp;&nbsp;将yy大虾的serial.c搞过来&nbsp;加入工程<br />1:&nbsp;&nbsp;看到汇编和c混合头都是大的&nbsp;&nbsp;把<br />#pragma&nbsp;asm<br />&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;IE<br />&nbsp;&nbsp;&nbsp;&nbsp;EA&nbsp;=&nbsp;0;<br />之类的东东全部改成&nbsp;&nbsp;_push_(IE);&nbsp;EA&nbsp;=&nbsp;0;嘿嘿&nbsp;当然不要忘记在app_cfg.h加#include&nbsp;&ltintrins.h&gt<br /><br /><br />现在有:<br />#include&nbsp;&ltucos_ii.h&gt<br /><br />void&nbsp;Task1(void&nbsp;*p_arg)&nbsp;keilReentrant;<br />void&nbsp;Task2(void&nbsp;*p_arg)&nbsp;keilReentrant;<br />void&nbsp;Task3(void&nbsp;*p_arg)&nbsp;keilReentrant;<br /><br />OS_STK&nbsp;Task1Stack;//注意:我在ASM文件中设置?STACK空间为40H即64。<br />OS_STK&nbsp;Task2Stack;<br />OS_STK&nbsp;Task3Stack;<br /><br />void&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;ucReturn;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;OSInit();<br />&nbsp;&nbsp;&nbsp;&nbsp;OSInitTimer0();&nbsp;&nbsp;&nbsp;//也就是原来的InitTimer0();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitSerial();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitSerialBuffer();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ucReturn&nbsp;=&nbsp;OSTaskCreate(Task1,&nbsp;(void&nbsp;*)0,&nbsp;&Task1Stack&nbsp;,2);<br />&nbsp;&nbsp;&nbsp;&nbsp;ucReturn&nbsp;=&nbsp;OSTaskCreate(Task2,&nbsp;(void&nbsp;*)0,&nbsp;&Task2Stack&nbsp;,3);<br />&nbsp;&nbsp;&nbsp;&nbsp;ucReturn&nbsp;=&nbsp;OSTaskCreate(Task3,&nbsp;(void&nbsp;*)0,&nbsp;&Task3Stack&nbsp;,4);&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;OSStart();<br />}<br /><br />void&nbsp;Task1(void&nbsp;*p_arg)&nbsp;keilReentrant<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;p_arg&nbsp;=&nbsp;p_arg;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ET0=1;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(;;){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PrintStr(&quot;Task&nbsp;1&nbsp;is&nbsp;active.&nbsp;\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTimeDly(3*OS_TICKS_PER_SEC);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />void&nbsp;Task2(void&nbsp;*p_arg)&nbsp;keilReentrant<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;p_arg&nbsp;=&nbsp;p_arg;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(;;){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintStr(&quot;Task&nbsp;2&nbsp;is&nbsp;active.&nbsp;\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTimeDly(2*OS_TICKS_PER_SEC);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />void&nbsp;Task3(void&nbsp;*p_arg)&nbsp;keilReentrant<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;p_arg&nbsp;=&nbsp;p_arg;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(;;){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintStr(&quot;Task&nbsp;3&nbsp;is&nbsp;active.&nbsp;\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTimeDly(3*OS_TICKS_PER_SEC);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br />运行&nbsp;&nbsp;**&nbsp;怎么就显示&quot;Task&nbsp;1&nbsp;is&nbsp;active&quot;&nbsp;任务不切换&nbsp;?为啥。<br />原来os_time.c还没有加到项目里面去(因为这个项目没有把<br />ucos_ii.c加入项目);OSTimeDly()哪里会工作<br /><br />加进去,运行-&gtOK<br /><br /><br /><br /><br /><br />OS_timr&nbsp;&nbsp;把OS_Timr.c加入&nbsp;并打开en的开关编译的时候会出现err。原因是回调函数参数太多的问题<br />解决方法见&nbsp;&nbsp;http://www.keil.com/support/docs/2066.htm&nbsp;&nbsp;<br />在ucos-ii.h里面<br />/*&nbsp;add&nbsp;keilReentrant&nbsp;to&nbsp;to&nbsp;solve&nbsp;the&nbsp;Error&nbsp;212:&nbsp;Indirect&nbsp;call:&nbsp;Parameters&nbsp;do&nbsp;not&nbsp;fit&nbsp;within&nbsp;registers&nbsp;*/<br />typedef&nbsp;&nbsp;void&nbsp;(*OS_TMR_CALLBACK)(void&nbsp;*ptmr,&nbsp;void&nbsp;*parg)&nbsp;reentrant&nbsp;;&nbsp;<br /><br /><br />附加一点就是项目里面直接加如.a文件&nbsp;不用在include&nbsp;c51L.lib<br /><br /><br />然后加入一个lcd的驱动&nbsp;呵呵很简单1602的。前提就是尽量不修改ucos的变量&nbsp;函数名称和调用方式等<br />详细见工程。调试通过&nbsp;不过是在proteus里面。在这里感谢jjj&nbsp;www.proteus.com.cn&nbsp;<br />记得因为lcd.c里面用到了sempost函数&nbsp;所以如果要用就必须把OS_MAX_EVENTS&nbsp;算进去,在你原来的设定值加一<br /><br /><br /><br />到此&nbsp;新鲜的ucos2.84出炉了。奉献此身体给大家。想来想去&nbsp;唯一的卖点就是写了点细节,二是改了个os_cfg.h...呵呵<br /><br /><br /><br /><br />打包文件在下&nbsp;!&nbsp;只有文档的兄台也不用发mail给我&nbsp;自己网上找去&nbsp;应该有下&nbsp;<br /><br />&nbsp;&nbsp;熊伟&nbsp;&nbsp;于大年初一&nbsp;深圳&nbsp;&nbsp;&nbsp;xiongxiaowei@126.com&nbsp;&nbsp;&nbsp;jdsu光电<br /><br /><br /><br /><br />version2:<br />&nbsp;&nbsp;&nbsp;不知道怎么回事,一到&nbsp;&nbsp;&nbsp;LCALL&nbsp;OSTaskSwHook&nbsp;&nbsp;--》一call就call复位了&nbsp;**<br />&nbsp;又改回来&nbsp;&nbsp;&nbsp;&nbsp;LCALL&nbsp;_?OSTaskSwHook&nbsp;&nbsp;又好了<br />&nbsp;想了想&nbsp;是不是我又加了.a文件的原因?<br />因为后来我又加了一个INT0Function.c&nbsp;和INT0Function_a.a51<br /><br />void&nbsp;Int0Function()&nbsp;keilReentrant<br />{&nbsp;&nbsp;&nbsp;&nbsp;//中断在汇编中实现,去掉interrupt&nbsp;{//INT0中断服务子程序<br /><br /><br /><br /><br /><br />}<br /><br /><br /><br />#include&nbsp;&ltinclude_a.h&gt<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NAME&nbsp;INT0FUNCTION_A&nbsp;&nbsp;&nbsp;&nbsp;;模块名<br /><br />?PR?_?INTOFunction?INT0FUNCTION_A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SEGMENT&nbsp;CODE<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXTRN&nbsp;CODE&nbsp;&nbsp;(_?INTOFunction)<br /><br /><br />;-------------------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CSEG&nbsp;AT&nbsp;0013H&nbsp;&nbsp;&nbsp;&nbsp;;INT0中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LJMP&nbsp;INT0ISR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;工作于系统态,无任务切换。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RSEG&nbsp;?PR?_?INTOFunction?INT0FUNCTION_A<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />INT0ISR:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USING&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLR&nbsp;&nbsp;EA&nbsp;&nbsp;&nbsp;&nbsp;;先关中断,以防中断嵌套。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PUSHALL<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LCALL&nbsp;_?INTOFunction&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;POPALL<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SETB&nbsp;EA&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RETI<br /><br /><br />;-------------------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;END<br />;-------------------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />工程文件在里面&nbsp;&nbsp;version1<br />https://bbs.21ic.com/upfiles/img/20072/200722094220333.jpg<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;https://bbs.21ic.com/upfiles/img/20072/20072209396121.jpg

roguebear 发表于 2007-2-20 09:43

附件在这里

https://bbs.21ic.com/upfiles/img/20072/200722094220333.jpghttps://bbs.21ic.com/upfiles/img/20072/200722094220333.jpg

桂电飞天鼠 发表于 2007-2-25 21:55

谢谢分享!

写得非常详细呀~~!<br />回学校试试!

handanqianqian 发表于 2010-10-21 20:20

很详细的帖子啊

a305566 发表于 2010-11-12 16:36

mark

l09046162 发表于 2011-6-27 11:03

mark

llf021421 发表于 2011-6-27 18:13

谢谢,以后再看

i55 发表于 2011-6-28 00:12

就51那点RAM,能用吗?

jlgcumt 发表于 2011-12-24 22:09

mark

dalun 发表于 2011-12-26 09:51

谢谢楼主详细的解说。。。

guidianren 发表于 2011-12-26 14:59

谢谢楼主了

a85222328 发表于 2014-12-18 08:55

楼主,源码在哪里?
页: [1]
查看完整版本: 原创-新鲜出炉的最详尽说明ucos2.84 移植到51in keil