Пятничный бред... Кто круче я или AVRStudio+GCC

Статус: Offline
Реєстрація: 17.08.2005
Повідом.: 48736
  • 🔴 05:39 Повітряна тривога в Харків.обл.
  • #1
Решил на работе поставить последнюю АВРСтудию и ЖЦЦ.

Скачал значицо 4.18 +СП3 накатал. WinAVR поставил, вроде всё как положено.

Ну завожу ж проект. Ну посмотреть что там оно вообще, работает чи не. Пишу:
#include <avr/io.h>
#include <avr/iom128.h>
#include <util/delay.h>
#include <avr/interrupt.h>
//******************************************************//
int main (void)
{
int a=4;
PORTB=a;
if(PINB!=0xFF)
{
a=3;
}
while(1)
{
a++;
}

}

Оно компилируется в некий перл:

и висит естественно на 0x55м адресе в куске:
+00000055: CFFF RJMP PC-0x0000 Relative jump

Вопросов несколько...
а) Что не так?
б) Какого фуя 10: if(PINB!=0xFF) - 2 раза??
в) С какого бадуна он из прерываний в main заходит вызовом main по CALL??? Это у них так модно вместо rjmp колы пхать и занимать стэк, или как-то можно его вразумить?



гыгы.. 6 человек уже просмотрело и молчит. Значит ни кто ни чё не понял и бред удался!!
 
Останнє редагування:
  • 🔴 05:39 Повітряна тривога в Харків.обл.
  • #2
Славик,не говори на языке,которого ты не знаешь,не поймут тебя
А если серьезно - то:
1. ты объявил int main() - а значения не возвращаешь
2. таблицу переходов на обработчики прерываний компилер скомпилил правильно
3. в точке входа в программу по ресету идет инициализация стека
4. а дальше разбирайся сам.
 
  • 🔴 05:39 Повітряна тривога в Харків.обл.
  • #3
Славик,не говори на языке,которого ты не знаешь,не поймут тебя
Эммм... вообще-то знаю Что непонятно?

А если серьезно - то:ты объявил int main() - а значения не возвращаешь
Создай проект в GCC (AVRStudio+WinAVR) и объяви void main (void) - сиди потом и смотри на варнинг. Я лично не сильно их люблю. В скобках у int main (void) слово void уже само по себе означает, что я не собираюсь ни чего возвращать. Не знаю почему в ВинАВР так - так сложилось.


Та кто спорит... Только накуя он на main прыгает CALL-ом - видимо, как мне объяснили изза рассмотрения main компилятором, как обычной функции, ни чем от других не отличающейся.
ИМХО - для AVR это перебор - там не такой эпический стэк, шоб зря один уровень занимать, могли б и поразмышлять над тем, что в main надо заходить по рджампу..

3. в точке входа в программу по ресету идет инициализация стека
Очевидно

4. а дальше разбирайся сам.

Та я собсно и разобрался уже - volatile объявляешь и оптимизатор перестаёт выяпуваться, а начинает оптимизировать.

P.S. А глюки, когда при включении оптимизации в дезасме у студии появляются повторяющиеся куски кода, как мне сказали - стандартное дело.
 
  • 🔴 05:39 Повітряна тривога в Харків.обл.
  • #4
  • 🔴 05:39 Повітряна тривога в Харків.обл.
  • #5
Могу только повторить еще раз - учи язык...
Эмм... что не понятно во фразе "не знаю почему в WinAVR так?
Это действительно стандартное объявление мэйна для этого компилятора
Ну он такой, какой есть. Я его не делал. И это мы ещё IAR и Codevision не касаемся - там дальше-больше глюков, в которых разработчик думает, что С это так как он понимает, а не так, как написано



P.S. Варнинг будет выглядеть вот так:

../main.c:3: warning: return type of 'main' is not 'int'

Учить язык я конечно не против, но предложил бы посоветовать это сначала разработчикам WinAVR, у которых своё видение проблемы.
 
Останнє редагування:
  • 🔴 05:39 Повітряна тривога в Харків.обл.
  • #6
Не знаю, как сейчас, но еще недавно в скобках указывался тип передаваемой переменной (или переменных) функции, а не возвращаемой.
 
  • 🔴 05:39 Повітряна тривога в Харків.обл.
  • #7
Ну,так и верни какое -либо значение в ОС после выхода из main(),если ОСь есть
IAR генерит наиболее вменяемый код,надо только объяснить ему,чего хочешь
P.S. Варнинг будет выглядеть вот так:
Вполне адекватный ворнинг - объявил функцию,возвращающую значение,а ничего не возвращаешь."Где деньги,Зин?"
Ты чего-то хочешь от разработчиков гнутого софта ?
 
  • 🔴 05:39 Повітряна тривога в Харків.обл.
  • #8

Ye ште в типе функции оправдан:

Ну а void в скобках, как пишут в прессе. означает:


Но внимательный анонимус всегда может откомментить это как:

Если вместо типа инт написать ничего, компилятор сообщит о самодеятельности:
../main.c:4: warning: return type defaults to 'int'
Если вместо void в скобках не написать ни чего - ни чего и не изменится.

Вывод:
Вики согласно со мной:
Proof Link

А, да, я не правильно выразился - "void" в скобках говорит не что я не собираюсь ни чего возвращать, а говорит, что я не собираюсь main-у ни чего давать в качестве аргумента. Тут да.

Ну,так и верни какое -либо значение в ОС после выхода из main(),если ОСь есть
Какая нах ОСъ?? Это AVR!! Нах она там впала? Для таких вещей не ось, а автомат состояний

IAR генерит наиболее вменяемый код,надо только объяснить ему,чего хочешь
Да ну не знаю... Разница не особо заметна, а настроек для AVR не нужных - больше.

Эмм... ну, в общем-то, он не только адекватен, но и ожидаем Это просто к вопросу о посылании меня учить язык. Я честно полез и увидел, что... я прав
А вот ты б пошел поучил
Выясняется, что если функция, возвращающая int, в скобках имеет (void), то как бы и возвращать ни чего не надо, как и писать в конце return 0;
Не?


Ты чего-то хочешь от разработчиков гнутого софта ?
А в IAR и кодевижен не так?
 
  • 🔴 05:39 Повітряна тривога в Харків.обл.
  • #9
Ты понял,чего написал?
Ну,что-ж,остается только пожелать почитать аппноту AVR035 от Atmel...
Впрочем,сначала K&R.
Узнаешь много удивительного для себя.
LMD
 
Останнє редагування:
  • 🔴 05:39 Повітряна тривога в Харків.обл.
  • #10
То ли леший нынче рьян, то ли воздух нынче пьян (с)
 
  • 🔴 05:39 Повітряна тривога в Харків.обл.
  • #12
Если переменная объявлена как volatile, то оптимизатор таки не начинает, а перестает оптимизировать

Надо писать не ничего, а void...

С какой стати?
 
  • 🔴 05:39 Повітряна тривога в Харків.обл.
  • #13
  • 🔴 05:39 Повітряна тривога в Харків.обл.
  • #14

Вот это?

И чем отличается "результат отбрасывается" от "и не собираюсь ни чего возвращать"?
Или вам излагать надо исключительно теми словами, которые в книжке?

Сдается мне у вас случился




И у Кернигана докапываться до вопроса "что делает void в вызове main" - долго.
Обячно я считаю, что люди, которые отсылают к Кернигану и Ричи - хотят похоливарить, так как сами не знают как на самом деле.

Если бы вы сами знали, то так бы и сказали Ибо объяснение занимает всего одну строку:

С майн это несколько нетак. Я не объявляю её прототип.
По этому история такова:
и писали int main();
А потом появилось void.
 
Останнє редагування:
  • 🔴 05:39 Повітряна тривога в Харків.обл.
  • #15
По теме - АВР студия круче Реса, как ни крути!))))
 
  • 🔴 05:39 Повітряна тривога в Харків.обл.
  • #17
Да, я не компилирую С "в уме". Зато AVR-студия не умеет холиварить на форуме

Ну, это бесспорно!)))))

Не вникал в суть вопроса, но -
Ты с IAR-ом сравнение сделай.. Мне ж интересно будет на результат посмотреть..
В GCC не работал, а вот CVAVR , вобще на асме такую куйню вытворяет, что в листинг стремно смотреть (зато удобный, зараза, в плане если чего быстро написать нужно.. Библиотеки таки выручают). IAR ничего так... юзаю.. нравится..
 
  • 🔴 05:39 Повітряна тривога в Харків.обл.
  • #18
Да просто тебе надо было подумать и понять,что функция main в контроллерах - главная,в нее передается управление один единственный раз и из нее уже нет возврата,это не мэйн в прикладной программе для писюка,который вываливается обратно в ось с результатом завершения программы. Поэтому писать тип возвращаемого значения для main в программе для контроллера - нонсенс. Попали в мэйн - и крутитесь там до посинения, выключения питания или до зависона,если собаку не обучили.

Все остальные картинки повесь себе на стену,на память.
 
  • 🔴 05:39 Повітряна тривога в Харків.обл.
  • #19

О госпади...)) вот о чем спор.. ))))
 
  • 🔴 05:39 Повітряна тривога в Харків.обл.
  • #20

Это не мне Это надо было подумать разработчикам VinAVR, как я уже заметил в начале

Но они полные фанаты GNU и GPL и прочего каноничного. И по этому им было поебать, шо это микроконтроллер, они растопырили пальтсы веером и сказали, что у них полностью классический, каноничный и аутентичный С

Посему всё как положено.

О госпади...)) вот о чем спор.. ))))

Та я сам не понял о чем спор. А когда спор идёт непонятно о чем, то он автоматически начинает зваться холиваром