⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ucos51移植心得.htm

📁 ucos的资料以及单片机dsp的经典移植程序
💻 HTM
📖 第 1 页 / 共 5 页
字号:
                  MOV&nbsp; DPH,R0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOV&nbsp; DPL,R1<BR>&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;*UserStkPtr 
                  ===&gt; R5&nbsp; 用户堆栈起始地址内容(即用户堆栈长度放在此处)&nbsp; 详见文档说明&nbsp; 
                  指针用法详见C51.PDF第169页&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOVX 
                  A,@DPTR&nbsp;&nbsp;&nbsp;&nbsp; ;用户堆栈中是unsigned 
                  char类型数据<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOV&nbsp; R5,A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  ;R5=用户堆栈长度<BR>&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  ;恢复现场堆栈内容<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOV&nbsp; 
                  R0,#OSStkStart<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>restore_stack:<BR>&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INC&nbsp; 
                  DPTR<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INC&nbsp; 
                  R0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOVX 
                  A,@DPTR<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOV&nbsp; @R0,A<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  DJNZ R5,restore_stack<BR>&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  ;恢复堆栈指针SP<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOV&nbsp; SP,R0<BR>&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  ;OSRunning=TRUE<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOV&nbsp; R0,#LOW 
                  (OSRunning)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOV&nbsp; @R0,#01<BR>&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  POPALL<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SETB 
                  EA&nbsp;&nbsp;&nbsp; 
                  ;开中断<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  RETI<BR>;-------------------------------------------------------------------------<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  RSEG ?PR?OSCtxSw?OS_CPU_A<BR>OSCtxSw:&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  PUSHALL<BR>&nbsp;&nbsp;&nbsp; 
                  <BR>OSIntCtxSw_in:<BR>&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  ;获得堆栈长度和起址<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOV&nbsp; A,SP<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  CLR&nbsp; C<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUBB 
                  A,#OSStkStart<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOV&nbsp; R5,A&nbsp;&nbsp;&nbsp;&nbsp; 
                  ;获得堆栈长度&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;OSTCBCur 
                  ===&gt; DPTR&nbsp; 
                  获得当前TCB指针,详见C51.PDF第178页<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOV&nbsp; R0,#LOW (OSTCBCur) 
                  ;获得OSTCBCur指针低地址,指针占3字节。+0类型+1高8位数据+2低8位数据<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  INC&nbsp; R0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOV&nbsp; DPH,@R0&nbsp;&nbsp;&nbsp; 
                  ;全局变量OSTCBCur在IDATA中<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  INC&nbsp; R0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOV&nbsp; DPL,@R0<BR>&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  ;OSTCBCur-&gt;OSTCBStkPtr ===&gt; DPTR&nbsp; 
                  获得用户堆栈指针<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  INC&nbsp; DPTR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  ;指针占3字节。+0类型+1高8位数据+2低8位数据<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOVX A,@DPTR&nbsp;&nbsp;&nbsp;&nbsp; 
                  ;.OSTCBStkPtr是void指针<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOV&nbsp; R0,A<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  INC&nbsp; DPTR<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOVX A,@DPTR<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOV&nbsp; R1,A<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOV&nbsp; DPH,R0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOV&nbsp; DPL,R1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  ;保存堆栈长度<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOV&nbsp; A,R5<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOVX @DPTR,A<BR>&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV&nbsp; 
                  R0,#OSStkStart&nbsp; 
                  ;获得堆栈起址<BR>save_stack:<BR>&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INC&nbsp; 
                  DPTR<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INC&nbsp; 
                  R0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV&nbsp; 
                  A,@R0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOVX 
                  @DPTR,A<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DJNZ 
                  R5,save_stack<BR>&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  ;调用用户程序<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LCALL 
                  _?OSTaskSwHook<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;OSTCBCur = 
                  OSTCBHighRdy<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOV&nbsp; R0,#OSTCBCur<BR>&nbsp;&nbsp;&nbsp; MOV&nbsp; 
                  R1,#OSTCBHighRdy<BR>&nbsp;&nbsp;&nbsp; MOV&nbsp; 
                  A,@R1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV&nbsp; 
                  @R0,A<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INC&nbsp; 
                  R0<BR>&nbsp;&nbsp;&nbsp; INC&nbsp; R1<BR>&nbsp;&nbsp;&nbsp; 
                  MOV&nbsp; A,@R1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOV&nbsp; @R0,A<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  INC&nbsp; R0<BR>&nbsp;&nbsp;&nbsp; INC&nbsp; 
                  R1<BR>&nbsp;&nbsp;&nbsp; MOV&nbsp; 
                  A,@R1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV&nbsp; 
                  @R0,A<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;OSPrioCur = 
                  OSPrioHighRdy&nbsp; 
                  使用这两个变量主要目的是为了使指针比较变为字节比较,以便节省时间。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOV&nbsp; R0,#OSPrioCur<BR>&nbsp;&nbsp;&nbsp; MOV&nbsp; 
                  R1,#OSPrioHighRdy<BR>&nbsp;&nbsp;&nbsp; MOV&nbsp; 
                  A,@R1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV&nbsp; 
                  @R0,A<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LJMP 
                  OSCtxSw_in<BR>;-------------------------------------------------------------------------<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  RSEG 
                  ?PR?OSIntCtxSw?OS_CPU_A<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>OSIntCtxSw:</P>
                  <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  ;调整SP指针去掉在调用OSIntExit(),OSIntCtxSw()过程中压入堆栈的多余内容<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  ;SP=SP-4</P>
                  <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV&nbsp; 
                  A,SP<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLR&nbsp; 
                  C<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUBB 
                  A,#4<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV&nbsp; 
                  SP,A<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LJMP 
                  OSIntCtxSw_in<BR>;-------------------------------------------------------------------------<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  CSEG AT 000BH&nbsp;&nbsp;&nbsp; 
                  ;OSTickISR<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LJMP 
                  OSTickISR&nbsp;&nbsp; 
                  ;使用定时器0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RSEG 
                  ?PR?OSTickISR?OS_CPU_A</P>
                  <P>OSTickISR:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; USING 
                  0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  PUSHALL<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLR&nbsp; 
                  TR0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV&nbsp; 
                  TH0,#70H&nbsp;&nbsp;&nbsp; 
                  ;定义Tick=50次/秒(即0.02秒/次)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  MOV&nbsp; TL0,#00H&nbsp;&nbsp;&nbsp; ;OS_CPU_C.C&nbsp; 和&nbsp; 
                  OS_TICKS_PER_SEC<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  SETB TR0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LCALL 
                  _?OSIntEnter<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  LCALL 
                  _?OSTimeTick<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  LCALL 
                  _?OSIntExit<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  POPALL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  RETI<BR>;-------------------------------------------------------------------------<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  CSEG AT 0023H&nbsp;&nbsp;&nbsp; 
                  ;串口中断<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LJMP 
                  SerialISR&nbsp;&nbsp; 
                  ;工作于系统态,无任务切换。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  RSEG 
                  ?PR?_?serial?OS_CPU_A<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>SerialISR:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -