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

 
 
> как создать массив из bit?, CodeVision
zuuuuk
сообщение Sep 30 2008, 06:44
Сообщение #1


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

Группа: Участник
Сообщений: 188
Регистрация: 26-04-07
Пользователь №: 27 334



Добрый день.
Я собираюсь программировать контроллер AT90S8515 в CodeVision.
Возник вопрос.
Можно ли создать массив с типом bit?
И обращаться к отдельным битам этого массива.

Я пробовал вот так
typedef struct {
char mybit:1;
} b;
b Bit[127];
…..

Bit[counter].mybit=PINA.0;

Но запись в память происходит, по типу char. Массив занимает много места.
Пожалуйста, плдскажите другие варианты.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Ph. Anatoliy
сообщение Oct 1 2008, 11:15
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 14-12-07
Из: г. Таганрог, Ростовская обл.
Пользователь №: 33 310



Цитата(zuuuuk @ Sep 30 2008, 10:44) *
Добрый день.
Я собираюсь программировать контроллер AT90S8515 в CodeVision.
Возник вопрос.
Можно ли создать массив с типом bit?
И обращаться к отдельным битам этого массива.

Я пробовал вот так
typedef struct {
char mybit:1;
} b;
b Bit[127];
…..

Bit[counter].mybit=PINA.0;

Но запись в память происходит, по типу char. Массив занимает много места.
Пожалуйста, плдскажите другие варианты.


Доброго времени суток!

Вот Вам, мой вариант:
#define BUFFER_BIT_SIZE 32

unsigned char buffer[BUFFER_BIT_SIZE/8+1]; // +1 для запаса. Если буфер кратен 8 то не нужно

void set_bit_buffer (unsigned char value)
{
unsigned char b,i;

b = value/8;
i = value%8;

buffer[b] |= (0x80 >> i);
}

unsigned char get_bit_buffer (unsigned char value)
{
unsigned char b,i;

b = value/8;
i = value%8;

b = buffer[b];
b <<= i;
b &= 0x80;

return b; // Если бит = "1" возвращаем 0x80;
}

Такой вариант будет экономить память, но нагружать АЛУ (соответсвенно - потери в скорости).
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 1 2008, 14:56
Сообщение #3


Гуру
******

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



Цитата(Ph. Anatoliy @ Oct 1 2008, 14:15) *
Вот Вам, мой вариант:
#define BUFFER_BIT_SIZE 32

unsigned char buffer[BUFFER_BIT_SIZE/8+1]; // +1 для запаса. Если буфер кратен 8 то не нужно
А вот Вам мой:
Код
unsigned char buffer[(BUFFER_BIT_SIZE + 7)/8];//всегда выделяет столько, сколько нужно
И можно оформить это в виде макросов:
Код
#ifndef    BIT_ARRAY_H__
#define    BIT_ARRAY_H__
#include    <stdint.h>

#define    BA_BASE    uint8_t                                // 8 bits
#define    BA_BASE_BITS    (CHAR_BIT * sizeof(BA_BASE))        // 8
#define    BA_BASE_MASK    (BA_BASE_BITS - 1)                    // 7 = 0x07

#define    BIT_ARRAY(name, size)    \
    BA_BASE name[ (size + BA_BASE_BITS - 1) / BA_BASE_BITS ]
//  Macro can be modified to functions to reduce code size
#define    BIT_SET(array, bit)        \
    do { array[ bit / BA_BASE_BITS ] |=  (1 << ( bit & BA_BASE_MASK)); } while (0)
#define    BIT_CLR(array, bit)        \
    do { array[ bit / BA_BASE_BITS ] &= ~(1 << ( bit & BA_BASE_MASK)); } while (0)
#define    BIT_TEST(array, bit)    \
    ( array[ bit / BA_BASE_BITS ] & (1 << ( bit & BA_BASE_MASK)) )

/*
// functions can be placed into separate .c file to reduce code size
void BIT_SET(BA_BASE *array, uint8_t bit)
{
    array[ bit / BA_BASE_BITS ] |=  (1 << ( bit & BA_BASE_MASK));
}
void BIT_CLR(BA_BASE *array, uint8_t bit)
{
    array[ bit / BA_BASE_BITS ] &=  ~(1 << ( bit & BA_BASE_MASK));
}
BA_BASE BIT_TEST(BA_BASE *array, uint8_t bit)
{
    return array[ bit / BA_BASE_BITS ] & (1 << ( bit & BA_BASE_MASK));
}
*/
#endif    //BIT_ARRAY_H__

использование:
BIT_ARRAY(Array1, 50);
BIT_ARRAY(Array2, 16);
void test()
{
     BIT_SET(Array1, 45);
     if(BIT_TEST(Array1, 27))
          BIT_CLR(Array2, 5)
}


--------------------
На любой вопрос даю любой ответ
"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



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

 


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


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