Отговори на тема  [ 9 мнения ] 
Достъп до индивидуален байтове в C 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

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


Сря Яну 25, 2012 12:21 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 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;


Сря Яну 25, 2012 1:06 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Мар 08, 2006 2:12 pm
Мнения: 2017
Местоположение: Котел
Мнение Re: Достъп до индивидуален байтове в C
Благодаря, направих го така:
#define BytePtr(var, offset) (char *)((char*)&var + offset)
и ползвам например
*BytePtr(period, 2) = timer1_add;


Сря Яну 25, 2012 1:27 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 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; // старши байт



Сря Яну 25, 2012 1:28 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение Re: Достъп до индивидуален байтове в C
Пик-а засмуква тиня при работа с указатели. Както казава Киров - с юниън става най-добре.


Сря Яну 25, 2012 2:46 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение Re: Достъп до индивидуален байтове в C
Или пък ползвай MikroC:

Код:
unsigned long var;

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


Сря Яну 25, 2012 5:35 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Мар 08, 2006 2:12 pm
Мнения: 2017
Местоположение: Котел
Мнение 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 ми върши екстра работа, благодаря на всички.


Чет Яну 26, 2012 8:49 am
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Окт 11, 2006 8:19 pm
Мнения: 373
Местоположение: София/Edinburgh, UK
Мнение Re: Достъп до индивидуален байтове в C
Ако много ще се ползват някакви такива битови/байтови операции union-а е готино решение, но ето нещо в духа на С, без указатели:
Код:
int32 timer;
int8 byte;
//Clear the 3rd byte
timer &= 0xFF00FFFF;
//Set the 3rd byte
timer |= byte << 16;

_________________
Българският портал за РОБОТИКА


Чет Яну 26, 2012 12:17 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение Re: Достъп до индивидуален байтове в C
timer |= byte << 16;


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

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

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

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


Чет Яну 26, 2012 12:37 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 9 мнения ] 

Кой е на линия

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


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

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