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

 
 
> 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 25 2009, 16:39
Сообщение #2


Участник
*

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



1) pointer точно не используется в прерывании. i объявлена в начале main(), да и не на i подозрения т.к. сегодня отловил, что та же проблема, но реже, возникает если вырубать прерывания только на кусок с циклом for. Т.е. портится указатель даже на строке pointer=get_adc_data();
2) нет, размер service_msg не превышаю.

Привожу код get_adc_data():

CODE
unsigned int* get_adc_data(void)
{
unsigned char i;
unsigned int adc_data=0;
unsigned int analog_vals_arr[6]={0,0,0,0,0,0};

// ADC Clock frequency: 130,156 kHz
ADCSRA=0x86;// ADC enable; ADC int.disable; prescaler=64

TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
TCCR1B=0x03;// clk/64


do{
for (i=0; i<6; i++)
{
ADMUX&=0b11110000;
ADMUX|=i;
ADCSRA|=0x40;
while(!(ADCSRA & (1<<ADIF)));
ADCSRA|=(1<<ADIF);

adc_data=ADCW;
check(adc_data, i);

};

// check timer1 overflow flag
if (TIFR &= (1<<TOV1))
{
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
TIFR |= (1<<TOV1);
timer1(analog_vals_arr);
break;
};

}
while(1);

ADCSRA clrb(ADEN);//stop ADC
return (analog_vals_arr);
}


функция timer1 получает указатель analog_vals_arr и заполняет массив необходимыми значениями
Причина редактирования: Уменьшение видимого размера цитаты исходника.
Go to the top of the page
 
+Quote Post



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

 


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


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