OS_CPU_C.SRC
上传用户:tzjinxin1
上传日期:2022-08-08
资源大小:272k
文件大小:27k
开发平台:

Visual C++

  1. ; .objOS_CPU_C.SRC generated from: uCosiiOS_CPU_C.C
  2. ; COMPILER INVOKED BY:
  3. ;        C:KeilC51BINC51.EXE uCosiiOS_CPU_C.C LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.lstOS_CPU_C.lst) SRC(.objOS_CPU_C.SRC)
  4. $NOMOD51
  5. NAME OS_CPU_C
  6. P0 DATA 080H
  7. P1 DATA 090H
  8. P2 DATA 0A0H
  9. P3 DATA 0B0H
  10. T0 BIT 0B0H.4
  11. AC BIT 0D0H.6
  12. T1 BIT 0B0H.5
  13. T2 BIT 090H.0
  14. EA BIT 0A8H.7
  15. IE DATA 0A8H
  16. EXF2 BIT 0C8H.6
  17. RD BIT 0B0H.7
  18. ES BIT 0A8H.4
  19. IP DATA 0B8H
  20. RI BIT 098H.0
  21. INT0 BIT 0B0H.2
  22. CY BIT 0D0H.7
  23. TI BIT 098H.1
  24. INT1 BIT 0B0H.3
  25. RCAP2H DATA 0CBH
  26. PS BIT 0B8H.4
  27. SP DATA 081H
  28. T2EX BIT 090H.1
  29. OV BIT 0D0H.2
  30. RCAP2L DATA 0CAH
  31. C_T2 BIT 0C8H.1
  32. WR BIT 0B0H.6
  33. RCLK BIT 0C8H.5
  34. TCLK BIT 0C8H.4
  35. SBUF DATA 099H
  36. PCON DATA 087H
  37. SCON DATA 098H
  38. TMOD DATA 089H
  39. TCON DATA 088H
  40. IE0 BIT 088H.1
  41. IE1 BIT 088H.3
  42. B DATA 0F0H
  43. CP_RL2 BIT 0C8H.0
  44. ACC DATA 0E0H
  45. ET0 BIT 0A8H.1
  46. ET1 BIT 0A8H.3
  47. TF0 BIT 088H.5
  48. ET2 BIT 0A8H.5
  49. TF1 BIT 088H.7
  50. TF2 BIT 0C8H.7
  51. RB8 BIT 098H.2
  52. TH0 DATA 08CH
  53. EX0 BIT 0A8H.0
  54. IT0 BIT 088H.0
  55. TH1 DATA 08DH
  56. TB8 BIT 098H.3
  57. EX1 BIT 0A8H.2
  58. IT1 BIT 088H.2
  59. TH2 DATA 0CDH
  60. P BIT 0D0H.0
  61. SM0 BIT 098H.7
  62. TL0 DATA 08AH
  63. SM1 BIT 098H.6
  64. TL1 DATA 08BH
  65. SM2 BIT 098H.5
  66. TL2 DATA 0CCH
  67. PT0 BIT 0B8H.1
  68. PT1 BIT 0B8H.3
  69. RS0 BIT 0D0H.3
  70. PT2 BIT 0B8H.5
  71. TR0 BIT 088H.4
  72. RS1 BIT 0D0H.4
  73. TR1 BIT 088H.6
  74. TR2 BIT 0C8H.2
  75. PX0 BIT 0B8H.0
  76. PX1 BIT 0B8H.2
  77. DPH DATA 083H
  78. DPL DATA 082H
  79. EXEN2 BIT 0C8H.3
  80. REN BIT 098H.4
  81. T2CON DATA 0C8H
  82. RXD BIT 0B0H.0
  83. TXD BIT 0B0H.1
  84. F0 BIT 0D0H.5
  85. PSW DATA 0D0H
  86. ?PR?_?OSTaskStkInit?OS_CPU_C             SEGMENT CODE 
  87. ?PR?_?OSInitHookBegin?OS_CPU_C           SEGMENT CODE 
  88. ?PR?_?OSInitHookEnd?OS_CPU_C             SEGMENT CODE 
  89. ?PR?_?OSTaskCreateHook?OS_CPU_C          SEGMENT CODE 
  90. ?PR?_?OSTaskSwHook?OS_CPU_C              SEGMENT CODE 
  91. ?PR?_?OSTCBInitHook?OS_CPU_C             SEGMENT CODE 
  92. ?PR?_?OSTimeTickHook?OS_CPU_C            SEGMENT CODE 
  93. ?PR?_?OSTaskIdleHook?OS_CPU_C            SEGMENT CODE 
  94. ?PR?UserTickTimer?OS_CPU_C               SEGMENT CODE 
  95. ?PR?OSTickISR?OS_CPU_C                   SEGMENT CODE 
  96. ?PR?SerialISR?OS_CPU_C                   SEGMENT CODE 
  97. ?PR?_?InitHardware?OS_CPU_C              SEGMENT CODE 
  98. ?XD?OS_CPU_C         SEGMENT XDATA 
  99. EXTRN CODE (_?OSIntExit)
  100. EXTRN CODE (_?OSTimeTick)
  101. EXTRN CODE (_?OSIntEnter)
  102. EXTRN CODE (?C?ADDXBP)
  103. EXTRN CODE (?C?XBPOFF)
  104. EXTRN DATA (?C_XBP)
  105. EXTRN CODE (?C?ILDIX)
  106. EXTRN CODE (?C?CSTPTR)
  107. EXTRN CODE (?C?CLDOPTR)
  108. PUBLIC pc_send
  109. PUBLIC _?InitHardware
  110. PUBLIC SerialISR
  111. PUBLIC OSTickISR
  112. PUBLIC UserTickTimer
  113. PUBLIC _?OSTaskIdleHook
  114. PUBLIC _?OSTimeTickHook
  115. PUBLIC _?OSTCBInitHook
  116. PUBLIC _?OSTaskSwHook
  117. PUBLIC _?OSTaskCreateHook
  118. PUBLIC _?OSInitHookEnd
  119. PUBLIC _?OSInitHookBegin
  120. PUBLIC _?OSTaskStkInit
  121. RSEG  ?XD?OS_CPU_C
  122.         pc_send:   DS   7
  123. ; /*
  124. ; *********************************************************************************************************
  125. ; *                                               uC/OS-II
  126. ; *                                               实时内核
  127. ; *
  128. ; *                        (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
  129. ; *                                               版权所有
  130. ; *
  131. ; *                                            MCU-51 专用代码
  132. ; *                                           KEIL C51大模式编译
  133. ; *
  134. ; * 文件名 : OS_CPU_C.C
  135. ; * 作者   : Jean J. Labrosse
  136. ; * 改编   : 杨屹 gdtyy@ri.gdt.com.cn 巨龙公司系统集成开发部 2002.09.27
  137. ; * 改编   : 钟文青,升级到与ucOS-II 2.51的代码,2003.5
  138. ; *********************************************************************************************************
  139. ; */
  140. ; #define  OS_CPU_GLOBALS
  141. ; #include "sourceincludes.h"
  142. ; /*
  143. ; *********************************************************************************************************
  144. ; *                                        初始化任务堆栈
  145. ; *
  146. ; * 描述       : 这个函数被OSTaskCreate()或OSTaskCreateExt()调用,以便初始化新创建任务的堆栈结构。本函数
  147. ; *              与处理器高度相关。
  148. ; *
  149. ; * 参数       : task          指向任务代码的指针
  150. ; *
  151. ; *              pdata         当任务第一次执行时将要传入任务的用户数据结构指针
  152. ; *
  153. ; *              ptos          栈顶指针。ptos指针被默认为用户堆栈入口指针。如果OS_STK_GROWTH被置1,那么,
  154. ; *                            ptos指向用户堆栈的最高有效地址。同样地,如果OS_STK_GROWTH清0,ptos将指向
  155. ; *                            用户堆栈的最低有效地址。
  156. ; *
  157. ; *              opt           指定可以改变OSTaskStkInit()行为的选项。(见uCOS_II.H for OS_TASK_OPT_???)。
  158. ; *
  159. ; * 返回值     : 我修改了原来的程序,使函数总是返回用户堆栈空间的最低有效地址。这样修改提高了TCB换入换出
  160. ; *              的效率。
  161. ; *
  162. ; * 注意       : 任务堆栈结构:
  163. ; *
  164. ; *                                    ---------- -
  165. ; *                 用户栈最高地址---->|        | |
  166. ; *                                    ---------- |
  167. ; *                                    |   ...  | 仿真堆栈空间
  168. ; *----------                          ---------- | 每任务一个
  169. ; *|OSTCBCur|               ?C_XBP---->|        | | KEIL自动处理
  170. ; *----------                          ---------- -
  171. ; *    |                               |空闲间隔|
  172. ; *    |     -----------------------   ----------                           ----------
  173. ; *    ---->|OSTCBCur->OSTCBStkPtr|   |?C_XBP低|                    SP---->|        |
  174. ; *          -----------------------   ----------                           ----------
  175. ; *                     |              |?C_XBP高|                           |        |
  176. ; *                     |              ---------- -                         ----------
  177. ; *                     |              |        | |                         |   .    |
  178. ; *                     |              ---------- |                         |   .    |
  179. ; *                     |              |        | |                         |   .    |
  180. ; *                     |              ---------- |                         ----------
  181. ; *                     |              |   .    |长度                       |        | +1
  182. ; *                     |              |   .    | |                         ----------
  183. ; *                     |              |   .    | |             OSStack---->|        | 0
  184. ; *                     |              ---------- |                         ----------
  185. ; *                     |              |        | |          OSStkStart---->| 不关心 | -1  低地址
  186. ; *                     |              ---------- -                         ----------
  187. ; *                     ------------->|  长度  | 低地址                   系统硬件堆栈
  188. ; *                                    ----------
  189. ; *                                     用户堆栈                       长度=SP-OSStkStart
  190. ; *********************************************************************************************************
  191. ; */
  192. ; OS_STK *OSTaskStkInit (void (*task)(void *pd) reentrant, void *ppdata, OS_STK *ptos, INT16U opt) reentrant
  193. RSEG  ?PR?_?OSTaskStkInit?OS_CPU_C
  194. _?OSTaskStkInit:
  195. USING 0
  196. ; SOURCE LINE # 73
  197. MOV   DPTR,#0FFFDH
  198. LCALL ?C?ADDXBP
  199. MOV   A,R3
  200. MOVX  @DPTR,A
  201. INC   DPTR
  202. MOV   A,R2
  203. MOVX  @DPTR,A
  204. INC   DPTR
  205. MOV   A,R1
  206. MOVX  @DPTR,A
  207. MOV   DPTR,#0FFFDH
  208. LCALL ?C?ADDXBP
  209. ; {    
  210. ;     OS_STK *stk;
  211. ;     ppdata = ppdata;
  212. ; SOURCE LINE # 77
  213. MOV   DPTR,#06H
  214. LCALL ?C?XBPOFF
  215. MOVX  A,@DPTR
  216. MOV   R3,A
  217. INC   DPTR
  218. MOVX  A,@DPTR
  219. MOV   R2,A
  220. INC   DPTR
  221. MOVX  A,@DPTR
  222. MOV   R1,A
  223. MOV   DPTR,#06H
  224. LCALL ?C?XBPOFF
  225. MOV   A,R3
  226. MOVX  @DPTR,A
  227. INC   DPTR
  228. MOV   A,R2
  229. MOVX  @DPTR,A
  230. INC   DPTR
  231. MOV   A,R1
  232. MOVX  @DPTR,A
  233. ;     opt    = opt;                               //opt没被用到,保留此语句防止告警产生    
  234. ; SOURCE LINE # 78
  235. MOV   DPTR,#0CH
  236. LCALL ?C?XBPOFF
  237. MOVX  A,@DPTR
  238. MOV   R6,A
  239. INC   DPTR
  240. MOVX  A,@DPTR
  241. MOV   R7,A
  242. MOV   DPTR,#0CH
  243. LCALL ?C?XBPOFF
  244. MOV   A,R6
  245. MOVX  @DPTR,A
  246. INC   DPTR
  247. MOV   A,R7
  248. MOVX  @DPTR,A
  249. ;     stk    = ptos;                              //用户堆栈最低有效地址
  250. ; SOURCE LINE # 79
  251. MOV   DPTR,#09H
  252. LCALL ?C?XBPOFF
  253. MOVX  A,@DPTR
  254. MOV   R1,A
  255. INC   DPTR
  256. MOVX  A,@DPTR
  257. MOV   R2,A
  258. INC   DPTR
  259. MOVX  A,@DPTR
  260. MOV   DPH,?C_XBP
  261. MOV   DPL,?C_XBP+01H
  262. XCH   A,R1
  263. MOVX  @DPTR,A
  264. INC   DPTR
  265. MOV   A,R2
  266. MOVX  @DPTR,A
  267. INC   DPTR
  268. MOV   A,R1
  269. MOVX  @DPTR,A
  270. ;     *stk++ = 15;                                //用户堆栈长度
  271. ; SOURCE LINE # 80
  272. MOV   DPH,?C_XBP
  273. MOV   DPL,?C_XBP+01H
  274. MOVX  A,@DPTR
  275. MOV   R3,A
  276. INC   DPTR
  277. CLR   A
  278. MOV   B,#01H
  279. LCALL ?C?ILDIX
  280. MOV   R1,B
  281. MOV   R2,A
  282. MOV   A,#0FH
  283. LCALL ?C?CSTPTR
  284. ;     *stk++ = (INT16U)task & 0xFF;               //任务地址低8位
  285. ; SOURCE LINE # 81
  286. MOV   DPTR,#03H
  287. LCALL ?C?XBPOFF
  288. INC   DPTR
  289. INC   DPTR
  290. MOVX  A,@DPTR
  291. MOV   R7,A
  292. MOV   DPH,?C_XBP
  293. MOV   DPL,?C_XBP+01H
  294. MOVX  A,@DPTR
  295. MOV   R3,A
  296. INC   DPTR
  297. CLR   A
  298. MOV   B,#01H
  299. LCALL ?C?ILDIX
  300. MOV   R1,B
  301. MOV   R2,A
  302. MOV   A,R7
  303. LCALL ?C?CSTPTR
  304. ;     *stk++ = (INT16U)task >> 8;                 //任务地址高8位    
  305. ; SOURCE LINE # 82
  306. MOV   DPTR,#03H
  307. LCALL ?C?XBPOFF
  308. INC   DPTR
  309. MOVX  A,@DPTR
  310. MOV   R2,A
  311. MOV   A,R2
  312. MOV   R7,A
  313. MOV   DPH,?C_XBP
  314. MOV   DPL,?C_XBP+01H
  315. MOVX  A,@DPTR
  316. MOV   R3,A
  317. INC   DPTR
  318. CLR   A
  319. MOV   B,#01H
  320. LCALL ?C?ILDIX
  321. MOV   R1,B
  322. MOV   R2,A
  323. MOV   A,R7
  324. LCALL ?C?CSTPTR
  325. ;     *stk++ = 0x0A;                              //ACC
  326. ; SOURCE LINE # 83
  327. MOV   DPH,?C_XBP
  328. MOV   DPL,?C_XBP+01H
  329. MOVX  A,@DPTR
  330. MOV   R3,A
  331. INC   DPTR
  332. CLR   A
  333. MOV   B,#01H
  334. LCALL ?C?ILDIX
  335. MOV   R1,B
  336. MOV   R2,A
  337. MOV   A,#0AH
  338. LCALL ?C?CSTPTR
  339. ;     *stk++ = 0x0B;                              //B
  340. ; SOURCE LINE # 84
  341. MOV   DPH,?C_XBP
  342. MOV   DPL,?C_XBP+01H
  343. MOVX  A,@DPTR
  344. MOV   R3,A
  345. INC   DPTR
  346. CLR   A
  347. MOV   B,#01H
  348. LCALL ?C?ILDIX
  349. MOV   R1,B
  350. MOV   R2,A
  351. MOV   A,#0BH
  352. LCALL ?C?CSTPTR
  353. ;     *stk++ = 0x00;                              //DPH
  354. ; SOURCE LINE # 85
  355. MOV   DPH,?C_XBP
  356. MOV   DPL,?C_XBP+01H
  357. MOVX  A,@DPTR
  358. MOV   R3,A
  359. INC   DPTR
  360. CLR   A
  361. MOV   B,#01H
  362. LCALL ?C?ILDIX
  363. MOV   R1,B
  364. MOV   R2,A
  365. CLR   A
  366. LCALL ?C?CSTPTR
  367. ;     *stk++ = 0x00;                              //DPL
  368. ; SOURCE LINE # 86
  369. MOV   DPH,?C_XBP
  370. MOV   DPL,?C_XBP+01H
  371. MOVX  A,@DPTR
  372. MOV   R3,A
  373. INC   DPTR
  374. CLR   A
  375. MOV   B,#01H
  376. LCALL ?C?ILDIX
  377. MOV   R1,B
  378. MOV   R2,A
  379. CLR   A
  380. LCALL ?C?CSTPTR
  381. ;     *stk++ = 0x00;                              //PSW
  382. ; SOURCE LINE # 87
  383. MOV   DPH,?C_XBP
  384. MOV   DPL,?C_XBP+01H
  385. MOVX  A,@DPTR
  386. MOV   R3,A
  387. INC   DPTR
  388. CLR   A
  389. MOV   B,#01H
  390. LCALL ?C?ILDIX
  391. MOV   R1,B
  392. MOV   R2,A
  393. CLR   A
  394. LCALL ?C?CSTPTR
  395. ;     *stk++ = 0x00;                              //R0
  396. ; SOURCE LINE # 88
  397. MOV   DPH,?C_XBP
  398. MOV   DPL,?C_XBP+01H
  399. MOVX  A,@DPTR
  400. MOV   R3,A
  401. INC   DPTR
  402. CLR   A
  403. MOV   B,#01H
  404. LCALL ?C?ILDIX
  405. MOV   R1,B
  406. MOV   R2,A
  407. CLR   A
  408. LCALL ?C?CSTPTR
  409. ;     
  410. ;  //R3、R2、R1用于传递任务参数ppdata,其中R3代表存储器类型,R2为高字节偏移,R1为低字节位移。
  411. ;  //通过分析KEIL汇编,了解到任务的void *ppdata参数恰好是用R3、R2、R1传递,不是通过虚拟堆栈。
  412. ;     *stk++ = (INT16U)ppdata & 0xFF;             //R1
  413. ; SOURCE LINE # 92
  414. MOV   DPTR,#06H
  415. LCALL ?C?XBPOFF
  416. INC   DPTR
  417. INC   DPTR
  418. MOVX  A,@DPTR
  419. MOV   R7,A
  420. MOV   DPH,?C_XBP
  421. MOV   DPL,?C_XBP+01H
  422. MOVX  A,@DPTR
  423. MOV   R3,A
  424. INC   DPTR
  425. CLR   A
  426. MOV   B,#01H
  427. LCALL ?C?ILDIX
  428. MOV   R1,B
  429. MOV   R2,A
  430. MOV   A,R7
  431. LCALL ?C?CSTPTR
  432. ;     *stk++ = (INT16U)ppdata >> 8;               //R2
  433. ; SOURCE LINE # 93
  434. MOV   DPTR,#06H
  435. LCALL ?C?XBPOFF
  436. INC   DPTR
  437. MOVX  A,@DPTR
  438. MOV   R2,A
  439. MOV   A,R2
  440. MOV   R7,A
  441. MOV   DPH,?C_XBP
  442. MOV   DPL,?C_XBP+01H
  443. MOVX  A,@DPTR
  444. MOV   R3,A
  445. INC   DPTR
  446. CLR   A
  447. MOV   B,#01H
  448. LCALL ?C?ILDIX
  449. MOV   R1,B
  450. MOV   R2,A
  451. MOV   A,R7
  452. LCALL ?C?CSTPTR
  453. ;     *stk++ = 0x01;                              //R3  因为我用的全是XDATA,所以存储器类型固定为1,见C51.PDF第178页说明。
  454. ; SOURCE LINE # 94
  455. MOV   DPH,?C_XBP
  456. MOV   DPL,?C_XBP+01H
  457. MOVX  A,@DPTR
  458. MOV   R3,A
  459. INC   DPTR
  460. CLR   A
  461. MOV   B,#01H
  462. LCALL ?C?ILDIX
  463. MOV   R1,B
  464. MOV   R2,A
  465. MOV   A,#01H
  466. LCALL ?C?CSTPTR
  467. ;     *stk++ = 0x04;                              //R4
  468. ; SOURCE LINE # 96
  469. MOV   DPH,?C_XBP
  470. MOV   DPL,?C_XBP+01H
  471. MOVX  A,@DPTR
  472. MOV   R3,A
  473. INC   DPTR
  474. CLR   A
  475. MOV   B,#01H
  476. LCALL ?C?ILDIX
  477. MOV   R1,B
  478. MOV   R2,A
  479. MOV   A,#04H
  480. LCALL ?C?CSTPTR
  481. ;     *stk++ = 0x05;                              //R5
  482. ; SOURCE LINE # 97
  483. MOV   DPH,?C_XBP
  484. MOV   DPL,?C_XBP+01H
  485. MOVX  A,@DPTR
  486. MOV   R3,A
  487. INC   DPTR
  488. CLR   A
  489. MOV   B,#01H
  490. LCALL ?C?ILDIX
  491. MOV   R1,B
  492. MOV   R2,A
  493. MOV   A,#05H
  494. LCALL ?C?CSTPTR
  495. ;     *stk++ = 0x06;                              //R6
  496. ; SOURCE LINE # 98
  497. MOV   DPH,?C_XBP
  498. MOV   DPL,?C_XBP+01H
  499. MOVX  A,@DPTR
  500. MOV   R3,A
  501. INC   DPTR
  502. CLR   A
  503. MOV   B,#01H
  504. LCALL ?C?ILDIX
  505. MOV   R1,B
  506. MOV   R2,A
  507. MOV   A,#06H
  508. LCALL ?C?CSTPTR
  509. ;     *stk++ = 0x07;                              //R7
  510. ; SOURCE LINE # 99
  511. MOV   DPH,?C_XBP
  512. MOV   DPL,?C_XBP+01H
  513. MOVX  A,@DPTR
  514. MOV   R3,A
  515. INC   DPTR
  516. CLR   A
  517. MOV   B,#01H
  518. LCALL ?C?ILDIX
  519. MOV   R1,B
  520. MOV   R2,A
  521. MOV   A,#07H
  522. LCALL ?C?CSTPTR
  523. ;                                                 //不用保存SP,任务切换时根据用户堆栈长度计算得出。    
  524. ;     *stk++ = (INT16U) (ptos+MaxStkSize) >> 8;   //?C_XBP 仿真堆栈指针高8位
  525. ; SOURCE LINE # 101
  526. MOV   DPTR,#09H
  527. LCALL ?C?XBPOFF
  528. INC   DPTR
  529. MOVX  A,@DPTR
  530. MOV   R2,A
  531. INC   DPTR
  532. MOVX  A,@DPTR
  533. ADD   A,#064H
  534. CLR   A
  535. ADDC  A,R2
  536. MOV   R7,A
  537. MOV   DPH,?C_XBP
  538. MOV   DPL,?C_XBP+01H
  539. MOVX  A,@DPTR
  540. MOV   R3,A
  541. INC   DPTR
  542. CLR   A
  543. MOV   B,#01H
  544. LCALL ?C?ILDIX
  545. MOV   R1,B
  546. MOV   R2,A
  547. MOV   A,R7
  548. LCALL ?C?CSTPTR
  549. ;     *stk++ = (INT16U) (ptos+MaxStkSize) & 0xFF; //?C_XBP 仿真堆栈指针低8位
  550. ; SOURCE LINE # 102
  551. MOV   DPTR,#09H
  552. LCALL ?C?XBPOFF
  553. INC   DPTR
  554. INC   DPTR
  555. MOVX  A,@DPTR
  556. ADD   A,#064H
  557. MOV   R1,A
  558. MOV   R7,AR1
  559. MOV   DPH,?C_XBP
  560. MOV   DPL,?C_XBP+01H
  561. MOVX  A,@DPTR
  562. MOV   R3,A
  563. INC   DPTR
  564. CLR   A
  565. MOV   B,#01H
  566. LCALL ?C?ILDIX
  567. MOV   R1,B
  568. MOV   R2,A
  569. MOV   A,R7
  570. LCALL ?C?CSTPTR
  571. ;         
  572. ;     return ((void *)ptos);
  573. ; SOURCE LINE # 104
  574. MOV   DPTR,#09H
  575. LCALL ?C?XBPOFF
  576. MOVX  A,@DPTR
  577. MOV   R3,A
  578. INC   DPTR
  579. MOVX  A,@DPTR
  580. MOV   R2,A
  581. INC   DPTR
  582. MOVX  A,@DPTR
  583. MOV   R1,A
  584. ; }
  585. ; SOURCE LINE # 105
  586. ?C0001:
  587. MOV   DPTR,#0EH
  588. LJMP  ?C?ADDXBP
  589. ; END OF _?OSTaskStkInit
  590. ; #if OS_CPU_HOOKS_EN
  591. ; /*
  592. ; *********************************************************************************************************
  593. ; *                                       OS INITIALIZATION HOOK
  594. ; *                                            (BEGINNING)
  595. ; *
  596. ; * Description: This function is called by OSInit() at the beginning of OSInit().
  597. ; *
  598. ; * Arguments  : none
  599. ; *
  600. ; * Note(s)    : 1) Interrupts should be disabled during this call.
  601. ; *********************************************************************************************************
  602. ; */
  603. ; #if OS_VERSION > 203
  604. ; void OSInitHookBegin (void) reentrant
  605. RSEG  ?PR?_?OSInitHookBegin?OS_CPU_C
  606. _?OSInitHookBegin:
  607. ; SOURCE LINE # 122
  608. ; {
  609. ; }
  610. ; SOURCE LINE # 125
  611. RET  
  612. ; END OF _?OSInitHookBegin
  613. ; #endif
  614. ; /*
  615. ; *********************************************************************************************************
  616. ; *                                       OS INITIALIZATION HOOK
  617. ; *                                               (END)
  618. ; *
  619. ; * Description: This function is called by OSInit() at the end of OSInit().
  620. ; *
  621. ; * Arguments  : none
  622. ; *
  623. ; * Note(s)    : 1) Interrupts should be disabled during this call.
  624. ; *********************************************************************************************************
  625. ; */
  626. ; #if OS_VERSION > 203
  627. ; void OSInitHookEnd (void) reentrant
  628. RSEG  ?PR?_?OSInitHookEnd?OS_CPU_C
  629. _?OSInitHookEnd:
  630. ; SOURCE LINE # 141
  631. ; {
  632. ; }
  633. ; SOURCE LINE # 143
  634. RET  
  635. ; END OF _?OSInitHookEnd
  636. ; #endif
  637. ; /*
  638. ; *********************************************************************************************************
  639. ; *                                          任务创建钩挂函数
  640. ; *
  641. ; * 描述       : 任务创建时调用
  642. ; *
  643. ; * 参数       : ptcb是指向将被创建任务的任务控制块的指针。
  644. ; *
  645. ; * 注意       : 1) 调用期间中断被禁止
  646. ; *********************************************************************************************************
  647. ; */
  648. ; void OSTaskCreateHook (OS_TCB *ptcb) reentrant
  649. RSEG  ?PR?_?OSTaskCreateHook?OS_CPU_C
  650. _?OSTaskCreateHook:
  651. USING 0
  652. ; SOURCE LINE # 157
  653. MOV   DPTR,#0FFFDH
  654. LCALL ?C?ADDXBP
  655. MOV   A,R3
  656. MOVX  @DPTR,A
  657. INC   DPTR
  658. MOV   A,R2
  659. MOVX  @DPTR,A
  660. INC   DPTR
  661. MOV   A,R1
  662. MOVX  @DPTR,A
  663. ; {
  664. ;     ptcb = ptcb;                       /* Prevent compiler warning                                     */
  665. ; SOURCE LINE # 159
  666. MOV   DPH,?C_XBP
  667. MOV   DPL,?C_XBP+01H
  668. MOVX  A,@DPTR
  669. MOV   R1,A
  670. INC   DPTR
  671. MOVX  A,@DPTR
  672. MOV   R2,A
  673. INC   DPTR
  674. MOVX  A,@DPTR
  675. MOV   DPH,?C_XBP
  676. MOV   DPL,?C_XBP+01H
  677. XCH   A,R1
  678. MOVX  @DPTR,A
  679. INC   DPTR
  680. MOV   A,R2
  681. MOVX  @DPTR,A
  682. INC   DPTR
  683. MOV   A,R1
  684. MOVX  @DPTR,A
  685. ; }
  686. ; SOURCE LINE # 160
  687. MOV   DPTR,#03H
  688. LJMP  ?C?ADDXBP
  689. ; END OF _?OSTaskCreateHook
  690. ; /*
  691. ; *********************************************************************************************************
  692. ; *                                          任务删除钩挂函数
  693. ; *
  694. ; * 描述       : 任务删除时调用
  695. ; *
  696. ; * 参数       : ptcb是指向将被删除任务的任务控制块的指针。
  697. ; *
  698. ; * 注意       : 1) 调用期间中断被禁止
  699. ; *********************************************************************************************************
  700. ; */
  701. ; #if OS_TASK_DEL_EN > 0
  702. ; void OSTaskDelHook (OS_TCB *ptcb) reentrant
  703. ; {
  704. ;     ptcb = ptcb;                       /* Prevent compiler warning                                     */
  705. ; }
  706. ; #endif
  707. ; /*
  708. ; *********************************************************************************************************
  709. ; *                                          任务切换钩挂函数
  710. ; *
  711. ; * 描述       : 执行任务切换时调用。这允许你在上下文切换期间执行其它操作。
  712. ; *
  713. ; * 参数       : 无
  714. ; *
  715. ; * 注意       : 1) 调用期间中断被禁止
  716. ; *              2) 假定全局指针'OSTCBHighRdy'已经指向了将要被换入的任务控制块(即:最高优先级任务),并且
  717. ; *                 'OSTCBCur'指向了将被换出的任务(即:当前任务)。
  718. ; *********************************************************************************************************
  719. ; */
  720. ; void OSTaskSwHook (void) reentrant
  721. RSEG  ?PR?_?OSTaskSwHook?OS_CPU_C
  722. _?OSTaskSwHook:
  723. ; SOURCE LINE # 194
  724. ; {
  725. ; }
  726. ; SOURCE LINE # 196
  727. RET  
  728. ; END OF _?OSTaskSwHook
  729. ; /*
  730. ; *********************************************************************************************************
  731. ; *                                          统计任务钩挂函数
  732. ; *
  733. ; * 描述       : 这个函数每秒钟被uC/OS-II统计任务调用。这么做使你的应用程序可以增加统计任务的功能。
  734. ; *
  735. ; * 注意       : 无
  736. ; *********************************************************************************************************
  737. ; */
  738. ; #if OS_TASK_STAT_EN > 0
  739. ; void OSTaskStatHook (void) reentrant
  740. ; {
  741. ; }
  742. ; #endif
  743. ; /*
  744. ; *********************************************************************************************************
  745. ; *                                           OSTCBInit() HOOK
  746. ; *
  747. ; * Description: This function is called by OSTCBInit() after setting up most of the TCB.
  748. ; *
  749. ; * Arguments  : ptcb    is a pointer to the TCB of the task being created.
  750. ; *
  751. ; * Note(s)    : 1) Interrupts may or may not be ENABLED during this call.
  752. ; *********************************************************************************************************
  753. ; */
  754. ; #if OS_VERSION > 203
  755. ; void OSTCBInitHook (OS_TCB *ptcb) reentrant
  756. RSEG  ?PR?_?OSTCBInitHook?OS_CPU_C
  757. _?OSTCBInitHook:
  758. USING 0
  759. ; SOURCE LINE # 225
  760. MOV   DPTR,#0FFFDH
  761. LCALL ?C?ADDXBP
  762. MOV   A,R3
  763. MOVX  @DPTR,A
  764. INC   DPTR
  765. MOV   A,R2
  766. MOVX  @DPTR,A
  767. INC   DPTR
  768. MOV   A,R1
  769. MOVX  @DPTR,A
  770. ; {
  771. ;     ptcb = ptcb;                                           /* Prevent Compiler warning                 */
  772. ; SOURCE LINE # 227
  773. MOV   DPH,?C_XBP
  774. MOV   DPL,?C_XBP+01H
  775. MOVX  A,@DPTR
  776. MOV   R1,A
  777. INC   DPTR
  778. MOVX  A,@DPTR
  779. MOV   R2,A
  780. INC   DPTR
  781. MOVX  A,@DPTR
  782. MOV   DPH,?C_XBP
  783. MOV   DPL,?C_XBP+01H
  784. XCH   A,R1
  785. MOVX  @DPTR,A
  786. INC   DPTR
  787. MOV   A,R2
  788. MOVX  @DPTR,A
  789. INC   DPTR
  790. MOV   A,R1
  791. MOVX  @DPTR,A
  792. ; }
  793. ; SOURCE LINE # 228
  794. MOV   DPTR,#03H
  795. LJMP  ?C?ADDXBP
  796. ; END OF _?OSTCBInitHook
  797. ; #endif
  798. ; /*
  799. ; *********************************************************************************************************
  800. ; *                                          定时钩挂函数
  801. ; *
  802. ; * 描述       : 本函数每一滴答被调用一次。
  803. ; *
  804. ; * 参数       : 无
  805. ; *
  806. ; * 注意       : 1) 在本调用期间中断可以或不可以使能。
  807. ; *********************************************************************************************************
  808. ; */
  809. ; void OSTimeTickHook (void) reentrant
  810. RSEG  ?PR?_?OSTimeTickHook?OS_CPU_C
  811. _?OSTimeTickHook:
  812. ; SOURCE LINE # 242
  813. ; {
  814. ; }
  815. ; SOURCE LINE # 244
  816. RET  
  817. ; END OF _?OSTimeTickHook
  818. ; /*
  819. ; *********************************************************************************************************
  820. ; *                                             IDLE TASK HOOK
  821. ; *
  822. ; * Description: This function is called by the idle task.  This hook has been added to allow you to do  
  823. ; *              such things as STOP the CPU to conserve power.
  824. ; *
  825. ; * Arguments  : none
  826. ; *
  827. ; * Note(s)    : 1) Interrupts are enabled during this call.
  828. ; *********************************************************************************************************
  829. ; */
  830. ; #if OS_VERSION >= 251
  831. ; void OSTaskIdleHook (void) reentrant
  832. RSEG  ?PR?_?OSTaskIdleHook?OS_CPU_C
  833. _?OSTaskIdleHook:
  834. ; SOURCE LINE # 259
  835. ; {
  836. ; }
  837. ; SOURCE LINE # 261
  838. RET  
  839. ; END OF _?OSTaskIdleHook
  840. ; #endif
  841. ; #endif
  842. ; /*
  843. ;    使用C语言的中断处理函数有助与提高程序的移植性。建议中断程序不要太长,如果长则使用信号量来与任务同步,
  844. ;    在外部任务中实现大量的处理。
  845. ;    中断处理例程都放在下面。
  846. ; */
  847. ; void UserTickTimer(void)
  848. RSEG  ?PR?UserTickTimer?OS_CPU_C
  849. UserTickTimer:
  850. ; SOURCE LINE # 272
  851. ; {
  852. ; SOURCE LINE # 273
  853. ;     TH0=0x70;     //普通51定时器方式1,必须在发生中断时,重新赋值并再次启动计时
  854. ; SOURCE LINE # 274
  855. MOV   TH0,#070H
  856. ;     TL0=0;             //Tick=50次/秒(即0.02秒/次),晶振22.1184M
  857. ; SOURCE LINE # 275
  858. CLR   A
  859. MOV   TL0,A
  860. ;     TR0=1;
  861. ; SOURCE LINE # 276
  862. SETB  TR0
  863. ; }
  864. ; SOURCE LINE # 277
  865. RET  
  866. ; END OF UserTickTimer
  867. CSEG AT 0000BH
  868. LJMP OSTickISR
  869. ; /* 
  870. ;   ucOS-II系统时钟中断处理程序
  871. ; */
  872. ; void OSTickISR(void) interrupt 1
  873. RSEG  ?PR?OSTickISR?OS_CPU_C
  874. USING 0
  875. OSTickISR:
  876. PUSH  ACC
  877. PUSH  B
  878. PUSH  DPH
  879. PUSH  DPL
  880. PUSH  PSW
  881. MOV   PSW,#00H
  882. PUSH  AR0
  883. PUSH  AR1
  884. PUSH  AR2
  885. PUSH  AR3
  886. PUSH  AR4
  887. PUSH  AR5
  888. PUSH  AR6
  889. PUSH  AR7
  890. USING 0
  891. ; SOURCE LINE # 282
  892. ; {
  893. ;     OSIntEnter(); // Must be called first at every hardware interrupt entry point 
  894. ; SOURCE LINE # 284
  895. LCALL _?OSIntEnter
  896. ;     UserTickTimer(); // User functions can be called here.
  897. ; SOURCE LINE # 285
  898. LCALL UserTickTimer
  899. ;     OSTimeTick(); // Must be called during tick isr 
  900. ; SOURCE LINE # 286
  901. LCALL _?OSTimeTick
  902. ;     OSIntExit(); // Must be called finally at every hardware interupt exit point 
  903. ; SOURCE LINE # 287
  904. LCALL _?OSIntExit
  905. ; }
  906. ; SOURCE LINE # 288
  907. POP   AR7
  908. POP   AR6
  909. POP   AR5
  910. POP   AR4
  911. POP   AR3
  912. POP   AR2
  913. POP   AR1
  914. POP   AR0
  915. POP   PSW
  916. POP   DPL
  917. POP   DPH
  918. POP   B
  919. POP   ACC
  920. RETI 
  921. ; END OF OSTickISR
  922. CSEG AT 00023H
  923. LJMP SerialISR
  924. ; /*--------------------------------------------------------------*/
  925. ; /* ucOS-II的中断服务程序示例                                    */
  926. ; /*--------------------------------------------------------------*/
  927. ; #include "sourceserial.h"
  928. ; void SerialISR(void) interrupt 4
  929. RSEG  ?PR?SerialISR?OS_CPU_C
  930. USING 0
  931. SerialISR:
  932. PUSH  ACC
  933. PUSH  B
  934. PUSH  DPH
  935. PUSH  DPL
  936. PUSH  PSW
  937. MOV   PSW,#00H
  938. PUSH  AR0
  939. PUSH  AR1
  940. PUSH  AR2
  941. PUSH  AR3
  942. PUSH  AR4
  943. PUSH  AR5
  944. PUSH  AR6
  945. PUSH  AR7
  946. USING 0
  947. ; SOURCE LINE # 295
  948. ; {
  949. ; #if OS_CRITICAL_METHOD == 3         // Allocate storage for CPU status register 
  950. ;     OS_CPU_SR  cpu_sr;
  951. ; #endif 
  952. ;     OSIntEnter(); // Must be called first at every hardware interrupt entry point 
  953. ; SOURCE LINE # 301
  954. LCALL _?OSIntEnter
  955. ;     OS_ENTER_CRITICAL();
  956. ; SOURCE LINE # 302
  957. CLR   EA
  958. ;     if(TI)
  959. ; SOURCE LINE # 303
  960. JNB   TI,?C0011
  961. ;  {
  962. ; SOURCE LINE # 304
  963. ;    TI=0;
  964. ; SOURCE LINE # 305
  965. CLR   TI
  966. ;       pc_send.ptr++;
  967. ; SOURCE LINE # 306
  968. MOV   DPTR,#pc_send+04H
  969. MOVX  A,@DPTR
  970. INC   A
  971. MOVX  @DPTR,A
  972. JNZ   ?C0017
  973. MOV   DPTR,#pc_send+03H
  974. MOVX  A,@DPTR
  975. INC   A
  976. MOVX  @DPTR,A
  977. ?C0017:
  978. ;       if (pc_send.ptr < pc_send.count)
  979. ; SOURCE LINE # 307
  980. MOV   DPTR,#pc_send+05H
  981. MOVX  A,@DPTR
  982. MOV   R6,A
  983. INC   DPTR
  984. MOVX  A,@DPTR
  985. MOV   R7,A
  986. MOV   DPTR,#pc_send+03H
  987. MOVX  A,@DPTR
  988. MOV   R4,A
  989. INC   DPTR
  990. MOVX  A,@DPTR
  991. MOV   R5,A
  992. CLR   C
  993. SUBB  A,R7
  994. MOV   A,R6
  995. XRL   A,#080H
  996. MOV   R0,A
  997. MOV   A,R4
  998. XRL   A,#080H
  999. SUBB  A,R0
  1000. JNC   ?C0013
  1001. ;         SBUF=pc_send.buffer[pc_send.ptr];
  1002. ; SOURCE LINE # 308
  1003. MOV   DPTR,#pc_send
  1004. MOVX  A,@DPTR
  1005. MOV   R3,A
  1006. INC   DPTR
  1007. MOVX  A,@DPTR
  1008. MOV   R2,A
  1009. INC   DPTR
  1010. MOVX  A,@DPTR
  1011. MOV   R1,A
  1012. MOV   DPL,R5
  1013. MOV   DPH,R4
  1014. LCALL ?C?CLDOPTR
  1015. MOV   SBUF,A
  1016. ;  }
  1017. ; SOURCE LINE # 309
  1018. SJMP  ?C0013
  1019. ?C0011:
  1020. ;  else if(RI)
  1021. ; SOURCE LINE # 310
  1022. JNB   RI,?C0013
  1023. ;  {
  1024. ; SOURCE LINE # 311
  1025. ;      RI=0;
  1026. ; SOURCE LINE # 312
  1027. CLR   RI
  1028. ; //处理输入字符
  1029. ;  }
  1030. ; SOURCE LINE # 314
  1031. ?C0013:
  1032. ;     OS_EXIT_CRITICAL();
  1033. ; SOURCE LINE # 315
  1034. SETB  EA
  1035. ;     OSIntExit(); // Must be called finally at every hardware interupt exit point 
  1036. ; SOURCE LINE # 317
  1037. LCALL _?OSIntExit
  1038. ; }
  1039. ; SOURCE LINE # 318
  1040. POP   AR7
  1041. POP   AR6
  1042. POP   AR5
  1043. POP   AR4
  1044. POP   AR3
  1045. POP   AR2
  1046. POP   AR1
  1047. POP   AR0
  1048. POP   PSW
  1049. POP   DPL
  1050. POP   DPH
  1051. POP   B
  1052. POP   ACC
  1053. RETI 
  1054. ; END OF SerialISR
  1055. ; /*
  1056. ;   设置硬件寄存器的初始值。
  1057. ;   初始化定时器0,作为ucOS-II的系统时钟。
  1058. ;   还有其他的与硬件相关的初始化也可以放在这里。
  1059. ; */
  1060. ; //串口初始化  0xfd=19200,0xfa=9600,0xf4=4800,0xe8=2400,0xd0=1200
  1061. ; void InitHardware(void) reentrant
  1062. RSEG  ?PR?_?InitHardware?OS_CPU_C
  1063. _?InitHardware:
  1064. ; SOURCE LINE # 328
  1065. ; {   
  1066. ;     TMOD = 0x21;   //定时器0:模式1(16位定时器),仅受TR0控制;定时器1:波特率发生器
  1067. ; SOURCE LINE # 330
  1068. MOV   TMOD,#021H
  1069. ;     TH0  = 0x70;   //定义Tick=50次/秒(即0.02秒/次),TH,TL值与CPU的频率有关(22.1184M)
  1070. ; SOURCE LINE # 331
  1071. MOV   TH0,#070H
  1072. ;     TL0  = 0x00;   //OS_CPU_C.C中定时器中断响应也要设置,OS_CFG.H中OS_TICKS_PER_SEC也有关系
  1073. ; SOURCE LINE # 332
  1074. CLR   A
  1075. MOV   TL0,A
  1076. ;     //ET0  = 1;    //允许T0中断(在第一个任务开始执行时才开时钟中断,否则万一中断系统进入不可知状态)
  1077. ;     TR0  = 1;
  1078. ; SOURCE LINE # 334
  1079. SETB  TR0
  1080. ;     TH1   = 0xFA;  //晶振22.1084, 波特率 9600
  1081. ; SOURCE LINE # 336
  1082. MOV   TH1,#0FAH
  1083. ;     ET1   = 0;
  1084. ; SOURCE LINE # 337
  1085. CLR   ET1
  1086. ;     TR1   = 1;    //start timer1
  1087. ; SOURCE LINE # 338
  1088. SETB  TR1
  1089. ;     SCON  = 0x50;
  1090. ; SOURCE LINE # 339
  1091. MOV   SCON,#050H
  1092. ;     ES   = 1;
  1093. ; SOURCE LINE # 340
  1094. SETB  ES
  1095. ;     //设置串口收发的初始值
  1096. ;     pc_send.ptr=0;
  1097. ; SOURCE LINE # 343
  1098. MOV   DPTR,#pc_send+03H
  1099. MOVX  @DPTR,A
  1100. INC   DPTR
  1101. MOVX  @DPTR,A
  1102. ;     pc_send.count=0;
  1103. ; SOURCE LINE # 344
  1104. INC   DPTR
  1105. MOVX  @DPTR,A
  1106. INC   DPTR
  1107. MOVX  @DPTR,A
  1108. ;  ET0=1;  //开时钟节拍中断
  1109. ; SOURCE LINE # 345
  1110. SETB  ET0
  1111. ; } ; SOURCE LINE # 346
  1112. RET  
  1113. ; END OF _?InitHardware
  1114. END