📄 hal_sleep.lst
字号:
262 * @brief This function is called from the OSAL task loop using and existing OSAL
263 * interface. It sets the low power mode of the MAC and the CC2430.
264 *
265 * input parameters
266 *
267 * @param osal_timeout - Next OSAL timer timeout.
268 *
269 * output parameters
270 *
271 * None.
272 *
273 * @return None.
274 **************************************************************************************************
275 */
\ In segment BANKED_CODE, align 1, keep-with-next
276 void halSleep( uint16 osal_timeout )
\ halSleep:
277 {
\ 000000 74F0 MOV A,#-0x10
\ 000002 12.... LCALL ?BANKED_ENTER_XDATA
\ 000005 ; Saved register size: 16
\ 000005 ; Auto size: 5
\ 000005 74FB MOV A,#-0x5
\ 000007 12.... LCALL ?ALLOC_XSTACK8
\ 00000A EA MOV A,R2
\ 00000B FE MOV R6,A
\ 00000C EB MOV A,R3
\ 00000D FF MOV R7,A
278 uint32 timeout;
279 uint32 macTimeout;
280 halIntState_t intState, ien0, ien1, ien2;
281
282 halAccumulatedSleepTime = 0;
\ 00000E 90.... MOV DPTR,#__Constant_0
\ 000011 78.. MOV R0,#?V0 + 0
\ 000013 12.... LCALL ?L_MOV_X
\ 000016 90.... MOV DPTR,#??halAccumulatedSleepTime
\ 000019 78.. MOV R0,#?V0 + 0
\ 00001B 12.... LCALL ?L_MOV_TO_X
283
284 /* get next OSAL timer expiration converted to 320 usec units */
285 timeout = HAL_SLEEP_MS_TO_320US(osal_timeout);
\ 00001E 8E.. MOV ?V0 + 4,R6
\ 000020 8F.. MOV ?V0 + 5,R7
\ 000022 75..00 MOV ?V0 + 6,#0x0
\ 000025 75..00 MOV ?V0 + 7,#0x0
\ 000028 90.... MOV DPTR,#__Constant_64
\ 00002B 78.. MOV R0,#?V0 + 0
\ 00002D 12.... LCALL ?L_MOV_X
\ 000030 78.. MOV R0,#?V0 + 4
\ 000032 79.. MOV R1,#?V0 + 0
\ 000034 12.... LCALL ?L_MUL
\ 000037 90.... MOV DPTR,#__Constant_1f
\ 00003A 78.. MOV R0,#?V0 + 4
\ 00003C 12.... LCALL ?L_ADD_X
\ 00003F 7405 MOV A,#0x5
\ 000041 78.. MOV R0,#?V0 + 4
\ 000043 12.... LCALL ?UL_SHR
\ 000046 7401 MOV A,#0x1
\ 000048 12.... LCALL ?XSTACK_DISP0_8
\ 00004B 78.. MOV R0,#?V0 + 4
\ 00004D 12.... LCALL ?L_MOV_TO_X
286 if (timeout == 0)
\ 000050 7401 MOV A,#0x1
\ 000052 12.... LCALL ?XSTACK_DISP0_8
\ 000055 C082 PUSH DPL
\ 000057 C083 PUSH DPH
\ 000059 90.... MOV DPTR,#__Constant_0
\ 00005C 78.. MOV R0,#?V0 + 0
\ 00005E 12.... LCALL ?L_MOV_X
\ 000061 D083 POP DPH
\ 000063 D082 POP DPL
\ 000065 78.. MOV R0,#?V0 + 0
\ 000067 12.... LCALL ?L_EQ_X
\ 00006A 90.... MOV DPTR,#(MAC_PwrNextTimeout & 0xffff)
\ 00006D 700F JNZ ??halSleep_0
287 {
288 timeout = MAC_PwrNextTimeout();
\ 00006F ; Setup parameters for call to function MAC_PwrNextTimeout
\ 00006F 74.. MOV A,#((MAC_PwrNextTimeout >> 16) & 0xff)
\ 000071 12.... LCALL ?BCALL ; Banked call to: DPTR()
\ 000074 8A.. MOV ?V0 + 0,R2
\ 000076 8B.. MOV ?V0 + 1,R3
\ 000078 8C.. MOV ?V0 + 2,R4
\ 00007A 8D.. MOV ?V0 + 3,R5
\ 00007C 802A SJMP ??halSleep_1
289 }
290 else
291 {
292 /* get next MAC timer expiration */
293 macTimeout = MAC_PwrNextTimeout();
\ ??halSleep_0:
\ 00007E ; Setup parameters for call to function MAC_PwrNextTimeout
\ 00007E 74.. MOV A,#((MAC_PwrNextTimeout >> 16) & 0xff)
\ 000080 12.... LCALL ?BCALL ; Banked call to: DPTR()
\ 000083 8A.. MOV ?V0 + 0,R2
\ 000085 8B.. MOV ?V0 + 1,R3
\ 000087 8C.. MOV ?V0 + 2,R4
\ 000089 8D.. MOV ?V0 + 3,R5
294
295 /* get lesser of two timeouts */
296 if ((macTimeout != 0) && (macTimeout < timeout))
\ 00008B 90.... MOV DPTR,#__Constant_0
\ 00008E 78.. MOV R0,#?V0 + 0
\ 000090 12.... LCALL ?L_EQ_X
\ 000093 6041 JZ ??halSleep_2
\ 000095 7401 MOV A,#0x1
\ 000097 12.... LCALL ?XSTACK_DISP0_8
\ 00009A 78.. MOV R0,#?V0 + 4
\ 00009C 12.... LCALL ?L_MOV_X
\ 00009F 78.. MOV R0,#?V0 + 4
\ 0000A1 79.. MOV R1,#?V0 + 0
\ 0000A3 12.... LCALL ?UL_GT
\ 0000A6 502E JNC ??halSleep_2
297 {
298 timeout = macTimeout;
\ ??halSleep_1:
\ 0000A8 7401 MOV A,#0x1
\ 0000AA 12.... LCALL ?XSTACK_DISP0_8
\ 0000AD 78.. MOV R0,#?V0 + 0
\ 0000AF 12.... LCALL ?L_MOV_TO_X
299 }
300 }
301
302 /* HAL_SLEEP_PM2 is entered only if the timeout is zero and
303 * the device is a stimulated device.
304 */
305 halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER;
\ 0000B2 7401 MOV A,#0x1
\ 0000B4 12.... LCALL ?XSTACK_DISP0_8
\ 0000B7 C082 PUSH DPL
\ 0000B9 C083 PUSH DPH
\ 0000BB 90.... MOV DPTR,#__Constant_0
\ 0000BE 78.. MOV R0,#?V0 + 0
\ 0000C0 12.... LCALL ?L_MOV_X
\ 0000C3 D083 POP DPH
\ 0000C5 D082 POP DPL
\ 0000C7 78.. MOV R0,#?V0 + 0
\ 0000C9 12.... LCALL ?L_EQ_X
\ 0000CC 7008 JNZ ??halSleep_2
\ 0000CE 7403 MOV A,#0x3
\ 0000D0 90.... MOV DPTR,#??halPwrMgtMode
\ 0000D3 F0 MOVX @DPTR,A
\ 0000D4 804F SJMP ??halSleep_3
\ ??halSleep_2:
\ 0000D6 7402 MOV A,#0x2
\ 0000D8 90.... MOV DPTR,#??halPwrMgtMode
\ 0000DB F0 MOVX @DPTR,A
\ 0000DC 90.... MOV DPTR,#??halSleepLevel
\ 0000DF E0 MOVX A,@DPTR
\ 0000E0 C3 CLR C
\ 0000E1 9402 SUBB A,#0x2
\ 0000E3 5005 JNC ??halSleep_4
306
307 /* The sleep mode is also controlled by halSleepLevel which
308 * defined the deepest level of sleep allowed. This is applied
309 * to timer sleep only.
310 */
311 if ( timeout > 0 && halPwrMgtMode > halSleepLevel )
312 {
313 halPwrMgtMode = halSleepLevel;
\ 0000E5 E0 MOVX A,@DPTR
\ 0000E6 90.... MOV DPTR,#??halPwrMgtMode
\ 0000E9 F0 MOVX @DPTR,A
314 }
315
316 /* Allow PM1 only.
317 * AN044 - RESTRICT USE TO PM1 ONLY
318 */
319 #if defined (PM1_ONLY) && (PM1_ONLY == TRUE)
320 if (timeout > 0)
321 {
322 halPwrMgtMode = CC2430_PM1;
323 }
324 else
325 {
326 /* do not allow PM3 either */
327 return;
328 }
329 #endif
330
331 /* DEEP sleep can only be entered when zgPollRate == 0.
332 * This is to eliminate any possibility of entering PM3 between
333 * two network timers.
334 */
335 #if !defined (RTR_NWK) && defined (NWK_AUTO_POLL)
336 if ((timeout > HAL_SLEEP_MS_TO_320US(PM_MIN_SLEEP_TIME)) ||
337 (timeout == 0 && zgPollRate == 0))
\ ??halSleep_4:
\ 0000EA 7401 MOV A,#0x1
\ 0000EC 12.... LCALL ?XSTACK_DISP0_8
\ 0000EF C082 PUSH DPL
\ 0000F1 C083 PUSH DPH
\ 0000F3 90.... MOV DPTR,#__Constant_2d
\ 0000F6 78.. MOV R0,#?V0 + 0
\ 0000F8 12.... LCALL ?L_MOV_X
\ 0000FB D083 POP DPH
\ 0000FD D082 POP DPL
\ 0000FF 78.. MOV R0,#?V0 + 0
\ 000101 12.... LCALL ?UL_GT_X
\ 000104 502C JNC ??halSleep_5
\ 000106 7401 MOV A,#0x1
\ 000108 12.... LCALL ?XSTACK_DISP0_8
\ 00010B C082 PUSH DPL
\ 00010D C083 PUSH DPH
\ 00010F 90.... MOV DPTR,#__Constant_0
\ 000112 78.. MOV R0,#?V0 + 0
\ 000114 12.... LCALL ?L_MOV_X
\ 000117 D083 POP DPH
\ 000119 D082 POP DPL
\ 00011B 78.. MOV R0,#?V0 + 0
\ 00011D 12.... LCALL ?L_EQ_X
\ 000120 6003 JZ $+5
\ 000122 02.... LJMP ??halSleep_6 & 0xFFFF
\ ??halSleep_3:
\ 000125 90.... MOV DPTR,#zgPollRate
\ 000128 E0 MOVX A,@DPTR
\ 000129 7002 JNZ ??halSleep_7
\ 00012B A3 INC DPTR
\ 00012C E0 MOVX A,@DPTR
\ ??halSleep_7:
\ 00012D 6003 JZ $+5
\ 00012F 02.... LJMP ??halSleep_6 & 0xFFFF
338 #else
339 if ((timeout > HAL_SLEEP_MS_TO_320US(PM_MIN_SLEEP_TIME)) ||
340 (timeout == 0))
341 #endif
342 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -