|
CodeVision+указатели+прерывание, Искажение указателя при прерывании |
|
|
|
Sep 25 2009, 06:53
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 12-01-09
Из: Донецк, Украина
Пользователь №: 43 218

|
Написал вот такой код: Код interrupt [TIM2_OVF] void timer2_ovf_isr(void) { // Stop timer TCCR2=0x00;
if(get_incoming_pkt()==3){ switch (check_command(myip)) { case 0: strcpyf(service_msg, "Micro_device#0:not_a_command"); service_msg[13]=device_id; send_to_server(service_msg, service_msg_len); break; case 1: init_ip_arp_udp(mymac,myip); strcpyf(service_msg, "Micro_device#0:IP_changed"); service_msg[13]=device_id; send_to_server(service_msg, service_msg_len); break; case 2: strcpyf(service_msg, "Micro_device#0:comm_2_done"); service_msg[13]=device_id; send_to_server(service_msg, service_msg_len); break; default: strcpyf(service_msg, "Micro_device#0:command_Error"); service_msg[13]=device_id; send_to_server(service_msg, service_msg_len); }; }; // Start timer TCCR2=0x07; TCNT2=0x00; } // end of interrupt
void main(void)
.... unsigned int* pointer; ......
pointer=get_adc_data(); for(i=0;i<6;i++){ data_msg[16+2*i]=(*(pointer+i))>>8; //MSB data_msg[16+2*i+1]=(*(pointer+i)) & 0xff; //LSB };
...... Проблема следующая: при возникновении прерывания во время работы с указателем, значения записываемые в data_msg[], искажаются. При запрете прерываний на этот кусок кода, всё работает нормально.
Сообщение отредактировал troy97 - Sep 25 2009, 07:20
|
|
|
|
|
 |
Ответов
|
Sep 26 2009, 06:15
|
Участник

Группа: Участник
Сообщений: 70
Регистрация: 22-04-07
Из: Poltava/Kharkov
Пользователь №: 27 243

|
get_adc_data возвращает указатель на локальную переменную (созданую с стеке), естественно при входе в прерывание по тем адресам (где были значения analog_vals_arr) создаются другие локальные переменные. Нужно объявить analog_vals_arr как static, либо переделать get_adc_data так чтобы она заполняла переданый ей (указателем) массив. p.s. ладно, попробую поменять порядок слов
Сообщение отредактировал Sergey Reva - Sep 26 2009, 06:36
|
|
|
|
|
Sep 27 2009, 18:40
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(Sergey Reva @ Sep 26 2009, 09:15)  get_adc_data возвращает указатель на локальную переменную (созданую с стеке), естественно при входе в прерывание по тем адресам (где были значения analog_vals_arr) создаются другие локальные переменные. Нужно объявить analog_vals_arr как static, либо переделать get_adc_data так чтобы она заполняла переданый ей (указателем) массив. +1. Причём надо отметить, что это не "неточность", а грубая ошибка. С формальной точки зрения, вы передаёте указатель на несуществующие данные. Прогнозировать дальнейшее поведение системы не представляется возможным. Оно будет меняться от компиляции к компиляции. То есть будет зависеть от распределения памяти компилятором. Иными словами изменения в другой части программы, логически совершенно не связанной, может изменить поведение этого куска. Я бы не применял static, так как выглядит неестественно. Я бы либо сделал массив глобальным, либо объявил его в месте использования и передавал процедуре на неё указатель, как рекомендовал Sergey Reva.
|
|
|
|
Сообщений в этой теме
troy97 CodeVision+указатели+прерывание Sep 25 2009, 06:53 SasaVitebsk 1) Может pointer используется где-то в прерывании?... Sep 25 2009, 08:33 Goodefine Цитата(troy97 @ Sep 25 2009, 09:53) ...Пр... Sep 25 2009, 14:03 troy97 1) pointer точно не используется в прерывании. i о... Sep 25 2009, 16:39 Goodefine Попробуйте так:
Код...
#asm("cli"... Sep 25 2009, 19:06 _Pasha На вид: тяжеловесное прерывание. Может, в этот кус... Sep 26 2009, 05:51 troy97 Goodefine, попробую, но определено, что проблема н... Sep 26 2009, 06:26 Goodefine Цитата(troy97 @ Sep 26 2009, 09:26) ... Sep 26 2009, 18:41 troy97 Объявил массив в месте его использования, функции ... Sep 28 2009, 06:53 troy97 Работает уже сутки без сбоев, всем большое спасибо... Sep 29 2009, 09:53
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|