Здесь я передаю массив битов какой-то другой функции.
Поскольку размер массива слишком велик, при компиляции выдается сообщение об ошибке «сегмент данных слишком большой».
Я недавно отредактировал код. Но ошибка: слишком большой сегмент данных все еще существует
Это код:
char TxBits[]={0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,0,0,1,0,1,0,1,1,0,1,1,0,1,1,1,0,
0,0,0,1,1,0,0,0,1,0,0,1,0,0,1,1,1,1,1,1,0,1,0,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int nTxBits = sizeof(TxBits)/sizeof(char);
void data(char *TxBits,int nTxBits, int loopcount)
{
int i;
for (i = 0;i < nTxBits;i++)
{
gpio=TxBits[i];
wait(loopcount);
}
}
Итак, я думаю о преобразовании битов в массиве в байты и передаче в функцию. Могу ли я узнать, как поступить? открыт для предложений.
Пожалуйста, ответьте
Из вашего кода я считаю, что вы работаете с каким-то микроконтроллером, поэтому я не уверен, серьезно ли вы относитесь к тегу C ++ или нет. Если да, то это решение в стиле C ++, которое использует std::bitset
(специализированный контейнер для работы с битами, который будет занимать меньше места):
std::bitset<134> foo (std::string("01010101010101010101010100101010101010101010101010010101010101010101010101001010101010101010101010100101010101010101010101010100000000"));
void data(const std::bitset& bitset, int loopcount) {
// if C++11
for (auto& bit : foo) {
gpio = bit;
wait(loopcount);
}
// if C++98
// for (int i = 0; i<bitset.size(); i++) {
// gpio = foo[i];
// wait(loopcount);
// }
}
Вам, вероятно, нужно это:
void data(char *TxBits, int size) // size of the number of elements of your table
{
int i;
for (i = 0;i < size; i++)
{
gpio=TxBits[i];
wait(loopcount);
}
}
Вызов функции
data(TxBits, sizeof(TxBits) / sizeof(TxBits[0]);
Чтобы получить количество элементов массива мы используем sizeof(TxBits) / sizeof(TxBits[0]
где sizeof(TxBits)
количество байтов, которое массив занимает в памяти и sizeof(TxBits[0]
это размер одного элемента массива.
Я передаю массив битов в другую функцию
Нет, вы передаете массив байтов, каждый байт имеет двоичное значение 00000000 или 00000001.
Чтобы сэкономить память, вы должны хранить битовые значения как фактические биты, а не как байты:
uint8_t TxBits[]=
{ 0x55, // 0,1,0,1,0,1,0,1,
0x55, // 0,1,0,1,0,1,0,1,
0x55, // 0,1,0,1,0,1,0,1,
0x00, // 0,0,0,0,0,0,0,0,
0x20, // 0,0,1,0,0,0,0,0,
...
};
size_t nTxBits = sizeof(TxBits) / 8;
Вам также следует избегать char
Тип всякий раз, когда выполняется арифметика, так как он имеет подпись, определяемую реализацией.
Также, если это небольшая микроконтроллерная система, вы должны по возможности распределять данные в ПЗУ, а не в ОЗУ. То есть: const uint8_t TxBits[]
,
Ваш параметр не объявлен правильно. Заменить это:
void data(char TxBits)
этим
void data(char [] TxBits)
Ваша функция
void data(char TxBits)
Должно быть
void data(char *TxBits, size_t nTxBits)
{
int i;
for (i = 0;i < nTxBits;i++)
{
gpio=TxBits[i];
wait(loopcount);
}
}
Вы можете позвонить по этому адресу:
data ( TxBits, sizeof(TxBits)/sizeof(TxBits[0]) );
В этом конкретном случае у вас есть char
массив, и вы также можете написать:
data (TxBits, sizeof(TxBits));