Zhuk72 писал(а):2. Вот тут я в сомнениях. Что-то написать там нужно, но что именно, чтоб они все упаковались в один байт - я не знаю. Пока времени не было уточнить.
Битовые поля по-честному укладываются на соответствующие биты - вопрос лишь в том, сколько займёт структура. Можно глянуть в отладчике. Можно прикинуть по map-файлу. Вот например ваши флаги в моём файле:
Код: Выделить всё
_ep_data_out bssBANK2 0131
_flag bssBANK0 006A <--------- flag (в банке 0)
_hid_rpt01 stringtext 1500
_i2cProtocol dataCOMMON 007B
_idle_rate bssBANK2 0143
_inBuffer dataCOMMON 0079
_inPipes bssBANK2 013D
_main cinit 104B
_notifyChunks bssBANK0 006B <--------- следуюший за flag-ом в банке 0
_outBuffer dataBANK0 006E
Т.е. очевидно, что всё уместилось в байт. Добавляем девятое поле:
Код: Выделить всё
_ep_data_out bssBANK2 0131
_flag bssBANK2 0133 <---------
_hid_rpt01 stringtext 1500
_i2cProtocol dataCOMMON 007B
_idle_rate bssBANK2 0144
_inBuffer dataCOMMON 0079
_inPipes bssBANK2 013E
_main cinit 1048
_notifyChunks bssBANK0 006A
_outBuffer dataBANK0 006E
_outPipes bssBANK2 0120
_pBDTEntryEP0OutCurrent bssBANK1 00EA
_pBDTEntryEP0OutNext bssBANK1 00EB
_pBDTEntryIn bssBANK2 0135 <--------- 134-го в bssBANK2 нету
_pBDTEntryOut bssBANK2 0137
Ага, два байта. И во вторую банку переместилось из нулевой - в которой очевидно место закончилось.
А упаковка относится к структурам, поскольку компилятор порой раскладывает их поля по выровненным (aligned) адресам, для ускорения работы с ними. В итоге размер такой структуры будет больше нежели сумма размеров её элементов. Если вам извне придёт пакет данных без подобных "прорех" - разобрать его простым наложением структуры на указатель будет несколько затруднительно. Поэтому при объявлении нужно явно указывать:
Код: Выделить всё
typedef struct __attribute__ ((packed)) _USB_DEVICE_DESCRIPTOR
{
uint8_t bLength; // Length of this descriptor.
[...]
Ну и за компанию про глобальные bit переменные. Добавим горсть малую в тестовый кот с вашим битовым полем:
Код: Выделить всё
bit bit1;
bit bit2;
bit bit3;
bit bit4;
MAIN_RETURN main(void)
{
SYSTEM_Initialize(SYSTEM_STATE_USB_START);
flag.b3 = 1;
bit1 = 0;
bit2 = 1;
bit3 = flag.b7;
bit4 = 0;
if (flag.b6 == 1 && bit1 == bit3 || bit1 != bit2 || bit2 == bit4)
USBDeviceInit();
И в мап-файле:
Код: Выделить всё
__size_ofi1_LED_On (abs) 0000
_active_protocol bssBANK2 0147
_bit1 bitbssCOMMON 03D0 <--------- следим
_bit2 bitnvCOMMON 03C8 <--------- за
_bit3 bitnvCOMMON 03C9 <--------- адреса-
_bit4 bitbssCOMMON 03D1 <--------- ми
_configDescriptor1 stringtext 149C
_controlTransferState bssBANK1 00E8
[...]
Name Link Load Length Selector Space Scale
[...]
bssBANK0 66 66 6 50 1
dataCOMMON 7B 7B 1 70 1
bssCOMMON 76 76 3 70 1
bitbssCOMMON 3D0 7A 2 70 1 8 <--------- размер 2!
bitnvCOMMON 3C8 79 2 70 1 8 <--------- тоже самое.
stringtext 1400 1400 DB 28 0
[...]
Т.е. оно их даже в один байт не упаковало. Вероятно справедливо рассудив, что "места у этого поца покамест ещё хватает". Что самое забавное в режимах PRO Speed и PRO без Speed - картина не меняется.
PS: Других переменных типа bit кроме здесь показанных в программе нету если что.