| Автор |
Съобщение |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
 struct с Битови променливи в CCS ....
значи ... имам структура от 4 бита, с фиксиран адрес, идеята е да мога да предавам с една дума две структури,
struct state{
boolean x
boolean
boolean
boolean}
data[64];
обаче това създание отделя за всеки елемент на data[] по 1 байт ... някой има ли идея как да го накарма да гиара под ред .... по два в байт????
Не че немога да го лъгна по друг начин ама ......
|
| Чет Юли 20, 2006 2:02 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 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 |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
Не въпроса не е в това че структурата не е в един байт, структурата си е в един,обаче нали е data[64], т.е имам 64 такива структури, и всяка от тях заема по 1 байт, т.е 64 байта, но реално е 4 битова, т.е. за този обем данни ми трябват 32 байта а не 64 ...
|
| Чет Юли 20, 2006 2:31 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
А сега схванах какво искаш да питаш.
Ами на това просто решение няма.
става като за достъпа до данните на физическо ниво си оформиш функции
set i get;
Иначе и аз преди търсих начин с стандартни средства да се реализира подобно нещо но с сигурност няма.
|
| Чет Юли 20, 2006 2:40 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 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 |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
да де ще трябва да си напиша .... ще го преживея . 
|
| Чет Юли 20, 2006 2:47 pm |
|
 |
|
the_real_maniac
Ранг: Почетен член
Регистриран на: Пет Авг 19, 2005 11:38 am Мнения: 978 Местоположение: Europe -> BG
|
Първото което помислих че искаш е това, но то би било вършело работа, ако достъпа ще се извършва последователно на по две от 4 бит. структури.
Т.е още едно подвърждение, че с ANSI C няма как само с дефинирането на структури да направиш това , което искаш.
|
| Чет Юли 20, 2006 3:06 pm |
|
 |
|
vlado
Ранг: Популярен
Регистриран на: Чет Ное 10, 2005 9:26 pm Мнения: 393 Местоположение: Buffalo, NY, USA
|
@ToHu: Аз не съм работил с този компилатор, но обикновено трябва да има някаква pragma директива, която указва как да се подравняват структурите в паметта - #pragma align или нещо подобно. Погледни в списъка с подобни инструкции, макар че аз лично се съмнявам дали по този начин ще може да се подравнява структура на по-малко от един байт.
|
| Чет Юли 20, 2006 6:14 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 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 |
|
 |
|
sthx
Ранг: Форумен бог
Регистриран на: Съб Юни 24, 2006 8:25 pm Мнения: 2292
|
Aсемблер. 
|
| Пет Юли 21, 2006 12:13 am |
|
 |
|
the_real_maniac
Ранг: Почетен член
Регистриран на: Пет Авг 19, 2005 11:38 am Мнения: 978 Местоположение: Europe -> BG
|
Хехе то ясно , че в Асемблер всичко е възможно, но тук се говори за struct (и struct array), което си е С
Така че предложението ти не е за случея 
|
| Пет Юли 21, 2006 12:51 am |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Какъв асемблер колега.
Като си организира структурите както съм го направил в втория пример функциите Get() i Set() които трябва да организират достъпа са по 2-3 реда 
|
| Пет Юли 21, 2006 1:26 am |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
Никола, аз го пробвах така,но структурата продължава да си заема 64 байта, както и да е, ако ми дотрябва да пестя място ще го-направя с функции които да си пишат в масив, засега има памет и го оставих на 64 байта, а после като ги чета само шифт и ор да станат един байт и тва е. Мен 64 байта повече ми се искаше за да не губя време като ги предавам, ама по добре там отколкото като ги записвам.
|
| Пет Юли 21, 2006 10:13 am |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Да и аз нещо съм се замотал. Логично е всяка структура да си я сложи в отделен баит.
ето решение с масив
[/code]
|
| Пет Юли 21, 2006 11:22 am |
|
|