|
楼主 |
发表于 2007-9-8 11:51:04
|
显示全部楼层
先看下面T0比较匹配中断的代码,这是一个标准的中断代码的汇编,请注意保护现场和恢复现场部分的代码,它同样是用到了R1!!
0000013F: __vector_19
38: {
+0000013F: 921F PUSH R1 Push register on stack
+00000140: 920F PUSH R0 Push register on stack
+00000141: B60F IN R0,0x3F In from I/O location
+00000142: 920F PUSH R0 Push register on stack
+00000143: 2411 CLR R1 Clear Register
+00000144: 938F PUSH R24 Push register on stack
+00000145: 939F PUSH R25 Push register on stack
41: if (WaitTime > 0)
+00000146: 9180007A LDS R24,0x007A Load direct from data space
+00000148: 9190007B LDS R25,0x007B Load direct from data space
+0000014A: 2B89 OR R24,R25 Logical OR
+0000014B: F049 BREQ PC+0x0A Branch if equal
43: WaitTime --;
+0000014C: 9180007A LDS R24,0x007A Load direct from data space
+0000014E: 9190007B LDS R25,0x007B Load direct from data space
+00000150: 9701 SBIW R24,0x01 Subtract immediate from word
+00000151: 9390007B STS 0x007B,R25 Store direct to data space
+00000153: 9380007A STS 0x007A,R24 Store direct to data space
46: if (Time > 0)
+00000155: 9180007C LDS R24,0x007C Load direct from data space
+00000157: 9190007D LDS R25,0x007D Load direct from data space
+00000159: 2B89 OR R24,R25 Logical OR
+0000015A: F049 BREQ PC+0x0A Branch if equal
48: Time--;
+0000015B: 9180007C LDS R24,0x007C Load direct from data space
+0000015D: 9190007D LDS R25,0x007D Load direct from data space
+0000015F: 9701 SBIW R24,0x01 Subtract immediate from word
+00000160: 9390007D STS 0x007D,R25 Store direct to data space
+00000162: 9380007C STS 0x007C,R24 Store direct to data space
+00000164: 919F POP R25 Pop register from stack
+00000165: 918F POP R24 Pop register from stack
+00000166: 900F POP R0 Pop register from stack
+00000167: BE0F OUT 0x3F,R0 Out to I/O location
+00000168: 900F POP R0 Pop register from stack
+00000169: 901F POP R1 Pop register from stack
+0000016A: 9518 RETI Interrupt return
既然我们的任务调度是模拟一次中断入栈,则我们的RTOS的任务调度代码就要和中断代码一样的入栈过程。 |
|