Отговори на тема  [ 18 мнения ]  Отиди на страница 1, 2  Следваща
struct с Битови променливи в CCS .... 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение struct с Битови променливи в CCS ....
значи ... имам структура от 4 бита, с фиксиран адрес, идеята е да мога да предавам с една дума две структури,

struct state{
boolean x
boolean
boolean
boolean}
data[64];

обаче това създание отделя за всеки елемент на data[] по 1 байт ... някой има ли идея как да го накарма да гиара под ред .... по два в байт????
Не че немога да го лъгна по друг начин ама ......


Чет Юли 20, 2006 2:02 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Ами стандартното решение от C някак трябва да използваш.
С тия bool не е ясно как

struct
{
char bit1 : 1;
char bit2 : 1;
char bit3 : 1;
char bit4 : 1;
}

така всяко ше ти е по един бит и цялата структура ти е в един баит.

пък ако искаш по 2 w byte
typedef struct
{
char bit1 : 1;
char bit2 : 1;
}Str2bites;


struct
{
Str2bites first;
Str2bites second;
} Mystruct;


а за самия достъп до битовете в Mystruct можеш да сложиш нещо такова да ти е по удобно
#define BIT1 Mystruct.first.bit1
#define BIT2 Mystruct.first.bit2
#define BIT3 Mystruct.second.bit1
#define BIT4 Mystruct.second.bit2


Последна промяна Nikola Kirov на Чет Юли 20, 2006 2:35 pm, променена общо 1 път



Чет Юли 20, 2006 2:18 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение 
Не въпроса не е в това че структурата не е в един байт, структурата си е в един,обаче нали е data[64], т.е имам 64 такива структури, и всяка от тях заема по 1 байт, т.е 64 байта, но реално е 4 битова, т.е. за този обем данни ми трябват 32 байта а не 64 ...


Чет Юли 20, 2006 2:31 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
А сега схванах какво искаш да питаш.
Ами на това просто решение няма.

става като за достъпа до данните на физическо ниво си оформиш функции
set i get;

Иначе и аз преди търсих начин с стандартни средства да се реализира подобно нещо но с сигурност няма.


Чет Юли 20, 2006 2:40 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Така като гледам в случая най лесно ще си направиш set i get функциите ако си организираш данните така

typedef struct
{
boolean x
boolean
boolean
boolean
} state;


struct state2
{
state first;
state second;
}name[32];


Последна промяна Nikola Kirov на Чет Юли 20, 2006 3:09 pm, променена общо 1 път



Чет Юли 20, 2006 2:45 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение 
да де ще трябва да си напиша .... ще го преживея .:)


Чет Юли 20, 2006 2:47 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Авг 19, 2005 11:38 am
Мнения: 978
Местоположение: Europe -> BG
Мнение 
Nikola Kirov написа:
Така като гледам в случая най лесно ще си направиш set i get функциите ако си организираш данните така

typedef struct
{
boolean x
boolean
boolean
boolean
} state;


struct state2
{
state first;
state second;
}name[32];


Първото което помислих че искаш е това, но то би било вършело работа, ако достъпа ще се извършва последователно на по две от 4 бит. структури.

Т.е още едно подвърждение, че с ANSI C няма как само с дефинирането на структури да направиш това , което искаш.

_________________
един факт :-)
Съжалявам , че исках да помогна ...


Чет Юли 20, 2006 3:06 pm
Профил ICQ
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Чет Ное 10, 2005 9:26 pm
Мнения: 393
Местоположение: Buffalo, NY, USA
Мнение 
@ToHu: Аз не съм работил с този компилатор, но обикновено трябва да има някаква pragma директива, която указва как да се подравняват структурите в паметта - #pragma align или нещо подобно. Погледни в списъка с подобни инструкции, макар че аз лично се съмнявам дали по този начин ще може да се подравнява структура на по-малко от един байт.

_________________
http://blog.georgievi.com


Чет Юли 20, 2006 6:14 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
няма начин, подравняването се отнася за самата структура а тук говорм за масив от структури в който да не остават неизползвани битове след всяка структура.


Чет Юли 20, 2006 7:06 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
CCS не поддържа подравняване на паметта на 4 бита, минимума е 1 байт. Можеш да използваш евентуално bit_set(), bit_clear(), bit_test() функциите, но те работят с максимум до 32 битова променлива, освен това позволяват директна манипулация и тестване на даден адрес от паметта, примерно bit_set(0x10,0) пуска TMR1. Тези функции като 1-ви параметър приемат и указател, вместо променлива, т.е. можеш да ги прилагаш свободно върху целия масив, само ще иска малко аритметика от твоя страна, за да изчисляваш правилно адреса, към който сочи указателя.

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Чет Юли 20, 2006 7:12 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Съб Юни 24, 2006 8:25 pm
Мнения: 2292
Мнение 
Aсемблер. 8)


Пет Юли 21, 2006 12:13 am
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Авг 19, 2005 11:38 am
Мнения: 978
Местоположение: Europe -> BG
Мнение 
Хехе то ясно , че в Асемблер всичко е възможно, но тук се говори за struct (и struct array), което си е С :-)
Така че предложението ти не е за случея :P 8)

_________________
един факт :-)
Съжалявам , че исках да помогна ...


Пет Юли 21, 2006 12:51 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
sthx написа:
Aсемблер. 8)


Какъв асемблер колега.
Като си организира структурите както съм го направил в втория пример функциите Get() i Set() които трябва да организират достъпа са по 2-3 реда :)


Пет Юли 21, 2006 1:26 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение 
Никола, аз го пробвах така,но структурата продължава да си заема 64 байта, както и да е, ако ми дотрябва да пестя място ще го-направя с функции които да си пишат в масив, засега има памет и го оставих на 64 байта, а после като ги чета само шифт и ор да станат един байт и тва е. Мен 64 байта повече ми се искаше за да не губя време като ги предавам, ама по добре там отколкото като ги записвам.


Пет Юли 21, 2006 10:13 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Да и аз нещо съм се замотал. Логично е всяка структура да си я сложи в отделен баит.

ето решение с масив
Код:
char mystruct[32];

///ако съответния бит е 0 връща 0
char GetBit(char bit,char element)
{
    char mask = 1 << bit;
    if ( element & 0x01 ) mask <<= 4;
    return mystruct [element >> 1] & mask;
}

void SetBit(char bit,char element,char value)
{
    char mask = 1 << bit;
    if ( element & 0x01 ) mask <<= 4;
    element >>= 1;
    if ( value == 0 )   
     {
         mask = ~mask;
         mystruct [element] &= mask;
      }
      else  mystruct [element] |= mask;
}
[/code]


Пет Юли 21, 2006 11:22 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 18 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 11 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни