Контроллер. с ATmega168, по SPI, средствами библиотек, на nRF24L01+, приём тем же, и на ATmega328, и/или ATmega2560. Но то такое. Мне интересно, что делает компилятор, при объявлении массива, что ему можно давать в качестве элементов? И что прочитает компилятор, когда увидит ссылку на массив?
Понятно. Что-то похожее делал когда-то. Но на AVR32 Компилятор вообще весьма сложно работает. Если интересно чего он нагенерил, то это можно посмотрять (для GCC) 1. Генерим объектный файл. gcc -g -c source.c Генерим ассемлер с си строками. objdump -d -S source.o > asm.txt Код: c.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <send>: }board_t; board_t board; void send(board_t *b) { 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: 48 83 ec 10 sub $0x10,%rsp 8: 48 89 7d f8 mov %rdi,-0x8(%rbp) if(b->msg1.msg_id == 0x01) c: 48 8b 45 f8 mov -0x8(%rbp),%rax 10: 0f b6 00 movzbl (%rax),%eax 13: 3c 01 cmp $0x1,%al 15: 75 1c jne 33 <send+0x33> printf("boardcond=%02X\n",b->msg1.boardcond); 17: 48 8b 45 f8 mov -0x8(%rbp),%rax 1b: 0f b6 40 02 movzbl 0x2(%rax),%eax 1f: 0f b6 c0 movzbl %al,%eax 22: 89 c6 mov %eax,%esi 24: bf 00 00 00 00 mov $0x0,%edi 29: b8 00 00 00 00 mov $0x0,%eax 2e: e8 00 00 00 00 callq 33 <send+0x33> } 33: 90 nop 34: c9 leaveq 35: c3 retq 0000000000000036 <main>: void main(void) { 36: 55 push %rbp 37: 48 89 e5 mov %rsp,%rbp board.msg1.msg_id = 0x01; 3a: c6 05 00 00 00 00 01 movb $0x1,0x0(%rip) # 41 <main+0xb> board.msg1.boardcond = 0x88; 41: c6 05 00 00 00 00 88 movb $0x88,0x0(%rip) # 48 <main+0x12> send(&board); 48: bf 00 00 00 00 mov $0x0,%edi 4d: e8 00 00 00 00 callq 52 <main+0x1c> } 52: 90 nop 53: 5d pop %rbp 54: c3 retq Тоже самое с оптимизацией по скорости будет так выглядить. Код: c.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <send>: board_t board; void send(board_t *b) { if(b->msg1.msg_id == 0x01) 0: 80 3f 01 cmpb $0x1,(%rdi) 3: 74 0b je 10 <send+0x10> 5: f3 c3 repz retq 7: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) e: 00 00 printf("boardcond=%02X\n",b->msg1.boardcond); 10: 0f b6 77 02 movzbl 0x2(%rdi),%esi 14: 31 c0 xor %eax,%eax 16: bf 00 00 00 00 mov $0x0,%edi 1b: e9 00 00 00 00 jmpq 20 <send+0x20> Disassembly of section .text.startup: 0000000000000000 <main>: board_t board; void send(board_t *b) { if(b->msg1.msg_id == 0x01) 0: be 88 00 00 00 mov $0x88,%esi 5: bf 00 00 00 00 mov $0x0,%edi a: 31 c0 xor %eax,%eax c: c6 05 00 00 00 00 01 movb $0x1,0x0(%rip) # 13 <main+0x13> printf("boardcond=%02X\n",b->msg1.boardcond); 13: c6 05 00 00 00 00 88 movb $0x88,0x0(%rip) # 1a <main+0x1a> 1a: e9 00 00 00 00 jmpq 1f <main+0x1f> --- добавлено: 29 гру 2015 у 17:01 --- Если функцию send объявить static то еще короче получается. Код: typedef union { struct { unsigned char msg_id; unsigned char boardid; unsigned char boardcond; }msg1; struct { unsigned char msg_id; unsigned char boardidboardid1; unsigned char boardidboardid2; unsigned char blah_blah_blah; }msg2; }board_t; [CODE] c.o: file format elf64-x86-64 Disassembly of section .text.startup: 0000000000000000 <main>: board_t board; static void send(board_t *b) { if(b->msg1.msg_id == 0x01) printf("boardcond=%02X\n",b->msg1.boardcond); 0: be 88 00 00 00 mov $0x88,%esi 5: bf 00 00 00 00 mov $0x0,%edi a: 31 c0 xor %eax,%eax c: c6 05 00 00 00 00 01 movb $0x1,0x0(%rip) # 13 <main+0x13> 13: c6 05 00 00 00 00 88 movb $0x88,0x0(%rip) # 1a <main+0x1a> 1a: e9 00 00 00 00 jmpq 1f <main+0x1f> board_t board; static void send(board_t *b) { if(b->msg1.msg_id == 0x01) printf("boardcond=%02X\n",b->msg1.boardcond); } void main(void) { board.msg1.msg_id = 0x01; board.msg1.boardcond = 0x88; send(&board); } [/CODE]
Блин, так у вас же ардуино!!! Это ДЕТСКАЯ ИГРУШКА. Это как лего. В теории можно построить настоящий дом, но исключительсно с игрушечными перекрытиями, игрушейной крышей, игрушечным водопроводом и игрушечными жителями. Хотите реально разобраться с Си, разбирайтесь с ним на x86, хотите что-то слклепать на мелкоконтроллерах, берите меклоконтроллер, и разбирайтесь. Если нужно что-то сделать, то если заказчик серьезный, то я могу сделать.
Победил Код: byte boardid = 255; byte boardcond = 0; word mesaga ; void setup() { Serial.begin (9600); } void loop() { bitSet (boardcond,0); if (boardcond != 0) mesaga = word(boardid,boardcond); Serial.println (mesaga,BIN); delay (1000); }