|
Почему не работает код? |
|
|
|
May 16 2008, 17:48
|

Частый гость
 
Группа: Свой
Сообщений: 120
Регистрация: 19-02-08
Пользователь №: 35 166

|
Не могу понять - почему не работает код, когда тут вроде бы висеть нечему! Компилятор - CodeVision, славится своей тупизной в общении с типами данных. Контроллер - ATMega8535. Почему-то вот такой код не работает: Код //.... typedef unsigned char byte; typedef unsigned long int dword;
dword SID = 0L;
typedef struct { byte extended_identifier; dword identifier; //32 bit // data length: byte dlc; byte dta[8]; // Acceptence Filter that enabled the reception byte filhit; byte rtr; } CanMessage; ... //теперь необходимо сдвинуть идентификатор на 5 бит влево... SID = (dword)(((dword)(msg.identifier)) << 5);
//Вот тут и висим, непонятно почему... //так как следующий оператор ничего в порт не выводит:
printf("Packet observed: SID=0x%04lX; data: ", SID); for (i=0; i<=7; i++) printf("[0x%02X] ", msg.dta[i]); printf("\n"); LED_WORK = 0; //... Вот почему висим там? Чему там висеть-то??
|
|
|
|
|
May 16 2008, 18:26
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(DMD @ May 16 2008, 21:48)  Вот почему висим там? Чему там висеть-то?? ЕМНИП у CV имеется настройка возможностей printf - в опциях компилятора. По умолчанию кажется стоит такая, что тип long не воспринимается.
|
|
|
|
|
May 16 2008, 18:56
|
Частый гость
 
Группа: Участник
Сообщений: 99
Регистрация: 14-12-05
Пользователь №: 12 191

|
Код typedef unsigned long int dword; вот это я не понял, что за запись.... dword - какая размерность?
|
|
|
|
|
May 16 2008, 19:53
|

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

|
Цитата(DMD @ May 16 2008, 22:45)  32 бита не хотите попробовать нормальный компилятор? не придется городить в коде черт знает что  это же ужОс: Цитата SID = (dword)(((dword)(msg.identifier)) << 5); SID - dword, identifier тоже dword для нормального компилятора достаточно просто написать SID = msg.identifier << 5; да и тип звучал бы так: typedef unsigned long dword; Цитата Почему-то вот такой код не работает Может проблемы со стеком? Все же в 8535 памяти не так много, а у вас там "нидецкие" printf'ы
|
|
|
|
|
May 16 2008, 23:22
|

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

|
Цитата(DMD @ May 17 2008, 01:46)  "нидецкие" printf - это чисто для отладки. Да понятно что для отладки, но память то они все равно жрут ;> Цитата Нормальный компилятор давно ищу и не могу найти, не подскажете? Компиляторы (нормальные) - Бесплатный WinAVR (avrgcc) встраивается в AVR-Studio (только самый последний релиз не советую брать он еще сырой, стабильная версия "на сейчас" 20071221). Небесплатный IAR-Systems с IDE IAR-EWAVR, the best for AVR. С ними хоть можно не так сильно бояться насчет Цитата что на какой-нибудь косяк компилятора нарвусь...
|
|
|
|
|
May 17 2008, 04:42
|
Участник

Группа: Участник
Сообщений: 55
Регистрация: 17-04-08
Пользователь №: 36 850

|
Цитата(DMD @ May 17 2008, 01:46)  unsigned char t = 255; unsigned f = t << 3; Хелп читать надо и по настройкам лазить! Советские инженеры блин... Все правильно компилятор делает! Контроллер-то 8-ми битный! операции над int'ами занимают больше времени чем над char'ами. Хотите пример? Пожалуйста: Код ; char a,b,c; ; a -> R17 ; b -> R16 ; c -> R19
; a = b + c; MOV R30,R19 ADD R30,R16 MOV R17,R30
; a = (char)((int)a + (int)b); MOV R26,R17 LDI R27,0 SBRC R26,7 SER R27 MOV R30,R16 LDI R31,0 SBRC R30,7 SER R31 ADD R30,R26 MOV R17,R30 Какой код будет работать быстрее? Может такты посчитаем? Но если вам все равно на скорость, а хочется " правильности" то вам сюда: Project -> Configure -> C compiler -> Code generation -> Promote char to int
|
|
|
|
|
May 17 2008, 10:08
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(DMD @ May 17 2008, 01:46)  так не пробовал, но боюсь, что на какой-нибудь косяк компилятора нарвусь... integer promotion rules распространяются на типы меньше int размером. В противном случае левая и правая части подвыражения приводятся к наибольшему типу, который у вас совпадает с типом результата. Так что тут приведение совершенно лишнее. Цитата(Nick_Shl @ May 17 2008, 07:42)  Советские инженеры блин... Все правильно компилятор делает! Как "правильно" - написано в стандарте. Нормальный компилятор для обоих ваших примеров должен был бы сгенерить одинаковый код. Теперь сравните код для такого примера: Код unsigned char a = 200; unsigned char b = 200;
volatile unsigned int c = a + b; volatile unsigned int d = (unsigned int)a + (unsigned int b); По стандарту результаты должны быть идентичны. Также внимательно прочитайте пост №7 - там тоже очень красивый пример. Цитата(Nick_Shl @ May 17 2008, 07:42)  Контроллер-то 8-ми битный! операции над int'ами занимают больше времени чем над char'ами. То есть вы считаете, что быстрый неправильный код лучше медленного, но правильного? Тогда каким инженером назвать вас? Индийским? Китайским?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 17 2008, 14:30
|
Участник

Группа: Участник
Сообщений: 55
Регистрация: 17-04-08
Пользователь №: 36 850

|
Цитата(Сергей Борщ @ May 17 2008, 13:08)  То есть вы считаете, что быстрый неправильный код лучше медленного, но правильного? Тогда каким инженером назвать вас? Индийским? Китайским? А что значит не правильный? Если надо - используйте явное и логичное приведение типов - и все будет ок. Если компилятор работает не так как вы ожидаете, это не значит, что он " не правильный"! Кто вам вообще сказал, что этот компилятор полностью соответствует Си? Опять открываем хелп и читаем: Цитата The C cross-compiler implements nearly all the elements of the ANSI C language, as allowed by the AVR architecture, with some features added to take advantage of specificity of the AVR architecture and the embedded system needs. То есть " близко к Си, адаптировано под AVR". И это правильно. А то потом будут говорить: " все компиляторы гавно, в полной мере можно только на асме ядро использовать". Я стандартов не читал, хотя на Си уже достаточно давно работаю. А про это правило только недавно из этого форума узнал. И честно говоря мне оно не нравится, как и любая другая не явная вещь... И вообще, Си( под x86) мне понравился тем, что позволяет сделать то же, что и на асме( и я тогда пожалел, что классе в 9-ом учил асм, а не Си), а если он не будет позволять, зачем он тогда нужен?
|
|
|
|
|
May 17 2008, 16:16
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
Цитата(Nick_Shl @ May 17 2008, 18:30)  Я стандартов не читал, хотя на Си уже достаточно давно работаю. А про это правило только недавно из этого форума узнал. И честно говоря мне оно не нравится, как и любая другая не явная вещь... а си познавали через астрал,напрямую подсоединившись к ноосфере? а если как все по книжкам,то в любой книге по С правила приведения типов расписаны очень подробно.да их и не много,на полстранички вмещаются. З.Ы. а с приоритетом операций у вас та-же фигня?
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
May 17 2008, 16:37
|
Участник

Группа: Участник
Сообщений: 55
Регистрация: 17-04-08
Пользователь №: 36 850

|
Цитата(WHALE @ May 17 2008, 19:16)  а си познавали через астрал,напрямую подсоединившись к ноосфере?  Почти. В основном в универе( у нас был хороший преподаватель). Учебники не люблю. А вот книжка " Полный справочник по С" Шилдта то что надо + MSDN. Но в справочники лезут или когда чего-то не знают или когда что-то не работает. Поэтому про то самое " Promote char to int" и не знал - это знание мне было просто не нужно. Вообще после асма Си очень легко дался. Кстати у нас сначала преподавали Си, а потом асм, что считаю не правильно - мало кто понял с первого раза что такое указатели... Цитата(WHALE @ May 17 2008, 19:16)  З.Ы. а с приоритетом операций у вас та-же фигня? Да вроде нет. Если не уверен - то можно и скобочки поставить.  А вобще если возникают такие проблемы, то лучше пользоваться обратной польской записью.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|