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

 
 
> CodeVision+указатели+прерывание, Искажение указателя при прерывании
troy97
сообщение Sep 25 2009, 06:53
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
troy97
сообщение Sep 26 2009, 06:26
Сообщение #2


Участник
*

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



Goodefine, попробую, но определено, что проблема не возникает, если перед самым return'ом из get_adc_data(), сбросить TCNT2, т.е. чтобы прерывание точно не попало на кусок с указателями. Из while(1), если TOV1 не установлен... никак не выходит... признаю свою вину.
"А стек увеличивать пробовали?.." - нет, а как?smile.gif

_Pasha, можно и так, а что это даст, если я правильно понимаю, то просто добавится ещё один прыжок, а время обработки прерывания останется тем же?

Sergey Reva, очень логично, сделаю, спасибо.

Сообщение отредактировал troy97 - Sep 26 2009, 06:29
Go to the top of the page
 
+Quote Post



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

 


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


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