|
ПОМОГИТЕ C IAR |
|
|
|
Jan 19 2006, 11:40
|

Местный
  
Группа: Свой
Сообщений: 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 Оптимизация кода в компиляторе отключена Я писать на Си толька учусь ... Может гдето ошибка ?? Или глюк ?? Как бороться ?? Спасибо !!
|
|
|
|
|
Jan 19 2006, 11:56
|
Участник

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

|
Ведь всё же хорошо. А в чём проблема?
|
|
|
|
|
Jan 19 2006, 12:01
|

Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jan 19 2006, 12:30
|

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

|
Цитата(GxOST @ Jan 19 2006, 16:22)  главное - результат!  а он именно тот, который вы хотите Как тебя понять Я хочу чтоб когда TWCR == 60 я попадал на case 0x60: { Temp = TWDR; } break; Пожалуйста поясни
|
|
|
|
|
Jan 19 2006, 12:36
|

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

|
Еще как попадем  Считаем: 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 - попали
|
|
|
|
|
Jan 26 2006, 12:08
|

Местный
  
Группа: Свой
Сообщений: 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}; Подскажите пожалуста что я неправильно делаю ??
|
|
|
|
|
Jan 26 2006, 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}; Подскажите пожалуста что я неправильно делаю ?? А вы переведите на русский и все поймете  Дело в том что в выражении используются 2 регистра volatile это предупреждение о том что порядок доступа к регистрам не определен в данном случае можно игнорировать
|
|
|
|
|
Jan 26 2006, 12:18
|

Местный
  
Группа: Свой
Сообщений: 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}; Подскажите пожалуста что я неправильно делаю ?? А вы переведите на русский и все поймете  Дело в том что в выражении используются 2 регистра volatile это предупреждение о том что порядок доступа к регистрам не определен в данном случае можно игнорировать =) еслиб я знал что такое volatile =) Думаю это нетак важно С этим варнингом все работает но очень хочиться чтоб его небыло - раздражает он меня. =) А неподскажите как написать чтоб его небыло??
|
|
|
|
|
Jan 26 2006, 12:25
|

Профессионал
    
Группа: Модераторы
Сообщений: 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}; Подскажите пожалуста что я неправильно делаю ?? А вы переведите на русский и все поймете  Дело в том что в выражении используются 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; }
|
|
|
|
|
Jan 27 2006, 09:54
|
Частый гость
 
Группа: Участник
Сообщений: 96
Регистрация: 24-09-05
Пользователь №: 8 901

|
Можно  Только если используеш глобальные переменные есть риск самому себе всё изгадить И следи чтоб стек непереполнился.
|
|
|
|
|
Jan 27 2006, 14:59
|

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

|
Цитата(unichorn @ Jan 27 2006, 17:27)  DeXteR, а ты случаем не во ВНИИФТРИ сидиш? А то ктото с таким именем на местном сервере у нас тут есть  Нет Я сижу в Одессе .... Раньше сидел в УкрНИИСИП Теперь сидим в СКБСС =) Но эти огранизации почти мертвые поэтому дела мы ворочием сами =)
|
|
|
|
|
Jan 27 2006, 15:26
|
Частый гость
 
Группа: Участник
Сообщений: 96
Регистрация: 24-09-05
Пользователь №: 8 901

|
Аналогично. Интересные книги по прграмированию найти можно здесь. http://www.natahaus.ru/
|
|
|
|
|
Jan 27 2006, 15:49
|
Частый гость
 
Группа: Участник
Сообщений: 96
Регистрация: 24-09-05
Пользователь №: 8 901

|
Большое количество глобальных переменных использовать не рекомендуется. Я только что закончил подправлять чужой проект с большим количеством глобальных переменных, особенно добили ничего незначащие названия переменных и функций. Волосы досих пор дыбом  от большого количества меток типа privet: Извеняюсь это уже не по теме.
|
|
|
|
|
Jan 27 2006, 19:12
|

Местный
  
Группа: Свой
Сообщений: 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)  Большое количество глобальных переменных использовать не рекомендуется. А это где написано ?? Почему ?? Потомучто неудобный для чтения исходник ??
|
|
|
|
|
Jan 28 2006, 01:55
|

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

|
Цитата(DeXteR @ Jan 27 2006, 13:43)  Использую толька глобальные - памяти много =) static unsigned int A; Например. помоему Вы путаетесь.. static - не значит глобальная переменная.. static - глобальное время действия, иными словами просто резервирует определенную ячейку памяти под переменную. Цитата из описания ANSI-C: Цитата "Элемент с глобальным временем действия существует на всем протяжении выполнения исходной программы, но он может и не быть доступен из всех частей программы." Однако, если переменная у Вас объявлена в контексте функции или тела одного модуля, переменная будет считаться локальной соответственно для функции или модуля. Глобальными же являются переменные, которые объявлены например в хедере (.h) и которые "видно" в любом другом модуле. На вопрос чем плохо использование глобальных переменных в интернете есть много статей. Задайте этот вопрос в яндексе ;>
|
|
|
|
|
Jan 28 2006, 11:40
|

Знающий
   
Группа: Свой
Сообщений: 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, следовательно чтение и запись их будет выполняться значительно дольше чем в регистры) и отчасти увеличение объема кода, другая -неэкономное использование памяти: зачем забивать память промежуточными переменными, которые нужны только, например, во время выполнения какой-либо функции?, гораздо проще и надежнее их описать как локальные: и функция работать быстрее будет и они (вспомогательные переменные) уничтожаться автоматически после выхода из функции...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|