Пт ноя 18, 2016 13:04:45
Siarzhuk писал(а):pos это не переменная, и даже не тип (в С) - а именно что НеизвестнАЯ ИдентификАтыръ.
Пт ноя 18, 2016 13:08:41
Siarzhuk писал(а):при оптимизации битовыми полями сегмента данных - страдает сегмент кода (читай производительность), за счёт большего количества операций по доступу к полям. Мало того - в зависимости от позиции битового поля в структуре - размер операций тоже может быть разным. Т.е. если с каким-то полем чаще работаем - можно также сэкономить байтики двигая поле в более выгодную позицию.
Пт ноя 18, 2016 13:09:39
Zhuk72 писал(а):Siarzhuk писал(а):pos это не переменная, и даже не тип (в С) - а именно что НеизвестнАЯ ИдентификАтыръ.
И как тогда мне ее, структуру, объявить, если struct pos {unsigned char x, y;}; объявлено неправильно?
struct point {
int x;
int у;
} ;
Пт ноя 18, 2016 13:14:03
лично я в подобных "подозрительных" случаях всегда объявляю пользовательский тип - ни разу сбоев не было!Zhuk72 писал(а):И как тогда мне ее, структуру, объявить, если struct pos {unsigned char x, y;}; объявлено неправильно?
typedef struct{
unsigned char x, y;
} point_t;
pint_t pos;
категорические утверждения о невыдерживнии критики не выдерживают никакой критикиКРАМ писал(а):Категоричные заявления о вредности нестандартных типов из-за непереносимости кода не выдерживают никакой критики
Пт ноя 18, 2016 13:18:01
ARV писал(а):это на самом деле так? не 1 байт?
Siarzhuk писал(а):скорее всего он задействует для этой цели аппаратные фичи кристалла. про PIC не скажу, а в MCS51 есть особые области ОЗУ с побитовой адресацией
Пт ноя 18, 2016 13:18:45
Аlex писал(а):Ещё, плюс объединений переменных в структуры - обработка в функциях. Можно передавать указатель, как аргумент, вместо кучи переменных.
ARV писал(а):категорические утверждения о невыдерживнии критики не выдерживают никакой критикиКРАМ писал(а):Категоричные заявления о вредности нестандартных типов из-за непереносимости кода не выдерживают никакой критики
потому что если есть стандарт, то надо максимально соблюдать его требования все время, пока не попал в безвыходную ситуацию. а уж в безвыходной ситуации все средства хороши.
Пт ноя 18, 2016 13:30:30
ARV писал(а):лично я в подобных "подозрительных" случаях всегда объявляю пользовательский тип - ни разу сбоев не было!
ARV писал(а):про PIC не скажу, а в MCS51 есть особые области ОЗУ с побитовой адресацией, и соответствующие однобитовые команды ассемблера. так что и тут речь скорее всего об этом - линкер отдыхает.
Пт ноя 18, 2016 13:37:02
Zhuk72 писал(а):И как тогда мне ее, структуру, объявить, если struct pos {unsigned char x, y;}; объявлено неправильно?
#define BIT_SIZE 4
char ringBuffer[1 << SIZE];
struct {
char headIndex : BIT_SIZE;
char tailIndex : BIT_SIZE;
};
Zhuk72 писал(а):а потом в отладчике наблюдал, как они все оказывались в одном регистре в области общей памяти.
Пт ноя 18, 2016 14:34:52
Сб ноя 19, 2016 08:56:58
typedef struct {unsigned work: 1;
unsigned btn_start: 1;
unsigned flash: 1;
unsigned b3: 1;
unsigned b4: 1;
unsigned b5: 1;
unsigned b6: 1;
unsigned b7: 1;} bits;
bits flag;
Сб ноя 19, 2016 10:46:11
Zhuk72 писал(а):Поскольку использовать в подобных конструкциях более, чем 1 бит, только ухудшит конечный код (в асме добавятся маски и сдвиги, как я предполагаю)
Сб ноя 19, 2016 15:31:25
Siarzhuk писал(а):[pedantic mode on]
1. Если не затруднит - гляньте sizeof(bits) пожалуйста и нам сообщите для общего развития.
2. И да - unsigned это unsigned int, и, припоминаю, явное указание вместо int восьмибитного типа в конкретном случае оптимизации под PIC16F630 сэкономило мне в своё время, таки парочку байтов. Стоит тоже проверить, кмк.
[pedantic mode off]
Сб ноя 19, 2016 17:00:31
Zhuk72 писал(а):2. Вот тут я в сомнениях. Что-то написать там нужно, но что именно, чтоб они все упаковались в один байт - я не знаю. Пока времени не было уточнить.
_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
typedef struct __attribute__ ((packed)) _USB_DEVICE_DESCRIPTOR
{
uint8_t bLength; // Length of this descriptor.
[...]
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
[...]
Сб ноя 19, 2016 21:51:57
typedef struct {unsigned work: 1;
unsigned btn_start: 1;
unsigned flash: 1;
unsigned b3: 1;
unsigned b4: 1;
unsigned b5: 1;
unsigned b6: 1;
unsigned b7: 1;} bits;
bits flag;
unsigned char flash_cnt, flash_pause;
_flag bssBANK0 0026
_flash_cnt bssBANK0 0027
_flash_pause bssBANK0 0028
Чт янв 26, 2017 23:43:46
OPTION = 1<<0;
01A 3001 MOVLW 0x1
01B 1683 BSF 0x3, 0x5
01C 0081 MOVWF 0x1
/* OPTION bits */
volatile bit RBPU @ (unsigned)&OPTION*8+7;
volatile bit INTEDG @ (unsigned)&OPTION*8+6;
volatile bit T0CS @ (unsigned)&OPTION*8+5;
volatile bit T0SE @ (unsigned)&OPTION*8+4;
volatile bit PSA @ (unsigned)&OPTION*8+3;
volatile bit PS2 @ (unsigned)&OPTION*8+2;
volatile bit PS1 @ (unsigned)&OPTION*8+1;
volatile bit PS0 @ (unsigned)&OPTION*8+0;
OPTION = 1<<PS0;
19: OPTION = 1<<PS0;
00D 3001 MOVLW 0x1
00E 008E MOVWF 0xe
00F 3000 MOVLW 0
010 1683 BSF 0x3, 0x5
011 1801 BTFSC 0x1, 0
012 3001 MOVLW 0x1
013 3E01 ADDLW 0x1
014 1283 BCF 0x3, 0x5
015 2818 GOTO 0x18
016 1003 BCF 0x3, 0
017 0D8E RLF 0xe, F
018 3EFF ADDLW 0xff
019 1D03 BTFSS 0x3, 0x2
01A 2816 GOTO 0x16
01B 080E MOVF 0xe, W
01C 1683 BSF 0x3, 0x5
01D 0081 MOVWF 0x1
Пт янв 27, 2017 05:51:40
OPTION |= 1;
PS0 = 1;
Пт янв 27, 2017 07:27:55
Пока_без_кота писал(а):Это как понимать ?
Пт янв 27, 2017 19:03:27
Ср фев 01, 2017 12:39:27
Ср фев 01, 2017 12:50:46
typedef struct{
unsigned enabled :1;
unsigned start :1; // Тут не понял, что за "начало" такое и зачем оно нужно...
unsigned long time;
void* call_back_func; // Тут, скорее всего будет не так, а указатель на созданный ранее тип каллбека. Это уже тонкости
}Timer;