Столкнулся с проблемой которая завела меня в тупик, не могу понять в каком месте ошибся.
Суть проблемы в том что контроллер иногда работает совершенно непредсказуемым образом - случайным образом нажимаются кнопки, причем кнопки нажимаются программно, т.к. клавиатура физически отключена. За нажатия кнопок отвечает массив в ОЗУ с именем key_data. Начал разбираться и методом исключений пришел к выводу что проблема в этой функции
Код
140 void Work_drv()
141 {
142 //void *memcpy(void *dest, const void *src, size_t n);
143
144 uint8_t index;
145
146 for (index=0; index < 15; index++) {netForDpu.cond1[index] = netOutCond[0].devs_net_stat[index];}
147 for (index=0; index < 15; index++) {netForDpu.cond2[index] = netOutCond[1].devs_net_stat[index];}
148 for (index=0; index < 15; index++) {netForDpu.cond3[index] = netOutCond[2].devs_net_stat[index];}
149 for (index=0; index < 15; index++) {netForDpu.cond4[index] = netOutCond[3].devs_net_stat[index];}
150 for (index=0; index < 15; index++) {netForDpu.cond5[index] = netOutCond[4].devs_net_stat[index];}
151
152 //memcpy(netForDpu.cond1, netOutCond[0].devs_net_stat, 15);
153 //memcpy(netForDpu.cond2, netOutCond[1].devs_net_stat, 15);
154 //memcpy(netForDpu.cond3, netOutCond[2].devs_net_stat, 15);
155 //memcpy(netForDpu.cond4, netOutCond[3].devs_net_stat, 15);
156 //memcpy(netForDpu.cond5, netOutCond[4].devs_net_stat, 15);
157
158 }
Изначально были функции memcpy(), но потом для понятности переписал через цикл. 141 {
142 //void *memcpy(void *dest, const void *src, size_t n);
143
144 uint8_t index;
145
146 for (index=0; index < 15; index++) {netForDpu.cond1[index] = netOutCond[0].devs_net_stat[index];}
147 for (index=0; index < 15; index++) {netForDpu.cond2[index] = netOutCond[1].devs_net_stat[index];}
148 for (index=0; index < 15; index++) {netForDpu.cond3[index] = netOutCond[2].devs_net_stat[index];}
149 for (index=0; index < 15; index++) {netForDpu.cond4[index] = netOutCond[3].devs_net_stat[index];}
150 for (index=0; index < 15; index++) {netForDpu.cond5[index] = netOutCond[4].devs_net_stat[index];}
151
152 //memcpy(netForDpu.cond1, netOutCond[0].devs_net_stat, 15);
153 //memcpy(netForDpu.cond2, netOutCond[1].devs_net_stat, 15);
154 //memcpy(netForDpu.cond3, netOutCond[2].devs_net_stat, 15);
155 //memcpy(netForDpu.cond4, netOutCond[3].devs_net_stat, 15);
156 //memcpy(netForDpu.cond5, netOutCond[4].devs_net_stat, 15);
157
158 }
Вот как массивы лежат в ОЗУ:
Код
619 008007b2 0000002f B lcd_data
620 008007e1 00000005 B key_data
621 008007e6 00000008 B netFromDpu
622 008007ee 00000069 B netForDpu
623 00800857 00000078 B netOutCond
624 008008cf 0000002a B netInCond
625 008008f9 00000020 B LCD_str
626 00800919 00000001 B tech_fl
620 008007e1 00000005 B key_data
621 008007e6 00000008 B netFromDpu
622 008007ee 00000069 B netForDpu
623 00800857 00000078 B netOutCond
624 008008cf 0000002a B netInCond
625 008008f9 00000020 B LCD_str
626 00800919 00000001 B tech_fl
Тут видно что массив из которого происходит копирование netOutCond и массив в который происходит копирование netForDpu находятся "над" массивом key_data (который отвечает за нажатие кнопок). Обычно, когда я выходил за пределы массива, то портились данные, которые находились в старших адресах ОЗУ, но тут ситуация совершенно противоположная.
http://dl.dropbox.com/u/2632562/file.txt - вот дизассемблированный код функции.
Версия avr-gcc 4.3.3, с поддержкой С++.
Спасибо за помощь!