[an error occurred while processing this directive]
Вопрос для тех кто разбирается в компиляторах...
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено neiro 18 мая 2006 г. 12:13

Очень часто использую в программировании конструкцию типа:

#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: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru