Змінюй хід війни! Допомагай ЗСУ!

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

🟠 19:48 Загроза ударних БпЛАЗагроза БпЛА типу «Шахед»#м_Харків_та_Харківська_територіальна_громада
Статус: Offline
Реєстрація: 17.08.2005
Повідом.: 48736
  • 🟠 19:48 Загроза ударних БпЛАЗагроза БпЛА типу «Шахед»#м_Харків_та_Харківська_територіальна_громада
  • #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++;
}

}

Оно компилируется в некий перл:
---- UNKNOWN_FILE ---------------------------------------------------------------------------------
0: File not found
+00000000: 940C0046 JMP 0x00000046 Jump
+00000002: 940C0050 JMP 0x00000050 Jump
+00000004: 940C0050 JMP 0x00000050 Jump
+00000006: 940C0050 JMP 0x00000050 Jump
+00000008: 940C0050 JMP 0x00000050 Jump
+0000000A: 940C0050 JMP 0x00000050 Jump
+0000000C: 940C0050 JMP 0x00000050 Jump
+0000000E: 940C0050 JMP 0x00000050 Jump
+00000010: 940C0050 JMP 0x00000050 Jump
+00000012: 940C0050 JMP 0x00000050 Jump
+00000014: 940C0050 JMP 0x00000050 Jump
+00000016: 940C0050 JMP 0x00000050 Jump
+00000018: 940C0050 JMP 0x00000050 Jump
+0000001A: 940C0050 JMP 0x00000050 Jump
+0000001C: 940C0050 JMP 0x00000050 Jump
+0000001E: 940C0050 JMP 0x00000050 Jump
+00000020: 940C0050 JMP 0x00000050 Jump
+00000022: 940C0050 JMP 0x00000050 Jump
+00000024: 940C0050 JMP 0x00000050 Jump
+00000026: 940C0050 JMP 0x00000050 Jump
+00000028: 940C0050 JMP 0x00000050 Jump
+0000002A: 940C0050 JMP 0x00000050 Jump
+0000002C: 940C0050 JMP 0x00000050 Jump
+0000002E: 940C0050 JMP 0x00000050 Jump
+00000030: 940C0050 JMP 0x00000050 Jump
+00000032: 940C0050 JMP 0x00000050 Jump
+00000034: 940C0050 JMP 0x00000050 Jump
+00000036: 940C0050 JMP 0x00000050 Jump
+00000038: 940C0050 JMP 0x00000050 Jump
+0000003A: 940C0050 JMP 0x00000050 Jump
+0000003C: 940C0050 JMP 0x00000050 Jump
+0000003E: 940C0050 JMP 0x00000050 Jump
+00000040: 940C0050 JMP 0x00000050 Jump
+00000042: 940C0050 JMP 0x00000050 Jump
+00000044: 940C0050 JMP 0x00000050 Jump
+00000046: 2411 CLR R1 Clear Register
+00000047: BE1F OUT 0x3F,R1 Out to I/O location
+00000048: EFCF SER R28 Set Register
+00000049: E1D0 LDI R29,0x10 Load immediate
+0000004A: BFDE OUT 0x3E,R29 Out to I/O location
+0000004B: BFCD OUT 0x3D,R28 Out to I/O location
+0000004C: 940E0052 CALL 0x00000052 Call subroutine
+0000004E: 940C0056 JMP 0x00000056 Jump
+00000050: 940C0000 JMP 0x00000000 Jump
@00000052: main
---- GCC_tst.c ------------------------------------------------------------------------------------
7: {
+00000052: E084 LDI R24,0x04 Load immediate
+00000053: BB88 OUT 0x18,R24 Out to I/O location
10: if(PINB!=0xFF)
+00000054: B386 IN R24,0x16 In from I/O location
+00000055: CFFF RJMP PC-0x0000 Relative jump
10: if(PINB!=0xFF)
+00000056: 94F8 CLI Global Interrupt Disable
+00000057: CFFF RJMP PC-0x0000 Relative jump
+00000058: 00FF ??? Data or unknown opcode
+00000059: FFFF ??? Data or unknown opcode
+0000005A: FFFF ??? Data or unknown opcode
+0000005B: FFFF ??? Data or unknown opcode

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

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



гыгы.. 6 человек уже просмотрело и молчит. Значит ни кто ни чё не понял и бред удался!!
 
Останнє редагування:
  • 🟠 19:48 Загроза ударних БпЛАЗагроза БпЛА типу «Шахед»#м_Харків_та_Харківська_територіальна_громада
  • #2
Решил на работе поставить последнюю АВРСтудию и ЖЦЦ.

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

Ну завожу ж проект. Ну посмотреть что там оно вообще, работает чи не. Пишу:


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


и висит естественно на 0x55м адресе в куске:

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



гыгы.. 6 человек уже просмотрело и молчит. Значит ни кто ни чё не понял и бред удался!!
Славик,не говори на языке,которого ты не знаешь,не поймут тебя;)
А если серьезно - то:
1. ты объявил int main() - а значения не возвращаешь
2. таблицу переходов на обработчики прерываний компилер скомпилил правильно
3. в точке входа в программу по ресету идет инициализация стека
4. а дальше разбирайся сам.
 
  • 🟠 19:48 Загроза ударних БпЛАЗагроза БпЛА типу «Шахед»#м_Харків_та_Харківська_територіальна_громада
  • #3
Славик,не говори на языке,которого ты не знаешь,не поймут тебя;)
Эммм... вообще-то знаю :) Что непонятно?

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


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

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

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

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

P.S. А глюки, когда при включении оптимизации в дезасме у студии появляются повторяющиеся куски кода, как мне сказали - стандартное дело.
 
  • 🟠 19:48 Загроза ударних БпЛАЗагроза БпЛА типу «Шахед»#м_Харків_та_Харківська_територіальна_громада
  • #4
  • 🟠 19:48 Загроза ударних БпЛАЗагроза БпЛА типу «Шахед»#м_Харків_та_Харківська_територіальна_громада
  • #5
Могу только повторить еще раз - учи язык... :(
Эмм... что не понятно во фразе "не знаю почему в WinAVR так?
Это действительно стандартное объявление мэйна для этого компилятора :D
Ну он такой, какой есть. Я его не делал. И это мы ещё IAR и Codevision не касаемся - там дальше-больше глюков, в которых разработчик думает, что С это так как он понимает, а не так, как написано :)



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

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

Учить язык я конечно не против, но предложил бы посоветовать это сначала разработчикам WinAVR, у которых своё видение проблемы.
 
Останнє редагування:
  • 🟠 19:48 Загроза ударних БпЛАЗагроза БпЛА типу «Шахед»#м_Харків_та_Харківська_територіальна_громада
  • #6
В скобках у int main (void) слово void уже само по себе означает, что я не собираюсь ни чего возвращать. Не знаю почему в ВинАВР так - так сложилось.
Не знаю, как сейчас, но еще недавно в скобках указывался тип передаваемой переменной (или переменных) функции, а не возвращаемой.:пиво:
 
  • 🟠 19:48 Загроза ударних БпЛАЗагроза БпЛА типу «Шахед»#м_Харків_та_Харківська_територіальна_громада
  • #7
Это действительно стандартное объявление мэйна для этого компилятора :D
Ну,так и верни какое -либо значение в ОС после выхода из main(),если ОСь есть ;)
И это мы ещё IAR и Codevision не касаемся - там дальше-больше глюков, в которых разработчик думает, что С это так как он понимает, а не так, как написано :)
IAR генерит наиболее вменяемый код,надо только объяснить ему,чего хочешь:)
P.S. Варнинг будет выглядеть вот так:
Вполне адекватный ворнинг - объявил функцию,возвращающую значение,а ничего не возвращаешь."Где деньги,Зин?" ;)
Учить язык я конечно не против, но предложил бы посоветовать это сначала разработчикам WinAVR, у которых своё видение проблемы.
Ты чего-то хочешь от разработчиков гнутого софта ?:confused:
 
  • 🟠 19:48 Загроза ударних БпЛАЗагроза БпЛА типу «Шахед»#м_Харків_та_Харківська_територіальна_громада
  • #8
Не знаю, как сейчас, но еще недавно в скобках указывался тип передаваемой переменной (или переменных) функции, а не возвращаемой.:пиво:

Ye ште в типе функции оправдан:
Может ли main возвращать void

Вообще по Стандарту C++ функция main обязана возвращать int. Насколько мне известно, так же обстоят дела и в Стандарте С. И объявление функции main как void main формально ведет к undefined behavior. Тем не менее, main очень часто объявляют как void, особенно в синтетических примерах, код при это генерируется нормально. В принципе, объявление main как void может привести к проблемам, в частности код может получиться непортируемым.
Возвращаемый результат функции main иногда становится предметом вялых религиозных споров. Лично я чаще объявляю void main.

Ссылки по теме:
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
Страуструп в своем FAQ'e рассказывает, что объявлять main как void некорректно

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

Показать, что функция не принимает никаких аргументов можно с помощью void. В языке С++ (не в С) принятно, что пустые скобки равнозначны void. (В языке С пустые скобки означают что вы ничего не собщаете о наличии аргументов )

Но внимательный анонимус всегда может откомментить это как:
Независимо ни от чего в функцию main параметрами передаётся то, что положено передаваться: argc, argv и на некоторых системах envp. Что ты опишешь в качестве параметров - мягко говоря пофигу. Ты можешь туда структуру записать - компилятору всё равно

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

Вывод:
Вики согласно со мной:
Proof Link
In C and C++, the function prototype of the main function looks like one of the following:

int main(void)

int main(int argc, char *argv[])

The parameters argc, argument count, and argv, argument vector[1], respectively give the number and value of the program's command-line arguments.

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

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

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

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


Ты чего-то хочешь от разработчиков гнутого софта ?:confused:
А в IAR и кодевижен не так? :)
 
  • 🟠 19:48 Загроза ударних БпЛАЗагроза БпЛА типу «Шахед»#м_Харків_та_Харківська_територіальна_громада
  • #9
Выясняется, что если функция, возвращающая int, в скобках имеет (void), то как бы и возвращать ни чего не надо, как и писать в конце return 0;
Не?
Ты понял,чего написал? :)
Ну,что-ж,остается только пожелать почитать аппноту AVR035 от Atmel...
Впрочем,сначала K&R.
Узнаешь много удивительного для себя.
LMD ;)
 
Останнє редагування:
  • 🟠 19:48 Загроза ударних БпЛАЗагроза БпЛА типу «Шахед»#м_Харків_та_Харківська_територіальна_громада
  • #10
А, да, я неправильно выразился - "void" в скобках говорит не что я не собираюсь ничего возвращать, а говорит, что я не собираюсь main-у ничего давать в качестве аргумента. Тут да.

Выясняется, что если функция, возвращающая int, в скобках имеет (void), то как бы и возвращать ничего не надо, как и писать в конце return 0;
То ли леший нынче рьян, то ли воздух нынче пьян (с)
 
  • 🟠 19:48 Загроза ударних БпЛАЗагроза БпЛА типу «Шахед»#м_Харків_та_Харківська_територіальна_громада
  • #11
  • 🟠 19:48 Загроза ударних БпЛАЗагроза БпЛА типу «Шахед»#м_Харків_та_Харківська_територіальна_громада
  • #12
Та я собсно и разобрался уже - volatile объявляешь и оптимизатор перестаёт выяпуваться, а начинает оптимизировать.
Если переменная объявлена как volatile, то оптимизатор таки не начинает, а перестает оптимизировать ;)

Если вместо типа инт написать ничего, компилятор сообщит о самодеятельности:
Надо писать не ничего, а void...

Выясняется, что если функция, возвращающая int, в скобках имеет (void), то как бы и возвращать ни чего не надо, как и писать в конце return 0;
Не?
С какой стати?
 
  • 🟠 19:48 Загроза ударних БпЛАЗагроза БпЛА типу «Шахед»#м_Харків_та_Харківська_територіальна_громада
  • #13
  • 🟠 19:48 Загроза ударних БпЛАЗагроза БпЛА типу «Шахед»#м_Харків_та_Харківська_територіальна_громада
  • #14
Не упоминайте всуе того,о чем Вы не имеете ни малейшего представления.Штудируйте Кернигана и Ричи - оно попустит...

Вот это?
...Выражение можно привести к тину void операцией приведения типа. Например, применительно к вызову функции, используемому в роли выражения-инструкции, операция приведения к void явным образом подчеркивает тот факт, что результат функции отбрасывается...
(С)Керниган, Ритчи Язык программирования Си. Приложение A. Справочное руководство.

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

Сдается мне у вас случился
epic-fail-sports-fail-epic-forehead-weak-retard-demotivational-poster-1206344902.jpg




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

Если бы вы сами знали, то так бы и сказали :) Ибо объяснение занимает всего одну строку:
В составе декларатора функции: указывает на то, что функция имеет прототип и не имеет параметров. Например:

С майн это несколько нетак. Я не объявляю её прототип.
По этому история такова:
До публикации первого стандарта Си в 1989г., которая ввела в язык ключевое слово void общепринятой практикой было объявлять функции, не возвращающие значений без использования спецификаторов типов. Хотя семантически такое объявление было эквивалентно объявлению функции, возвращающей значение типа int, намеренно опущенные спецификаторы типа подчеркивали, что функция не возвращает никакого определенного значения.
и писали int main();
А потом появилось void.
И завершены были небо и земля и весь сонм ихъ
И завершил всесильный в седьмой день дело своё, которое он созидал
И глянул всесильный на творение рук своих и возрадовался.
И сказал всесильныйъ
- Заебись!
И тут всё как заеблось....
 
Останнє редагування:
  • 🟠 19:48 Загроза ударних БпЛАЗагроза БпЛА типу «Шахед»#м_Харків_та_Харківська_територіальна_громада
  • #15
По теме - АВР студия круче Реса, как ни крути!))))
 
  • 🟠 19:48 Загроза ударних БпЛАЗагроза БпЛА типу «Шахед»#м_Харків_та_Харківська_територіальна_громада
  • #16
  • 🟠 19:48 Загроза ударних БпЛАЗагроза БпЛА типу «Шахед»#м_Харків_та_Харківська_територіальна_громада
  • #17
Да, я не компилирую С "в уме". Зато AVR-студия не умеет холиварить на форуме :D

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

Не вникал в суть вопроса, но -
Ты с IAR-ом сравнение сделай.. :) Мне ж интересно будет на результат посмотреть.. :)
В GCC не работал, а вот CVAVR , вобще на асме такую куйню вытворяет, что в листинг стремно смотреть (зато удобный, зараза, в плане если чего быстро написать нужно.. Библиотеки таки выручают). IAR ничего так... юзаю.. нравится..:)
 
  • 🟠 19:48 Загроза ударних БпЛАЗагроза БпЛА типу «Шахед»#м_Харків_та_Харківська_територіальна_громада
  • #18
И чем отличается "результат отбрасывается" от "и не собираюсь ни чего возвращать"?
Или вам излагать надо исключительно теми словами, которые в книжке?
Да просто тебе надо было подумать и понять,что функция main в контроллерах - главная,в нее передается управление один единственный раз и из нее уже нет возврата,это не мэйн в прикладной программе для писюка,который вываливается обратно в ось с результатом завершения программы. Поэтому писать тип возвращаемого значения для main в программе для контроллера - нонсенс. Попали в мэйн - и крутитесь там до посинения, выключения питания или до зависона,если собаку не обучили.

Все остальные картинки повесь себе на стену,на память.:)
 
  • 🟠 19:48 Загроза ударних БпЛАЗагроза БпЛА типу «Шахед»#м_Харків_та_Харківська_територіальна_громада
  • #19
Да просто тебе надо было подумать и понять,что функция main в контроллерах - главная,в нее передается управление один единственный раз и из нее уже нет возврата,это не мэйн в прикладной программе для писюка,который вываливается обратно в ось с результатом завершения программы. Поэтому писать тип возвращаемого значения для main в программе для контроллера - нонсенс. Попали в мэйн - и крутитесь там до посинения, выключения питания или до зависона,если собаку не обучили.

Все остальные картинки повесь себе на стену,на память.:)

:) О госпади...)) вот о чем спор.. :)))))
 
  • 🟠 19:48 Загроза ударних БпЛАЗагроза БпЛА типу «Шахед»#м_Харків_та_Харківська_територіальна_громада
  • #20
Да просто тебе надо было подумать и понять,что функция main в контроллерах - главная,в нее передается управление один единственный раз и из нее уже нет возврата,это не мэйн в прикладной программе для писюка,который вываливается обратно в ось с результатом завершения программы. Поэтому писать тип возвращаемого значения для main в программе для контроллера - нонсенс. Попали в мэйн - и крутитесь там до посинения, выключения питания или до зависона,если собаку не обучили.

Все остальные картинки повесь себе на стену,на память.:)

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

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

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

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

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