сделал листинг ради интереса.
Код
if (new_packet[4] != old_packet[4] || new_packet[5] != old_packet[5] || new_packet[6] != old_packet[6] || new_packet[7] != old_packet[7])
1db8: 7938 ldrb r0, [r7, #4]
1dba: 7933 ldrb r3, [r6, #4]
1dbc: 4298 cmp r0, r3
1dbe: d10b bne.n 1dd8 <PARSER_ParseBlePacket+0x458>
1dc0: 797a ldrb r2, [r7, #5]
1dc2: 7971 ldrb r1, [r6, #5]
1dc4: 428a cmp r2, r1
1dc6: d107 bne.n 1dd8 <PARSER_ParseBlePacket+0x458>
1dc8: 79bd ldrb r5, [r7, #6]
1dca: 79b0 ldrb r0, [r6, #6]
1dcc: 4285 cmp r5, r0
1dce: d103 bne.n 1dd8 <PARSER_ParseBlePacket+0x458>
1dd0: 79fa ldrb r2, [r7, #7]
1dd2: 79f3 ldrb r3, [r6, #7]
1dd4: 429a cmp r2, r3
1dd6: d010 beq.n 1dfa <PARSER_ParseBlePacket+0x47a>
if(*((uint32_t*)&new_packet[4]) != *((uint32_t*)&old_packet[4]))
1db8: 6878 ldr r0, [r7, #4]
1dba: 6873 ldr r3, [r6, #4]
1dbc: 4298 cmp r0, r3
1dbe: d010 beq.n 1de2 <PARSER_ParseBlePacket+0x462>
if(memcmp(&new_packet[4],&old_packet[4],4) != 0)
1a48: 1d3c adds r4, r7, #4
1a4a: 4620 mov r0, r4
1a4c: 1d31 adds r1, r6, #4
1a4e: 2204 movs r2, #4
1a50: f005 f8f8 bl 6c44 <memcmp>
1a54: b160 cbz r0, 1a70 <PARSER_ParseBlePacket+0xf0>
if(*((uint32_t*)&new_packet[4]) != *((uint32_t*)&old_packet[4])) рулит. в принципе это частный случай более общего - ((my_struct *) my_arr)->value_32bit
кстати я тут подумал
такую запись
Код
tempParam.maxFlowRate = (uint32_t)new_packet[0]+((uint32_t)new_packet[1]<<8)+((uint32_t)new_packet[2]<<16)+((uint32_t)new_packet[3]<<24);
можно заменить на
Код
tempParam.maxFlowRate = *((uint32_t*)&new_packet[0]);
или
tempParam.maxFlowRate = ((my_struct *) my_arr)->value_32bit
или я не прав?
вот листинг
Код
tempParam.maxFlowRate = (uint32_t)new_packet[3]+((uint32_t)new_packet[2]<<8)+((uint32_t)new_packet[1]<<16)+((uint32_t)new_packet[0]<<24);
1e32: 7878 ldrb r0, [r7, #1]
1e34: 78bc ldrb r4, [r7, #2]
1e36: 0403 lsls r3, r0, #16
1e38: 78fa ldrb r2, [r7, #3]
1e3a: eb03 2104 add.w r1, r3, r4, lsl #8
1e3e: 7838 ldrb r0, [r7, #0]
1e40: 188c adds r4, r1, r2
1e42: eb04 6300 add.w r3, r4, r0, lsl #24
1e46: 9317 str r3, [sp, #92]; 0x5c
tempParam.maxFlowRate = *((uint32_t*)&new_packet[0]);
1998: 683b ldr r3, [r7, #0]
199c: 9317 str r3, [sp, #92]; 0x5c
нехилая разница.