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

Достъп до индивидуален байтове в C
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=9820
Страница 1 от 1

Автор:  milenjs [ Сря Яну 25, 2012 12:21 pm ]
Заглавие:  Достъп до индивидуален байтове в C

Дращя на CCS-то едно програмка - меря продължителност с CCP модула но 16-те бита на Timer1 не ми достигат и ползвам още един байт в софтуерен брояч. Та може ли директно да запиша този байт след първите два в int32 променлива?
Изрових това за достъп до първия байт но синтаксиса ме хвърли в тих ужас, не съм много навътре в С програмирането :(
int_val=*((int8 *)&val);

Автор:  Nikola Kirov [ Сря Яну 25, 2012 1:06 pm ]
Заглавие:  Re: Достъп до индивидуален байтове в C

С това можеш да достъпваш както си искаш 32 bit променлива.
Само дето като правиш операции с 32 битовата стойност тоя байта нали се сещаш че ще има значение.

Код:
typedef
union
{
    s32   _s32;
    u32   _u32;
    char  buff[4];

    struct
    {
        u32 _0:8;
        u32 _1:8;
        u32 _2:8;
        u32 _3:8;
    }_8;

    struct
    {
        u32 _0:16;
        u32 _1:16;
    }_16;

     struct
    {
        u32 b0:1;
        u32 b1:1;
        u32 b2:1;
        u32 b3:1;
        u32 b4:1;
        u32 b5:1;
        u32 b6:1;
        u32 b7:1;
        u32 b8:1;
        u32 b9:1;
        u32 b10:1;
        u32 b11:1;
        u32 b12:1;
        u32 b13:1;
        u32 b14:1;
        u32 b15:1;
        u32 b16:1;
        u32 b17:1;
        u32 b18:1;
        u32 b19:1;
        u32 b20:1;
        u32 b21:1;
        u32 b22:1;
        u32 b23:1;
        u32 b24:1;
        u32 b25:1;
        u32 b26:1;
        u32 b27:1;
        u32 b28:1;
        u32 b29:1;
        u32 b30:1;
        u32 b31:1;
    }_32;
}un32;


un32 * p = (un32*)&val;
p->_8._2 = xxxxx;

Автор:  milenjs [ Сря Яну 25, 2012 1:27 pm ]
Заглавие:  Re: Достъп до индивидуален байтове в C

Благодаря, направих го така:
#define BytePtr(var, offset) (char *)((char*)&var + offset)
и ползвам например
*BytePtr(period, 2) = timer1_add;

Автор:  Реконструктор [ Сря Яну 25, 2012 1:28 pm ]
Заглавие:  Re: Достъп до индивидуален байтове в C

milenjs написа:
Дращя на CCS-то едно програмка - меря продължителност с CCP модула но 16-те бита на Timer1 не ми достигат и ползвам още един байт в софтуерен брояч. Та може ли директно да запиша този байт след първите два в int32 променлива?
Изрових това за достъп до първия байт но синтаксиса ме хвърли в тих ужас, не съм много навътре в С програмирането :(
int_val=*((int8 *)&val);


В стандартното класическо C може. :) В CCS не знам. Най-просто и лесно разбираемо е:
Код:
int32 counter;
int8* byte_access = (int8*)&counter;

byte_access[0] = some_value; // младши байт
byte_access[3] = some_other_value; // старши байт


Автор:  tolstolob [ Сря Яну 25, 2012 2:46 pm ]
Заглавие:  Re: Достъп до индивидуален байтове в C

Пик-а засмуква тиня при работа с указатели. Както казава Киров - с юниън става най-добре.

Автор:  relsys [ Сря Яну 25, 2012 5:35 pm ]
Заглавие:  Re: Достъп до индивидуален байтове в C

Или пък ползвай MikroC:

Код:
unsigned long var;

var = 0x11223344;
Higher(var) = 0x55;  //var now equals 0x11553344

Автор:  milenjs [ Чет Яну 26, 2012 8:49 am ]
Заглавие:  Re: Достъп до индивидуален байтове в C

Off а на протон как красиво ставаше, чак ми липсва ;)
Код:
Dim Result As DWord
Dim TimerL As Result.BYTE0
Dim TimerM As Result.BYTE1
Dim TimerH As Result.BYTE2
Dim TimerHH As Result.BYTE3

Горното с #define ми върши екстра работа, благодаря на всички.

Автор:  sv_shady [ Чет Яну 26, 2012 12:17 pm ]
Заглавие:  Re: Достъп до индивидуален байтове в C

Ако много ще се ползват някакви такива битови/байтови операции union-а е готино решение, но ето нещо в духа на С, без указатели:
Код:
int32 timer;
int8 byte;
//Clear the 3rd byte
timer &= 0xFF00FFFF;
//Set the 3rd byte
timer |= byte << 16;

Автор:  Nikola Kirov [ Чет Яну 26, 2012 12:37 pm ]
Заглавие:  Re: Достъп до индивидуален байтове в C

timer |= byte << 16;


byte << 16 е винаги нула ;) Малко е 8 битова променлива ;)

При компилаторите за пик е грубо решение. Дори да го направш както си трябва с 32 битова променлива,хич няма да оптимизира и ще шифтне и после ще направи анд.

Като работиш с PIC 12,16,18 най правилно е да се ползва union.
Ама milenjs си го знаем. Хич и не си е напрегнал главата да прочете какво е това union и има ли почва у нас.

И milenjs обърни внимание че в C е приетo имената на макросите да са с главни букви изцяло. За яснота на кода. Отделно твоя вариант ще даде код който работи в зависимост от това дали процесора ти е с big или litle endian организация. А трябва да си създаваш навици да пишеш портируем код ако искаш да се занимаваш професионално с програмиране.
И отделно с използването на макроси не трябва да се прекалява. Едно че са проблем като дебъгваш,не се получава добра визуализация на ставащото,и второ че кода често не се оптимизира добре в някои случаи. Като в този случай например. Почти на 100 процента съм сигурен че ще даде по раздут код от използването на union. При тоз малоумен компилатор който ползваш трябва изразяването да става максимално близко до това което трябва да стане и просто.

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