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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> ПОМОГИТЕ C IAR
DeXteR
сообщение Jan 19 2006, 11:40
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287



Помогите Плиззз

ИАРовский компилятор уомпилит код на Си неправильно следушим образом
Код следующий
Код
      switch  (TWSR&0x7F)
      {

    case 0x60:
      {
      Temp = TWDR;
      }
    break;

    case 0x68:
      asm("nop");
    break;

    case 0x70:
      asm("nop");
    break;

    case 0x78:
      asm("nop");
    break;

    case 0x80:
      asm("nop");
    break;

    case 0x88:
      asm("nop");
    break;
    default:
      asm("nop");

      }


Из астудио Дизасемблера получил следующие

Код
103:            switch  (TWSR&0x7F)
+000001D7:   B101        IN      R16,0x01         In from I/O location
+000001D8:   770F        ANDI    R16,0x7F         Logical AND with immediate
+000001D9:   5800        SUBI    R16,0x80         Subtract immediate
+000001DA:   F0A9        BREQ    PC+0x16          Branch if equal
+000001DB:   5008        SUBI    R16,0x08         Subtract immediate
+000001DC:   F0A9        BREQ    PC+0x16          Branch if equal
+000001DD:   5D08        SUBI    R16,0xD8         Subtract immediate
+000001DE:   F039        BREQ    PC+0x08          Branch if equal
+000001DF:   5008        SUBI    R16,0x08         Subtract immediate
+000001E0:   F049        BREQ    PC+0x0A          Branch if equal
+000001E1:   5008        SUBI    R16,0x08         Subtract immediate
+000001E2:   F049        BREQ    PC+0x0A          Branch if equal
+000001E3:   5008        SUBI    R16,0x08         Subtract immediate
+000001E4:   F049        BREQ    PC+0x0A          Branch if equal
+000001E5:   C00E        RJMP    PC+0x000F        Relative jump
108:            Temp = TWDR;
+000001E6:   B103        IN      R16,0x03         In from I/O location
+000001E7:   9300006B    STS     0x006B,R16       Store direct to data space
+000001E9:   9508        RET                      Subroutine return
113:            asm("nop");
+000001EA:   0000        NOP                      No operation
+000001EB:   9508        RET                      Subroutine return
117:            asm("nop");
+000001EC:   0000        NOP                      No operation
+000001ED:   9508        RET                      Subroutine return
121:            asm("nop");
+000001EE:   0000        NOP                      No operation
+000001EF:   9508        RET                      Subroutine return
125:            asm("nop");
+000001F0:   0000        NOP                      No operation
+000001F1:   9508        RET                      Subroutine return
129:            asm("nop");
+000001F2:   0000        NOP                      No operation
+000001F3:   9508        RET                      Subroutine return
132:            asm("nop");
+000001F4:   0000        NOP                      No operation
136:      }
+000001F5:   9508        RET                      Subroutine return


Оптимизация кода в компиляторе отключена

Я писать на Си толька учусь ...
Может гдето ошибка ?? Или глюк ??
Как бороться ??

Спасибо !!
Go to the top of the page
 
+Quote Post
solidreg
сообщение Jan 19 2006, 11:56
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 74
Регистрация: 24-10-05
Пользователь №: 10 056



Ведь всё же хорошо. А в чём проблема?
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Jan 19 2006, 12:01
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287



Цитата(solidreg @ Jan 19 2006, 15:56) *
Ведь всё же хорошо. А в чём проблема?


case 0x60:
{
Temp = TWDR;
}
break;

Вот этого нету Сюда непопадем никогда

Пооверял Студией и Протеусом

Компилица в

+000001D9: 5800 SUBI R16, 0x80 Subtract immediate
+000001DA: F0A9 BREQ PC+0x16 Branch if equal
+000001DB: 5008 SUBI R16,0x08 Subtract immediate
+000001DC: F0A9 BREQ PC+0x16 Branch if equal
Go to the top of the page
 
+Quote Post
GxOST
сообщение Jan 19 2006, 12:22
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 6-12-05
Из: Санкт-Петербург
Пользователь №: 11 878



главное - результат! smile.gif а он именно тот, который вы хотите


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Jan 19 2006, 12:30
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287



Цитата(GxOST @ Jan 19 2006, 16:22) *
главное - результат! smile.gif а он именно тот, который вы хотите


Как тебя понять
Я хочу чтоб когда TWCR == 60
я попадал на

case 0x60:
{
Temp = TWDR;
}
break;

Пожалуйста поясни
Go to the top of the page
 
+Quote Post
AndyBig
сообщение Jan 19 2006, 12:36
Сообщение #6


Иногдящий
****

Группа: Свой
Сообщений: 691
Регистрация: 28-02-05
Пользователь №: 2 931



Еще как попадем smile.gif
Считаем:

000001D9: 5800 SUBI R16, 0x80 Subtract immediate
0x60 - 0x80 = 0xE0

000001DB: 5008 SUBI R16,0x08 Subtract immediate
0xE0 - 0x08 = 0xD8

000001DD: 5D08 SUBI R16,0xD8 Subtract immediate
0xD8 - 0xD8 = 0 - попали
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Jan 19 2006, 12:41
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287



Простите за безпокойство
Все понял =)
ДОЦЕН ТУПОЙ sad.gif
Go to the top of the page
 
+Quote Post
Георгий
сообщение Jan 19 2006, 12:43
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 269
Регистрация: 17-11-05
Из: Киров-Москва
Пользователь №: 10 957



Имей ввиду, компилятор компилит не в том порядке, как ты пишешь, а как компилятор считает удобнее для него, даже без оптимизации.


--------------------
Обычно последним смеется тот, кто хуже соображает!
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Jan 20 2006, 09:38
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287



Хотел задать ещо один вопросс
При выполнении программы писаногй на Си АВРка выполняет такие подпрограммы как
__low_level_init
__segment_init
и т. д.

Есть надобность чтоб Атмега выполнила действия
как можно раньше после старта
раньше чем попадет на main()

Как заставить программу на Си проанализировать побыстрее например флаги регистра
MCUCSR (говорящие об источноке сбросса) ???
Go to the top of the page
 
+Quote Post
AndyBig
сообщение Jan 20 2006, 10:47
Сообщение #10


Иногдящий
****

Группа: Свой
Сообщений: 691
Регистрация: 28-02-05
Пользователь №: 2 931



Цитата
Как заставить программу на Си проанализировать побыстрее например флаги регистра
MCUCSR (говорящие об источноке сбросса) ???

Скопировать файл с __low_level_init в каталог проекта, подключить его к проекту и добавить в __low_level_init нужные процедуры.
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Jan 26 2006, 12:08
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287



Добрый день !

Мой IAR на строчку

Код
      ADC_data[(ADMUX&_0b00000111)] = ADC>>1;


ругаеться так

Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement C:\!ZUB\zub\iar\ADC.c 11

Переменная обявлена так
Код
      
static unsigned int ADC_data[] =
{0, 0, 0, 0, 0, 0, 0 ,0};



Подскажите пожалуста
что я неправильно делаю ??
Go to the top of the page
 
+Quote Post
KRS
сообщение Jan 26 2006, 12:12
Сообщение #12


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(DeXteR @ Jan 26 2006, 15:08) *
Добрый день !

Мой IAR на строчку

Код
      ADC_data[(ADMUX&_0b00000111)] = ADC>>1;


ругаеться так

Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement C:\!ZUB\zub\iar\ADC.c 11

Переменная обявлена так
Код
      
static unsigned int ADC_data[] =
{0, 0, 0, 0, 0, 0, 0 ,0};



Подскажите пожалуста
что я неправильно делаю ??


А вы переведите на русский и все поймете wink.gif

Дело в том что в выражении используются 2 регистра volatile
это предупреждение о том что порядок доступа к регистрам не определен
в данном случае можно игнорировать
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Jan 26 2006, 12:18
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287



Цитата(KRS @ Jan 26 2006, 16:12) *
Цитата(DeXteR @ Jan 26 2006, 15:08) *

Добрый день !

Мой IAR на строчку

Код
      ADC_data[(ADMUX&_0b00000111)] = ADC>>1;


ругаеться так

Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement C:\!ZUB\zub\iar\ADC.c 11

Переменная обявлена так
Код
      
static unsigned int ADC_data[] =
{0, 0, 0, 0, 0, 0, 0 ,0};




Подскажите пожалуста
что я неправильно делаю ??


А вы переведите на русский и все поймете wink.gif

Дело в том что в выражении используются 2 регистра volatile
это предупреждение о том что порядок доступа к регистрам не определен
в данном случае можно игнорировать


=) еслиб я знал что такое volatile =)
Думаю это нетак важно
С этим варнингом все работает но очень хочиться чтоб его небыло - раздражает он меня. =)

А неподскажите как написать чтоб его небыло??
Go to the top of the page
 
+Quote Post
KRS
сообщение Jan 26 2006, 12:25
Сообщение #14


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(DeXteR @ Jan 26 2006, 15:18) *
Цитата(KRS @ Jan 26 2006, 16:12) *

Цитата(DeXteR @ Jan 26 2006, 15:08) *

Добрый день !

Мой IAR на строчку

Код
      ADC_data[(ADMUX&_0b00000111)] = ADC>>1;


ругаеться так

Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement C:\!ZUB\zub\iar\ADC.c 11

Переменная обявлена так
Код
      
static unsigned int ADC_data[] =
{0, 0, 0, 0, 0, 0, 0 ,0};




Подскажите пожалуста
что я неправильно делаю ??


А вы переведите на русский и все поймете wink.gif

Дело в том что в выражении используются 2 регистра volatile
это предупреждение о том что порядок доступа к регистрам не определен
в данном случае можно игнорировать


=) еслиб я знал что такое volatile =)
Думаю это нетак важно
С этим варнингом все работает но очень хочиться чтоб его небыло - раздражает он меня. =)

А неподскажите как написать чтоб его небыло??


Либо так
Код
{
    unsigned char C;
    C=ADMUX&_0b00000111;
    ADC_data[C] = ADC>>1;
}


Либо так
Код
{
    unsigned int V;
    V=ADC>>1;
    ADC_data[ADMUX&_0b00000111] = V;
}
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Jan 27 2006, 08:43
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287



Всем огромное спасибо за помощь и наставления.

Вопросс такой

Можно ли на Си разрешить прирывания в процедуре обработки другого прирывания ???

Шо при этом будет с переменными. Не потеряю ли данных ???
Не замусарю ли стеки ??

Мне нужно в процедуре обработки прирывания от Т0 (которое происходит гдето каждые 60мС)разрешить T1CAP которое будет происходить иногда чаще.
Go to the top of the page
 
+Quote Post

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

 


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


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