[an error occurred while processing this directive]
|
Очень часто использую в программировании конструкцию типа:
#define DEVICE_INFO 0x00
#define READ_BUF_EEPROM 0x01
#define CHANGE_BUF_EEPROM 0x02
#define I2C_24C01 0x03
#define I2C_24C02 0x04
#define I2C_24C04 0x05
#define I2C_24C08 0x06
#define I2C_24C16 0x07
#define MWIRE_93C46 0x08
switch (i)
{
case DEVICE_INFO:
.....
break;
case READ_BUF_EEPROM:
.....
break;
case CHANGE_BUF_EEPROM:
.....
break;
.....
case MWIRE_93C46:
.....
break;
}
в зависимости от числа кейсов время выполнения конструкции сильно изменяется. Так как компилятор конструкцию switch интерпретирует аналогично конструкции if(else) путем перебора всех if. Хотя при правильном написании время выполнения консрукции switch не должно зависить от количества кейсов и будет минимально.
Соответственно вопрос: почему не делает так компилятор? Или как это можно сделать на языке C?
ldd tmpa,Y+1 ;get COMMAND
mov COMMAND,tmpa
ldi ZL,low(COMMAND_TABLE)
ldi ZH,high(COMMAND_TABLE)
add ZL,tmpa
brcc PC+2 ;branch if carry cleared
inc ZH
ijmp
COMMAND_TABLE:
rjmp DEVICE_INFO ;0x00
rjmp READ_BUF_EEPROM ;0x01
rjmp CHANGE_BUF_EEPROM ;0x02
rjmp I2C_24C01 ;0x03
rjmp I2C_24C02 ;0x04
rjmp I2C_24C04 ;0x05
rjmp I2C_24C08 ;0x06
rjmp I2C_24C16 ;0x07
rjmp MWIRE_93C46 ;0x08
E-mail: info@telesys.ru