Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Переменные типа bit в CodeVision.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
_Алекс
В общем, структура:
struct RX_BUFER{
unsigned char rxData[RX_BUFFER_SIZE0];
unsigned char index;
unsigned char errorFrame:1;
unsigned char errorCrc16:2;
unsigned char errorComand:4;
unsigned char firstByte:5;
unsigned char readyReceiveByte:6;
unsigned char buferOverflow:7;
unsigned char mesagCompl:8;
} rx_bufer;

Вроде все нормально работает но, например
rx_bufer. errorFrame = 1
rx_bufer. errorCrc16= 1
rx_bufer. errorComand = 1
rx_bufer. buferOverflow = 1
rx_bufer. mesagCompl = 0
Генерит длинный код, в место одной инструкции asm sbr r16, const, в результате откомпилированный код растет на глазах!
Как правильно работать с битами в CodeVision на Си, чтоб код был эффективным, а не раздувался от инструкций которые нагенерил CodeVision.
otrog
Цитата(_Алекс @ Sep 14 2006, 13:10) *
В общем, структура:
struct RX_BUFER{
unsigned char rxData[RX_BUFFER_SIZE0];
unsigned char index;
unsigned char errorFrame:1;
unsigned char errorCrc16:2;
unsigned char errorComand:4;
unsigned char firstByte:5;
unsigned char readyReceiveByte:6;
unsigned char buferOverflow:7;
unsigned char mesagCompl:8;
} rx_bufer;

Вроде все нормально работает но, например
rx_bufer. errorFrame = 1
rx_bufer. errorCrc16= 1
rx_bufer. errorComand = 1
rx_bufer. buferOverflow = 1
rx_bufer. mesagCompl = 0
Генерит длинный код, в место одной инструкции asm sbr r16, const, в результате откомпилированный код растет на глазах!
Как правильно работать с битами в CodeVision на Си, чтоб код был эффективным, а не раздувался от инструкций которые нагенерил CodeVision.

Как то странно структура выглядит. Например unsigned char firstByte:5;. Зчем может понадобиться переменная длиной 5 бит? Может стоит оставить ее 8-ми битной? Тогда и код сгенерируется короче.
singlskv
Цитата(_Алекс @ Sep 14 2006, 13:10) *
В общем, структура:
struct RX_BUFER{
unsigned char rxData[RX_BUFFER_SIZE0];
unsigned char index;
unsigned char errorFrame:1;
unsigned char errorCrc16:2;
unsigned char errorComand:4;
unsigned char firstByte:5;
unsigned char readyReceiveByte:6;
unsigned char buferOverflow:7;
unsigned char mesagCompl:8;
} rx_bufer;

Наверное Вы имели в виду так:
Код
struct RX_BUFER{
  unsigned char rxData[16];
  unsigned char index;
  unsigned char errorFrame:1;
  unsigned char errorCrc16:1;
  unsigned char empty:1;
  unsigned char errorComand:1;
  unsigned char firstByte:1;
  unsigned char readyReceiveByte:1;
  unsigned char buferOverflow:1;
  unsigned char mesagCompl:1;
} rx_bufer;


Цитата(_Алекс @ Sep 14 2006, 13:10) *
Вроде все нормально работает но, например
rx_bufer. errorFrame = 1
Генерит длинный код, в место одной инструкции asm sbr r16, const, в результате откомпилированный код растет на глазах!


Sbr r16,const , будет только для переменных хранящихся в регистрах, а нужно
еще грузить/сохранять в память.
Да и скорее будет ori r,const
andrvisht
Цитата(_Алекс @ Sep 14 2006, 12:10) *
В общем, структура:
struct RX_BUFER{
unsigned char rxData[RX_BUFFER_SIZE0];
unsigned char index;
unsigned char errorFrame:1;
unsigned char errorCrc16:2;
unsigned char errorComand:4;
unsigned char firstByte:5;
unsigned char readyReceiveByte:6;
unsigned char buferOverflow:7;
unsigned char mesagCompl:8;
} rx_bufer;

Попробуйте так:
Код
struct RX_BUFER{                      
   unsigned char rxData[RX_BUFFER_SIZE0];
   unsigned char index;
   unsigned long
   errorFrame:1,        
   errorCrc16:2,          
   errorComand:4,      
   firstByte:5,
   readyReceiveByte:6,
   buferOverflow:7,
   mesagCompl:8;      
} rx_bufer;
_Bill
Цитата(_Алекс @ Sep 14 2006, 12:10) *
Как правильно работать с битами в CodeVision на Си, чтоб код был эффективным, а не раздувался от инструкций которые нагенерил CodeVision.

Обычно для обработки полей код менее оптимальным получается, хотя исходный текст более компактный и читабельный. Если хотите иметь код оптимальным, используйте маски отдельных битов.
_Алекс
Спасибо всем ответившим, я понял свою ошибку, надо было везде ставить по единице, в смысле по одному байту.

Ошибка
[quote name='_Алекс' date='Sep 14 2006, 12:10' post='154446']
В общем, структура:
struct RX_BUFER{
unsigned char rxData[RX_BUFFER_SIZE0];
unsigned char index;
unsigned char errorFrame:1;
unsigned char errorCrc16:2;
unsigned char errorComand:4;
unsigned char firstByte:5;
unsigned char readyReceiveByte:6;
unsigned char buferOverflow:7;
unsigned char mesagCompl:8;
} rx_bufer;


Вот правильно

struct RX_BUFER{
unsigned char rxData[16];
unsigned char index;
unsigned char errorFrame:1;
unsigned char errorCrc16:1;
unsigned char empty:1;
unsigned char errorComand:1;
unsigned char firstByte:1;
unsigned char readyReceiveByte:1;
unsigned char buferOverflow:1;
unsigned char mesagCompl:1;
} rx_bufer;

smile3046.gif
otrog
Цитата(_Алекс @ Sep 14 2006, 14:02) *
Спасибо всем ответившим, я понял свою ошибку, надо было везде ставить по единице, в смысле по одному байту.

Эээ... Всетаки не байту а биту.
_Алекс
Цитата(otrog @ Sep 14 2006, 13:07) *
Цитата(_Алекс @ Sep 14 2006, 14:02) *

Спасибо всем ответившим, я понял свою ошибку, надо было везде ставить по единице, в смысле по одному байту.

Эээ... Всетаки не байту а биту.



Ну да
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.