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

 
 
> Переменные типа bit в CodeVision.
_Алекс
сообщение Sep 14 2006, 09:10
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 14-09-06
Пользователь №: 20 377



В общем, структура:
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.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
otrog
сообщение Sep 14 2006, 09:43
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589



Цитата(_Алекс @ 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-ми битной? Тогда и код сгенерируется короче.


--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 14 2006, 09:43
Сообщение #3


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(_Алекс @ 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
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Sep 14 2006, 09:48
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(_Алекс @ 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;
Go to the top of the page
 
+Quote Post
_Bill
сообщение Sep 14 2006, 09:48
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(_Алекс @ Sep 14 2006, 12:10) *
Как правильно работать с битами в CodeVision на Си, чтоб код был эффективным, а не раздувался от инструкций которые нагенерил CodeVision.

Обычно для обработки полей код менее оптимальным получается, хотя исходный текст более компактный и читабельный. Если хотите иметь код оптимальным, используйте маски отдельных битов.
Go to the top of the page
 
+Quote Post
_Алекс
сообщение Sep 14 2006, 10:02
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 14-09-06
Пользователь №: 20 377



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

Ошибка
[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
Go to the top of the page
 
+Quote Post
otrog
сообщение Sep 14 2006, 10:07
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589



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

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


--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
Go to the top of the page
 
+Quote Post
_Алекс
сообщение Sep 14 2006, 10:15
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 14-09-06
Пользователь №: 20 377



Цитата(otrog @ Sep 14 2006, 13:07) *
Цитата(_Алекс @ Sep 14 2006, 14:02) *

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

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



Ну да
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 01:09
Рейтинг@Mail.ru


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