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

 
 
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
unichorn
сообщение Jan 27 2006, 09:54
Сообщение #16


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 24-09-05
Пользователь №: 8 901



Можно smile.gif Только если используеш глобальные переменные есть риск самому себе всё изгадить smile.gif
И следи чтоб стек непереполнился.
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Jan 27 2006, 11:43
Сообщение #17


Местный
***

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



Использую толька глобальные - памяти много =)
static unsigned int A; Например.

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

А как за стеком то следить ??
Где его искать ??
И стеков там помоиму не один а несколька ??
Go to the top of the page
 
+Quote Post
unichorn
сообщение Jan 27 2006, 13:27
Сообщение #18


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 24-09-05
Пользователь №: 8 901



DeXteR, а ты случаем не во ВНИИФТРИ сидиш? А то ктото с таким именем на местном сервере
у нас тут есть smile.gif
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Jan 27 2006, 14:59
Сообщение #19


Местный
***

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



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


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

Но эти огранизации почти мертвые поэтому дела мы ворочием сами =)
Go to the top of the page
 
+Quote Post
unichorn
сообщение Jan 27 2006, 15:26
Сообщение #20


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 24-09-05
Пользователь №: 8 901



Аналогично.
Интересные книги по прграмированию найти можно здесь.
http://www.natahaus.ru/
Go to the top of the page
 
+Quote Post
unichorn
сообщение Jan 27 2006, 15:49
Сообщение #21


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 24-09-05
Пользователь №: 8 901



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

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

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

Извеняюсь это уже не по теме.
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Jan 27 2006, 19:12
Сообщение #22


Местный
***

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



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


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

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

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

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


А это где написано ?? Почему ?? Потомучто неудобный для чтения исходник ??
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 28 2006, 01:55
Сообщение #23


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



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


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

На вопрос чем плохо использование глобальных переменных в интернете есть много статей. Задайте этот вопрос в яндексе ;>
Go to the top of the page
 
+Quote Post
Old1
сообщение Jan 28 2006, 11:40
Сообщение #24


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Цитата(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, следовательно чтение и запись их будет выполняться значительно дольше чем в регистры) и отчасти увеличение объема кода, другая -неэкономное использование памяти: зачем забивать память промежуточными переменными, которые нужны только, например, во время выполнения какой-либо функции?, гораздо проще и надежнее их описать как локальные: и функция работать быстрее будет и они (вспомогательные переменные) уничтожаться автоматически после выхода из функции...
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Jan 28 2006, 17:30
Сообщение #25


Местный
***

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



Всем огромное спасибо за советы и разъяснения =)
a14.gif
Go to the top of the page
 
+Quote Post

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

 


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


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