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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Почему не работает код?
DMD
сообщение May 16 2008, 17:48
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 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;
//...

Вот почему висим там? Чему там висеть-то??
Go to the top of the page
 
+Quote Post
Qwertty
сообщение May 16 2008, 18:26
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(DMD @ May 16 2008, 21:48) *
Вот почему висим там? Чему там висеть-то??

ЕМНИП у CV имеется настройка возможностей printf - в опциях компилятора. По умолчанию кажется стоит такая, что тип long не воспринимается.
Go to the top of the page
 
+Quote Post
DMD
сообщение May 16 2008, 18:43
Сообщение #3


Частый гость
**

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



Нее, тут все ОК, я тоже думал. Стоит long,width опция


--------------------
Все будет хорошо! Я проверял!
Go to the top of the page
 
+Quote Post
plombir
сообщение May 16 2008, 18:56
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 99
Регистрация: 14-12-05
Пользователь №: 12 191



Код
typedef unsigned long int dword;

вот это я не понял, что за запись....
dword - какая размерность?
Go to the top of the page
 
+Quote Post
DMD
сообщение May 16 2008, 19:45
Сообщение #5


Частый гость
**

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



32 бита


--------------------
Все будет хорошо! Я проверял!
Go to the top of the page
 
+Quote Post
defunct
сообщение May 16 2008, 19:53
Сообщение #6


кекс
******

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



Цитата(DMD @ May 16 2008, 22:45) *
32 бита

не хотите попробовать нормальный компилятор?
не придется городить в коде черт знает что smile.gif

это же ужОс:
Цитата
SID = (dword)(((dword)(msg.identifier)) << 5);


SID - dword,
identifier тоже dword

для нормального компилятора достаточно просто написать
SID = msg.identifier << 5;

да и тип звучал бы так:
typedef unsigned long dword;


Цитата
Почему-то вот такой код не работает

Может проблемы со стеком? Все же в 8535 памяти не так много, а у вас там "нидецкие" printf'ы
Go to the top of the page
 
+Quote Post
DMD
сообщение May 16 2008, 22:46
Сообщение #7


Частый гость
**

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



"нидецкие" printf - это чисто для отладки. Нормальный компилятор давно ищу и не могу найти, не подскажете?
SID = msg.identifier << 5; - так не пробовал, но боюсь, что на какой-нибудь косяк компилятора нарвусь... "Косяк" - потому что кто-то посчитал, что преобразование к int перед, к примеру, сдвигом - операция ненужная в целях экономии чертовой памяти... Поэтому вот такой код не работает (хоть и компилится на все 100%):

unsigned char t = 255;
unsigned f = t << 3;

И такая штука твориться только в CodeVision, я на ней неделю просидел - все не мог вдуплить чего там твориться... Пришлось копаться в ассемблере. ..


--------------------
Все будет хорошо! Я проверял!
Go to the top of the page
 
+Quote Post
defunct
сообщение May 16 2008, 23:22
Сообщение #8


кекс
******

Группа: Свой
Сообщений: 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.

С ними хоть можно не так сильно бояться насчет
Цитата
что на какой-нибудь косяк компилятора нарвусь...
Go to the top of the page
 
+Quote Post
Nick_Shl
сообщение May 17 2008, 04:42
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
WHALE
сообщение May 17 2008, 07:12
Сообщение #10


Знающий
****

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



да,все правильно,только имхо галочку они неправильно назвали-надо было назвать типа стандартный С
Но я в таких ситуациях обычно прагмой #pragma promotechar+ разруливаю,если нужна скорость,конечно.Если нет,то птица в конфигурации проекта.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 17 2008, 10:08
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
WHALE
сообщение May 17 2008, 10:18
Сообщение #12


Знающий
****

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



Насколько я знаю,многие компиляторы допускают возможность отступления(расширения) стандарта.
В билдере есть,в иаре тоже есть галка типа "использовать стандартный с/c++.В CV тоже самое,есть возможность выбора.Хочешь по стандарту-поставь один раз галку при конфигурировании проекта и все.
И вообще вышла новая версия CV-полный редизайн.Обьем инсталяхи увеличился почти в 4 раза!Первая фраза в описании-new ANSI C compatible C front-end.Судя по описанию-С99.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
Nick_Shl
сообщение May 17 2008, 14:30
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 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-ом учил асм, а не Си), а если он не будет позволять, зачем он тогда нужен?
Go to the top of the page
 
+Quote Post
WHALE
сообщение May 17 2008, 16:16
Сообщение #14


Знающий
****

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



Цитата(Nick_Shl @ May 17 2008, 18:30) *
Я стандартов не читал, хотя на Си уже достаточно давно работаю. А про это правило только недавно из этого форума узнал. И честно говоря мне оно не нравится, как и любая другая не явная вещь...

а си познавали через астрал,напрямую подсоединившись к ноосфере? smile.gif
а если как все по книжкам,то в любой книге по С правила приведения типов расписаны очень подробно.да их и не много,на полстранички вмещаются.
З.Ы. а с приоритетом операций у вас та-же фигня?


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
Nick_Shl
сообщение May 17 2008, 16:37
Сообщение #15


Участник
*

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



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

Цитата(WHALE @ May 17 2008, 19:16) *
З.Ы. а с приоритетом операций у вас та-же фигня?
Да вроде нет. Если не уверен - то можно и скобочки поставить. smile.gif
А вобще если возникают такие проблемы, то лучше пользоваться обратной польской записью. smile.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 Текстовая версия Сейчас: 18th July 2025 - 01:58
Рейтинг@Mail.ru


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