Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

struct с Битови променливи в CCS ....
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=2682
Страница 1 от 2

Автор:  ToHu [ Чет Юли 20, 2006 2:02 pm ]
Заглавие:  struct с Битови променливи в CCS ....

значи ... имам структура от 4 бита, с фиксиран адрес, идеята е да мога да предавам с една дума две структури,

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

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

Автор:  Nikola Kirov [ Чет Юли 20, 2006 2:18 pm ]
Заглавие: 

Ами стандартното решение от 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

Автор:  ToHu [ Чет Юли 20, 2006 2:31 pm ]
Заглавие: 

Не въпроса не е в това че структурата не е в един байт, структурата си е в един,обаче нали е data[64], т.е имам 64 такива структури, и всяка от тях заема по 1 байт, т.е 64 байта, но реално е 4 битова, т.е. за този обем данни ми трябват 32 байта а не 64 ...

Автор:  Nikola Kirov [ Чет Юли 20, 2006 2:40 pm ]
Заглавие: 

А сега схванах какво искаш да питаш.
Ами на това просто решение няма.

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

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

Автор:  Nikola Kirov [ Чет Юли 20, 2006 2:45 pm ]
Заглавие: 

Така като гледам в случая най лесно ще си направиш set i get функциите ако си организираш данните така

typedef struct
{
boolean x
boolean
boolean
boolean
} state;


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

Автор:  ToHu [ Чет Юли 20, 2006 2:47 pm ]
Заглавие: 

да де ще трябва да си напиша .... ще го преживея .:)

Автор:  the_real_maniac [ Чет Юли 20, 2006 3:06 pm ]
Заглавие: 

Nikola Kirov написа:
Така като гледам в случая най лесно ще си направиш set i get функциите ако си организираш данните така

typedef struct
{
boolean x
boolean
boolean
boolean
} state;


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


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

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

Автор:  vlado [ Чет Юли 20, 2006 6:14 pm ]
Заглавие: 

@ToHu: Аз не съм работил с този компилатор, но обикновено трябва да има някаква pragma директива, която указва как да се подравняват структурите в паметта - #pragma align или нещо подобно. Погледни в списъка с подобни инструкции, макар че аз лично се съмнявам дали по този начин ще може да се подравнява структура на по-малко от един байт.

Автор:  Nikola Kirov [ Чет Юли 20, 2006 7:06 pm ]
Заглавие: 

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

Автор:  [ Чет Юли 20, 2006 7:12 pm ]
Заглавие: 

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

Автор:  sthx [ Пет Юли 21, 2006 12:13 am ]
Заглавие: 

Aсемблер. 8)

Автор:  the_real_maniac [ Пет Юли 21, 2006 12:51 am ]
Заглавие: 

Хехе то ясно , че в Асемблер всичко е възможно, но тук се говори за struct (и struct array), което си е С :-)
Така че предложението ти не е за случея :P 8)

Автор:  Nikola Kirov [ Пет Юли 21, 2006 1:26 am ]
Заглавие: 

sthx написа:
Aсемблер. 8)


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

Автор:  ToHu [ Пет Юли 21, 2006 10:13 am ]
Заглавие: 

Никола, аз го пробвах така,но структурата продължава да си заема 64 байта, както и да е, ако ми дотрябва да пестя място ще го-направя с функции които да си пишат в масив, засега има памет и го оставих на 64 байта, а после като ги чета само шифт и ор да станат един байт и тва е. Мен 64 байта повече ми се искаше за да не губя време като ги предавам, ама по добре там отколкото като ги записвам.

Автор:  Nikola Kirov [ Пет Юли 21, 2006 11:22 am ]
Заглавие: 

Да и аз нещо съм се замотал. Логично е всяка структура да си я сложи в отделен баит.

ето решение с масив
Код:
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]

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/