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

 
 
> ПОМОГИТЕ 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
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 24)
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 Текстовая версия Сейчас: 19th July 2025 - 09:31
Рейтинг@Mail.ru


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