📄 mac_backoff_timer.lst
字号:
177 *
178 * @brief Sets the count of the backoff timer.
179 *
180 * @param backoff - new count
181 *
182 * @return none
183 **************************************************************************************************
184 */
\ In segment BANKED_CODE, align 1, keep-with-next
185 void macBackoffTimerSetCount(uint32 backoff)
\ macBackoffTimerSetCount:
186 {
\ 000000 74F0 MOV A,#-0x10
\ 000002 12.... LCALL ?BANKED_ENTER_XDATA
\ 000005 ; Saved register size: 16
\ 000005 ; Auto size: 0
\ 000005 8A.. MOV ?V0 + 0,R2
\ 000007 8B.. MOV ?V0 + 1,R3
\ 000009 8C.. MOV ?V0 + 2,R4
\ 00000B 8D.. MOV ?V0 + 3,R5
187 halIntState_t s;
188
189 MAC_ASSERT(compareState == COMPARE_STATE_ROLLOVER); /* trigger cannot be active if changing count */
\ 00000D 90.... MOV DPTR,#??compareState
\ 000010 E0 MOVX A,@DPTR
\ 000011 6401 XRL A,#0x1
\ 000013 6008 JZ ??macBackoffTimerSetCount_0
\ 000015 ; Setup parameters for call to function halAssertHandler
\ 000015 90.... MOV DPTR,#(halAssertHandler & 0xffff)
\ 000018 74.. MOV A,#((halAssertHandler >> 16) & 0xff)
\ 00001A 12.... LCALL ?BCALL ; Banked call to: DPTR()
190 MAC_ASSERT(backoff < backoffTimerRollover); /* count must be less than rollover value */
\ ??macBackoffTimerSetCount_0:
\ 00001D 90.... MOV DPTR,#??backoffTimerRollover
\ 000020 78.. MOV R0,#?V0 + 4
\ 000022 12.... LCALL ?L_MOV_X
\ 000025 78.. MOV R0,#?V0 + 4
\ 000027 79.. MOV R1,#?V0 + 0
\ 000029 12.... LCALL ?UL_GT
\ 00002C 4008 JC ??macBackoffTimerSetCount_1
\ 00002E ; Setup parameters for call to function halAssertHandler
\ 00002E 90.... MOV DPTR,#(halAssertHandler & 0xffff)
\ 000031 74.. MOV A,#((halAssertHandler >> 16) & 0xff)
\ 000033 12.... LCALL ?BCALL ; Banked call to: DPTR()
191
192 HAL_ENTER_CRITICAL_SECTION(s);
\ ??macBackoffTimerSetCount_1:
\ 000036 A2AF MOV C,0xa8.7
\ 000038 E4 CLR A
\ 000039 92E0 MOV 0xE0 /* A */.0,C
\ 00003B FE MOV R6,A
\ 00003C C2AF CLR 0xa8.7
193 MAC_RADIO_BACKOFF_SET_COUNT(backoff);
\ 00003E ; Setup parameters for call to function macMcuOverflowSetCount
\ 00003E AA.. MOV R2,?V0 + 0
\ 000040 AB.. MOV R3,?V0 + 1
\ 000042 AC.. MOV R4,?V0 + 2
\ 000044 AD.. MOV R5,?V0 + 3
\ 000046 90.... MOV DPTR,#(macMcuOverflowSetCount & 0xffff)
\ 000049 74.. MOV A,#((macMcuOverflowSetCount >> 16) & 0xff)
\ 00004B 80.. SJMP ??Subroutine2_0
194 HAL_EXIT_CRITICAL_SECTION(s);
195 }
196
197
198 /**************************************************************************************************
199 * @fn macBackoffTimerCount
200 *
201 * @brief Returns the current backoff count.
202 *
203 * @param none
204 *
205 * @return current backoff count
206 **************************************************************************************************
207 */
\ In segment BANKED_CODE, align 1, keep-with-next
208 uint32 macBackoffTimerCount(void)
\ macBackoffTimerCount:
209 {
\ 000000 74F0 MOV A,#-0x10
\ 000002 12.... LCALL ?BANKED_ENTER_XDATA
\ 000005 ; Saved register size: 16
\ 000005 ; Auto size: 0
210 halIntState_t s;
211 uint32 backoffCount;
212
213 HAL_ENTER_CRITICAL_SECTION(s);
\ 000005 A2AF MOV C,0xa8.7
\ 000007 E4 CLR A
\ 000008 92E0 MOV 0xE0 /* A */.0,C
\ 00000A FE MOV R6,A
\ 00000B C2AF CLR 0xa8.7
214 backoffCount = MAC_RADIO_BACKOFF_COUNT();
\ 00000D ; Setup parameters for call to function macMcuOverflowCount
\ 00000D 90.... MOV DPTR,#(macMcuOverflowCount & 0xffff)
\ 000010 74.. MOV A,#((macMcuOverflowCount >> 16) & 0xff)
\ 000012 12.... LCALL ?BCALL ; Banked call to: DPTR()
\ 000015 8A.. MOV ?V0 + 0,R2
\ 000017 8B.. MOV ?V0 + 1,R3
\ 000019 8C.. MOV ?V0 + 2,R4
\ 00001B 8D.. MOV ?V0 + 3,R5
215 HAL_EXIT_CRITICAL_SECTION(s);
\ 00001D EE MOV A,R6
\ 00001E A2E0 MOV C,0xE0 /* A */.0
\ 000020 92AF MOV 0xa8.7,C
216
217 #ifdef MAC_RADIO_FEATURE_HARDWARE_OVERFLOW_NO_ROLLOVER
218 /*
219 * Extra processing is required if the radio has a special hardware overflow
220 * count feature. Unfortunately this feature does not provide for setting a
221 * rollover value. This must be done manually.
222 *
223 * This means there is a small window in time when reading the hardware count
224 * will be inaccurate. It's possible it could be one more than the allowable
225 * count. This happens if the count has just incremented beyond the maximum
226 * and is queried before the ISR has a chance to run and reset the backoff
227 * count back to zero. (Pure software implementation of backoff count does
228 * not have this problem.)
229 *
230 * To solve this, before returning a value for the backoff count, the value
231 * must be tested to see if it is beyond the maximum value. If so, a rollover
232 * interrupt that will set backoff count to zero is imminent. In that case,
233 * the correct backoff count of zero is returned.
234 */
235 if (backoffCount >= backoffTimerRollover)
\ 000022 90.... MOV DPTR,#??backoffTimerRollover
\ 000025 78.. MOV R0,#?V0 + 4
\ 000027 12.... LCALL ?L_MOV_X
\ 00002A 78.. MOV R0,#?V0 + 4
\ 00002C 79.. MOV R1,#?V0 + 0
\ 00002E 12.... LCALL ?UL_GT
\ 000031 4008 JC ??macBackoffTimerCount_0
236 {
237 return(0);
\ 000033 7A00 MOV R2,#0x0
\ 000035 7B00 MOV R3,#0x0
\ 000037 7C00 MOV R4,#0x0
\ 000039 7D00 MOV R5,#0x0
238 }
239 #endif
240
241 return(backoffCount);
\ ??macBackoffTimerCount_0:
\ 00003B 80.. SJMP ??Subroutine2_1
242 }
243
244
245 /**************************************************************************************************
246 * @fn macBackoffTimerCapture
247 *
248 * @brief Returns the most recently captured backoff count
249 *
250 * @param none
251 *
252 * @return last backoff count that was captured
253 **************************************************************************************************
254 */
\ In segment BANKED_CODE, align 1, keep-with-next
255 uint32 macBackoffTimerCapture(void)
\ macBackoffTimerCapture:
256 {
\ 000000 74F0 MOV A,#-0x10
\ 000002 12.... LCALL ?BANKED_ENTER_XDATA
\ 000005 ; Saved register size: 16
\ 000005 ; Auto size: 0
257 halIntState_t s;
258 uint32 backoffCapture;
259
260 HAL_ENTER_CRITICAL_SECTION(s);
\ 000005 A2AF MOV C,0xa8.7
\ 000007 E4 CLR A
\ 000008 92E0 MOV 0xE0 /* A */.0,C
\ 00000A FE MOV R6,A
\ 00000B C2AF CLR 0xa8.7
261 backoffCapture = MAC_RADIO_BACKOFF_CAPTURE();
\ 00000D ; Setup parameters for call to function macMcuOverflowCapture
\ 00000D 90.... MOV DPTR,#(macMcuOverflowCapture & 0xffff)
\ 000010 74.. MOV A,#((macMcuOverflowCapture >> 16) & 0xff)
\ 000012 12.... LCALL ?BCALL ; Banked call to: DPTR()
\ 000015 8A.. MOV ?V0 + 0,R2
\ 000017 8B.. MOV ?V0 + 1,R3
\ 000019 8C.. MOV ?V0 + 2,R4
\ 00001B 8D.. MOV ?V0 + 3,R5
262 HAL_EXIT_CRITICAL_SECTION(s);
\ 00001D EE MOV A,R6
\ 00001E A2E0 MOV C,0xE0 /* A */.0
\ 000020 92AF MOV 0xa8.7,C
263
264 #ifdef MAC_RADIO_FEATURE_HARDWARE_OVERFLOW_NO_ROLLOVER
265 /*
266 * See other instance of this #ifdef for detailed comments.
267 * Those comments apply to the backoff capture value too.
268 */
269 if (backoffCapture >= backoffTimerRollover)
\ 000022 90.... MOV DPTR,#??backoffTimerRollover
\ 000025 78.. MOV R0,#?V0 + 4
\ 000027 12.... LCALL ?L_MOV_X
\ 00002A 78.. MOV R0,#?V0 + 4
\ 00002C 79.. MOV R1,#?V0 + 0
\ 00002E 12.... LCALL ?UL_GT
\ 000031 4008 JC ??macBackoffTimerCapture_0
270 {
271 return(0);
\ 000033 7A00 MOV R2,#0x0
\ 000035 7B00 MOV R3,#0x0
\ 000037 7C00 MOV R4,#0x0
\ 000039 7D00 MOV R5,#0x0
272 }
273 #endif
274
275 return(backoffCapture);
\ ??macBackoffTimerCapture_0:
\ 00003B 80.. SJMP ??Subroutine2_1
276 }
277
278
279 /**************************************************************************************************
280 * @fn macBackoffTimerGetTrigger
281 *
282 * @brief Returns the trigger set for the backoff timer.
283 *
284 * @param none
285 *
286 * @return backoff count of trigger
287 **************************************************************************************************
288 */
\ In segment BANKED_CODE, align 1, keep-with-next
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -