Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ПОМОГИТЕ C IAR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
DeXteR
Помогите Плиззз

ИАРовский компилятор уомпилит код на Си неправильно следушим образом
Код следующий
Код
      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


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

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

Спасибо !!
solidreg
Ведь всё же хорошо. А в чём проблема?
DeXteR
Цитата(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
GxOST
главное - результат! smile.gif а он именно тот, который вы хотите
DeXteR
Цитата(GxOST @ Jan 19 2006, 16:22) *
главное - результат! smile.gif а он именно тот, который вы хотите


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

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

Пожалуйста поясни
AndyBig
Еще как попадем 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 - попали
DeXteR
Простите за безпокойство
Все понял =)
ДОЦЕН ТУПОЙ sad.gif
Георгий
Имей ввиду, компилятор компилит не в том порядке, как ты пишешь, а как компилятор считает удобнее для него, даже без оптимизации.
DeXteR
Хотел задать ещо один вопросс
При выполнении программы писаногй на Си АВРка выполняет такие подпрограммы как
__low_level_init
__segment_init
и т. д.

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

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

Скопировать файл с __low_level_init в каталог проекта, подключить его к проекту и добавить в __low_level_init нужные процедуры.
DeXteR
Добрый день !

Мой 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};



Подскажите пожалуста
что я неправильно делаю ??
KRS
Цитата(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
это предупреждение о том что порядок доступа к регистрам не определен
в данном случае можно игнорировать
DeXteR
Цитата(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 =)
Думаю это нетак важно
С этим варнингом все работает но очень хочиться чтоб его небыло - раздражает он меня. =)

А неподскажите как написать чтоб его небыло??
KRS
Цитата(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;
}
DeXteR
Всем огромное спасибо за помощь и наставления.

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

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

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

Мне нужно в процедуре обработки прирывания от Т0 (которое происходит гдето каждые 60мС)разрешить T1CAP которое будет происходить иногда чаще.
unichorn
Можно smile.gif Только если используеш глобальные переменные есть риск самому себе всё изгадить smile.gif
И следи чтоб стек непереполнился.
DeXteR
Использую толька глобальные - памяти много =)
static unsigned int A; Например.

Все функции типа void My(void)
и работают с глобальными переменными

А как за стеком то следить ??
Где его искать ??
И стеков там помоиму не один а несколька ??
unichorn
DeXteR, а ты случаем не во ВНИИФТРИ сидиш? А то ктото с таким именем на местном сервере
у нас тут есть smile.gif
DeXteR
Цитата(unichorn @ Jan 27 2006, 17:27) *
DeXteR, а ты случаем не во ВНИИФТРИ сидиш? А то ктото с таким именем на местном сервере
у нас тут есть smile.gif


Нет
Я сижу в Одессе ....
Раньше сидел в УкрНИИСИП
Теперь сидим в СКБСС =)

Но эти огранизации почти мертвые поэтому дела мы ворочием сами =)
unichorn
Аналогично.
Интересные книги по прграмированию найти можно здесь.
http://www.natahaus.ru/
unichorn
Большое количество глобальных переменных использовать не рекомендуется.

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

Волосы досих пор дыбом wacko.gif от большого количества меток типа privet:

Извеняюсь это уже не по теме.
DeXteR
Цитата(unichorn @ Jan 27 2006, 19:26) *
Аналогично.
Интересные книги по прграмированию найти можно здесь.
http://www.natahaus.ru/


Сайт хороший но ни в одной книжке там ненаписано что такое
HEAP, CSTACK, SSTACK =(

Каким образом передаютца переменные в функцию и т. д.

Если я ошибаюсь - киньте в меня ссылкой пожалуйста.

Цитата(unichorn @ Jan 27 2006, 19:49) *
Большое количество глобальных переменных использовать не рекомендуется.


А это где написано ?? Почему ?? Потомучто неудобный для чтения исходник ??
defunct
Цитата(DeXteR @ Jan 27 2006, 13:43) *
Использую толька глобальные - памяти много =)
static unsigned int A; Например.


помоему Вы путаетесь.. static - не значит глобальная переменная.. static - глобальное время действия, иными словами просто резервирует определенную ячейку памяти под переменную. Цитата из описания ANSI-C:
Цитата
"Элемент с глобальным временем действия существует на всем протяжении выполнения исходной программы, но он может и не быть доступен из всех частей программы."
Однако, если переменная у Вас объявлена в контексте функции или тела одного модуля, переменная будет считаться локальной соответственно для функции или модуля. Глобальными же являются переменные, которые объявлены например в хедере (.h) и которые "видно" в любом другом модуле.

На вопрос чем плохо использование глобальных переменных в интернете есть много статей. Задайте этот вопрос в яндексе ;>
Old1
Цитата(DeXteR @ Jan 27 2006, 23:12) *
Каким образом передаютца переменные в функцию и т. д.

Этот вопрос рассматривается в мануале на ИАРовский компилятор в подразделе "Calling convention" раздела "Assembler language interface", если в очень общих чертах, то параметры в функцию передаются через регистры R16...R23 , если их хватает, если нет, то через стек... естественно существуют нюансы, чтобы детально разобраться почитайте мануал...

Цитата
Цитата(unichorn @ Jan 27 2006, 19:49) *

Большое количество глобальных переменных использовать не рекомендуется.

А это где написано ?? Почему ?? Потомучто неудобный для чтения исходник ??

Чтобы прояснить этот вопрос просмотрите appnote AVR035: "Создание эффективного Си-кода для микроконтроллеров AVR", (на gav.ru есть перевод на русский). Одна из причин, по которой не рекомендуется повсеместное использование глобальных переменных- это увеличение длительности выполнения кода (глобальные переменные обычно размещаюся в SRAM, следовательно чтение и запись их будет выполняться значительно дольше чем в регистры) и отчасти увеличение объема кода, другая -неэкономное использование памяти: зачем забивать память промежуточными переменными, которые нужны только, например, во время выполнения какой-либо функции?, гораздо проще и надежнее их описать как локальные: и функция работать быстрее будет и они (вспомогательные переменные) уничтожаться автоматически после выхода из функции...
DeXteR
Всем огромное спасибо за советы и разъяснения =)
a14.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.