|
发表于 2012-12-21 23:01:40
|
显示全部楼层
dr2001 发表于 2012-12-21 21:39
GCC还是认真用Label As Values吧。
AVR的两个完全独立的地址空间GCC不一定特别适应,这货还是主要针对统 ...
AVR上,Lable as value可能只是看上去很美而已,感觉效率不一定有多高。
switch
- void receive_uart(unsigned char rbyte)
- {
- static unsigned char state = 0;
- static unsigned char counter = 0;
- static unsigned char buffer[20];
- static unsigned char data_xor;
- static unsigned char length = 0;
- switch(state)
- {
- case 0:
- if(rbyte == 0xAA)
- {
- data_xor = rbyte;
- state = 1;
- }
- break;
- case 1:
- if(rbyte > 20 || rbyte < 1)
- {
- state = 0;
- }else{
- state = 2;
- data_xor ^= rbyte;
- length = rbyte;
- }
- break;
- case 2:
- buffer[counter++] = rbyte;
- data_xor ^= rbyte;
- if(length == counter){
- counter = 0;
- state = 3;
- }
- break;
- case 3:
- if(data_xor == rbyte)
- {
- parse_data(buffer, length);
- }
- state = 0;
- break;
- default:
- state = 0;
- break;
- }
- }
复制代码 编译结果
- .global receive_uart
- .type receive_uart, @function
- receive_uart:
- /* prologue: function */
- /* frame size = 0 */
- /* stack size = 0 */
- .L__stack_usage = 0
- lds r25,state.1400
- cpi r25,lo8(1)
- breq .L19
- brlo .L18
- cpi r25,lo8(2)
- breq .L20
- cpi r25,lo8(3)
- brne .L27
- rjmp .L21
- .L18:
- cpi r24,lo8(-86)
- brne .L16
- sts data_xor.1403,r24
- ldi r24,lo8(1)
- rjmp .L28
- .L19:
- mov r25,r24
- subi r25,lo8(-(-1))
- cpi r25,lo8(20)
- brlo .L24
- rjmp .L27
- .L24:
- ldi r25,lo8(2)
- sts state.1400,r25
- lds r25,data_xor.1403
- eor r25,r24
- sts data_xor.1403,r25
- sts length.1404,r24
- ret
- .L20:
- lds r18,counter.1401
- mov r30,r18
- ldi r31,0
- subi r30,lo8(-(buffer.1402))
- sbci r31,hi8(-(buffer.1402))
- st Z,r24
- subi r18,lo8(-(1))
- sts counter.1401,r18
- lds r25,data_xor.1403
- eor r25,r24
- sts data_xor.1403,r25
- lds r24,length.1404
- cpse r24,r18
- rjmp .L16
- sts counter.1401,__zero_reg__
- ldi r24,lo8(3)
- .L28:
- sts state.1400,r24
- ret
- .L21:
- lds r25,data_xor.1403
- cpse r25,r24
- rjmp .L27
- lds r22,length.1404
- ldi r24,lo8(buffer.1402)
- ldi r25,hi8(buffer.1402)
- rcall parse_data
- .L27:
- sts state.1400,__zero_reg__
- .L16:
- ret
- .size receive_uart, .-receive_uart
复制代码 改用Lable as value
- void lable_as_value(unsigned char c)
- {
- static void* next;
- static unsigned char xor;
- static unsigned char length;
- static unsigned char count;
- static unsigned char buffer[20];
- if(next) goto *next;
- R_Start:
- if(c == 0xAA)
- {
- next = &&R_Length;
- xor = 0xAA;
- return;
- }
- R_Length:
- if(c > 20 || c < 1)
- {
- next = &&R_Start;
- }else{
- next = &&R_Data;
- length = c;
- xor ^= c;
- }
- return;
- R_Data:
- buffer[count++] = c;
- xor ^= c;
- if(length == count){
- count = 0;
- next = &&R_Check;
- }
- return;
- R_Check:
- if(xor == c){
- parse_data(buffer, length);
- }
- next = &&R_Start;
- return;
- }
复制代码 编译结果
- .global lable_as_value
- .type lable_as_value, @function
- lable_as_value:
- /* prologue: function */
- /* frame size = 0 */
- /* stack size = 0 */
- .L__stack_usage = 0
- lds r30,next.1410
- lds r31,next.1410+1
- sbiw r30,0
- breq .L7
- ijmp
- .L7:
- cpi r24,lo8(-86)
- brne .L8
- ldi r18,lo8(gs(.L8))
- ldi r19,hi8(gs(.L8))
- sts next.1410+1,r19
- sts next.1410,r18
- sts xor.1411,r24
- ret
- .L8:
- mov r25,r24
- subi r25,lo8(-(-1))
- cpi r25,lo8(20)
- brlo .L10
- rjmp .L13
- .L10:
- ldi r18,lo8(gs(.L11))
- ldi r19,hi8(gs(.L11))
- sts next.1410+1,r19
- sts next.1410,r18
- sts length.1412,r24
- lds r25,xor.1411
- eor r25,r24
- sts xor.1411,r25
- ret
- .L11:
- lds r18,count.1413
- mov r30,r18
- ldi r31,0
- subi r30,lo8(-(buffer.1414))
- sbci r31,hi8(-(buffer.1414))
- st Z,r24
- subi r18,lo8(-(1))
- sts count.1413,r18
- lds r25,xor.1411
- eor r25,r24
- sts xor.1411,r25
- lds r24,length.1412
- cpse r24,r18
- rjmp .L6
- sts count.1413,__zero_reg__
- ldi r24,lo8(gs(.L12))
- ldi r25,hi8(gs(.L12))
- rjmp .L17
- .L12:
- lds r25,xor.1411
- cpse r25,r24
- rjmp .L13
- lds r22,length.1412
- ldi r23,0
- ldi r24,lo8(buffer.1414)
- ldi r25,hi8(buffer.1414)
- rcall parse_data
- .L13:
- ldi r24,lo8(gs(.L7))
- ldi r25,hi8(gs(.L7))
- .L17:
- sts next.1410+1,r25
- sts next.1410,r24
- .L6:
- ret
复制代码 跳转确实变快了,但为了保存这个指针,要用那么多指令。 |
|