Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR 5.10A
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
nameless
делаю так:

/*defines.h*/
typedef union
{unsigned long DPT_all;
struct
{
unsigned char A8 :8;
unsigned int A3 :3;
unsigned int B8 :8;
unsigned int B3 :3;
unsigned int D :8;

}part;
}dpt_word;

/*main.c/*

dpt_word DPT_word;

DPT_word.DPT_all=0;
DPT_word.part.A8 = 255;
DPT_word.part.A3 = 0;
DPT_word.part.B8 = 255;
DPT_word.part.B3 = 0;
DPT_word.part.D = 255;

***

и в симуляторе смотрю DPT_all

вижу 0b11111111 00000111 11111000 11111111


танцы вокруг char и int привели пока только к тому, что первое трехбитное слово все-таки склеилось с соседними 8-битныими. Посоветуйте - как досклеить структуру.
KRS
А что вы хотите получить?
nameless
Цитата(KRS @ Mar 11 2008, 12:41) *
А что вы хотите получить?


Сейчас:
0b11111111 00000111 11111000 11111111
А надо:
0b00111111 11000111 11111000 11111111

то есть по замыслу они должны идти подряд как 8-и и 3-х битные слова, но "вклеивается" только первое 3-хбитное слово.
KRS
У меня 5.11 такая конструкция
Код
#include <stdint.h>
typedef union {
    uint32_t DPT_all;
    struct {
        uint32_t A8 :8;
        uint32_t A3 :3;
        uint32_t B8 :8;
        uint32_t B3 :3;
        uint32_t D :8;
    }part;
}dpt_word;

static dpt_word DPT_word;
uint32_t foo(void)
{
    DPT_word.DPT_all=0;
    DPT_word.part.A8 = 255;
    DPT_word.part.A3 = 0;
    DPT_word.part.B8 = 255;
    DPT_word.part.B3 = 0;
    DPT_word.part.D = 255;
    return DPT_word.DPT_all;
}

volatile dpt_word DPT_word1;
uint32_t foo1(void)
{
    DPT_word1.DPT_all=0;
    DPT_word1.part.A8 = 255;
    DPT_word1.part.A3 = 0;
    DPT_word1.part.B8 = 255;
    DPT_word1.part.B3 = 0;
    DPT_word1.part.D = 255;
    return DPT_word1.DPT_all;
}

компилится верно в первом случае компилер все выкидывает и возвращает коснтанту 0x3fc7f8ff
с volatile весь код есть и он правильный.
nameless
Спасибо. Заработало. Если модераторы не сочтут за флуд хотелось задать вопрос: volatile используется для переменных совместного использования. Этот квалификатор я обычно применяю к тем переменным, которые меняются прерываниями и т.п. Но как здесь это сказывается?
KRS
Цитата(nameless @ Mar 11 2008, 13:12) *
Спасибо. Заработало. Если модераторы не сочтут за флуд хотелось задать вопрос: volatile используется для переменных совместного использования. Этот квалификатор я обычно применяю к тем переменным, которые меняются прерываниями и т.п. Но как здесь это сказывается?

volatile применяется там где переменная может быть изменена в любое время железом, DMA или в прерывании.
Здесь volatile применен исключительно для того что бы оптимизатор IAR не выкинул код. Потому что в первом случае без volatile функиця состоит из 2 команд - загрузка коснтанты и return.
Baser
Вчера был практически такой же вопрос:
Обьявление битовых полей

А у вас так получалось потому, что сначала вы объявили char:
unsigned char A8 :8;
а потом два интеджера, которые у вас, вероятно, двухбайтные:
unsigned int A3 :3;
unsigned int B8 :8;
unsigned int B3 :3;
unsigned int D :8;

Вот компилятор и упаковал: 8, 3+8+3, 8
А sizeof(dpt_word) должен был получиться равным 5
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.