| Микроконтролери и електроника 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 ] | |||||||||
| Заглавие: | ||||||||||
Първото което помислих че искаш е това, но то би било вършело работа, ако достъпа ще се извършва последователно на по две от 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семблер. |
|
| Автор: | the_real_maniac [ Пет Юли 21, 2006 12:51 am ] |
| Заглавие: | |
Хехе то ясно , че в Асемблер всичко е възможно, но тук се говори за struct (и struct array), което си е С Така че предложението ти не е за случея |
|
| Автор: | Nikola Kirov [ Пет Юли 21, 2006 1:26 am ] | |||||||||
| Заглавие: | ||||||||||
Какъв асемблер колега. Като си организира структурите както съм го направил в втория пример функциите Get() i Set() които трябва да организират достъпа са по 2-3 реда |
||||||||||
| Автор: | ToHu [ Пет Юли 21, 2006 10:13 am ] |
| Заглавие: | |
Никола, аз го пробвах така,но структурата продължава да си заема 64 байта, както и да е, ако ми дотрябва да пестя място ще го-направя с функции които да си пишат в масив, засега има памет и го оставих на 64 байта, а после като ги чета само шифт и ор да станат един байт и тва е. Мен 64 байта повече ми се искаше за да не губя време като ги предавам, ама по добре там отколкото като ги записвам. |
|
| Автор: | Nikola Kirov [ Пет Юли 21, 2006 11:22 am ] | |||||||||
| Заглавие: | ||||||||||
Да и аз нещо съм се замотал. Логично е всяка структура да си я сложи в отделен баит. ето решение с масив
|
||||||||||
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|