реклама на сайте
подробности

 
 
> Проблема при копировании 2-х массивов [GCC-AVR, C++]
kurtis
сообщение Apr 30 2010, 10:21
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Здравствуйте!

Столкнулся с проблемой которая завела меня в тупик, не могу понять в каком месте ошибся.
Суть проблемы в том что контроллер иногда работает совершенно непредсказуемым образом - случайным образом нажимаются кнопки, причем кнопки нажимаются программно, т.к. клавиатура физически отключена. За нажатия кнопок отвечает массив в ОЗУ с именем 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(), но потом для понятности переписал через цикл.

Вот как массивы лежат в ОЗУ:
Код
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

Тут видно что массив из которого происходит копирование netOutCond и массив в который происходит копирование netForDpu находятся "над" массивом key_data (который отвечает за нажатие кнопок). Обычно, когда я выходил за пределы массива, то портились данные, которые находились в старших адресах ОЗУ, но тут ситуация совершенно противоположная.

http://dl.dropbox.com/u/2632562/file.txt - вот дизассемблированный код функции.

Версия avr-gcc 4.3.3, с поддержкой С++.

Спасибо за помощь!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kurtis
сообщение Apr 30 2010, 12:26
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Да.

Это netOutCond:
CODE
typedef struct
{
HEAD_NET_STRUCT head;
uint8_t devs_net_stat[15];
uint8_t status;
uint8_t foo;
}
NET_COND_OUT_STRUCT;

а это netForDpu:
CODE
typedef struct
{
HEAD_NET_STRUCT head;
uint8_t network_state;
uint8_t lamps[10];

uint8_t zasl1[5];
uint8_t zasl2[5];

uint8_t net_state[6];

uint8_t cond1[15];
uint8_t cond2[15];
uint8_t cond3[15];
uint8_t cond4[15];
uint8_t cond5[15];
}
NET_FOR_IO_DPU;
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 30 2010, 12:50
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Вам лень было привести ещё две строки? Что-то типа
Код
NET_COND_OUT_STRUCT netOutCond[5];
NET_FOR_IO_DPU netForDpu;

Да и HEAD_NET_STRUCT можно было бы привести... Надеюсь, что число элементов netOutCond у Вас указано - пять (как это сделано у меня)?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 10:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.0137 секунд с 7
ELECTRONIX ©2004-2016