tiix
|
|
1 | |
использование переменных23.02.2013, 01:31. Показов 9011. Ответов 36
Метки нет (Все метки)
Добрый день господа.
Подскажите какой вариант использования переменных более правильный с точки зрения быстроты и размера кода генерируемого WinAVR? Сам в асме не шарю, поэтому просмотр листинга не советовать :) Например затолкать в глобальную структуру: Код
typedef struct{ u08 buffer[UART_MAX_BUF]; u08 status; u08 counter; u08 header_len; u08 message_len; u08 crc; } TUartData; TUartData uart; Код
uart.status |= (1<<5); for (u08 i=0;i<10;i++) uart.buffer[i] = i; Код
u08 uart_buffer[UART_MAX_BUF]; u08 uart_status; u08 uart_counter; u08 uart_header_len; u08 uart_message_len; u08 uart_crc; Код
uart_status |= (1<<5); for (u08 i=0;i<10;i++) uart_buffer[i] = i; |
23.02.2013, 01:31 | |
Ответы с готовыми решениями:
36
Использование переменных в прерываниях Использование переменных в БД использование переменных Использование переменных |
4 / 4 / 0
Регистрация: 12.03.2013
Сообщений: 24
|
|
23.02.2013, 01:47 | 2 |
смотря как структуры выравниваются, если по 1 байту то вроде как без разницы
0
|
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 275
|
|
23.02.2013, 13:14 | 3 |
Для AVR - без разницы, код будет абсолютно одинаковым
0
|
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
|
|
23.02.2013, 14:14 | 4 |
Это от компилятора зависит, а не от целевой платформы. Большинство компиляторов (в том числе GCC) достаточно умны, чтобы скомпилировать одинаковый код в обоих случаях при включенной оптимизации. WinAVR, насколько я помню, виндовый порт AVR-GCC.
С точки зрения хорошего стиля первый вариант, конечно, лучше.
0
|
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
|
|
23.02.2013, 15:03 | 5 |
Сообщение от soxop
0
|
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
|
|
23.02.2013, 15:41 | 6 |
Какой третий вариант?
0
|
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
|
|
23.02.2013, 16:26 | 7 |
Сообщение от soxop
0
|
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
|
|
23.02.2013, 16:37 | 8 |
Не понимаю. Можете код привести?
0
|
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
|
|
23.02.2013, 17:36 | 9 |
Сообщение от soxop
0
|
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
|
|
23.02.2013, 18:09 | 10 |
Bytt, ход ваших мыслей я так и не распарсил. Топикстартер привёл два сишных кода и спрсил, будет ли разница в машинном коде. Ему ответили. А вы про какой-то третий вариант с указателями...
0
|
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
|
|
23.02.2013, 18:24 | 11 |
Сообщение от soxop
0
|
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
|
|
23.02.2013, 18:36 | 12 |
Ну так приведите этот ваш "эффективный код с указателями" (доказав этим его существование). Посмотрим и поучимся.
0
|
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 275
|
|
23.02.2013, 19:39 | 13 |
Это уже изыски. Будет зависеть от используемого уровня оптимизации. С -Os, с указателем получится наверняка длиннее. С -O3 - короче, но длиннее, чем с -Os :)
0
|
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
|
|
23.02.2013, 20:10 | 14 |
Сообщение от soxop
Код
char *cp = uart.buffer; for (u08 i=0;i<10;i++) *cp++ = i;
0
|
4 / 4 / 0
Регистрация: 12.03.2013
Сообщений: 24
|
|
23.02.2013, 20:13 | 15 |
Сообщение от Bytt
Код
char *cp = uart.buffer; for (u08 i=0;i<10;i++) *cp++ = i; и чем же cp понятней чем uart.buffer? имхо бред
0
|
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
|
|
23.02.2013, 20:27 | 16 |
Сообщение от buy
for (u08 i=0;i<10;i++) *cp++ = i;Или нет? и чем же cp понятней чем uart.buffer? имхо бред Дело не в понятности кода, все дело в его эффективности.
0
|
tiix
|
|
23.02.2013, 21:59 | 17 |
Сообщение от soxop
Код
обьявляем структуру и указатель на нее: typedef struct{ u08 buffer[UART_MAX_BUF]; u08 status; u08 message_len; u08 counter; u08 header_len; u08 crc; } TUartData; TUartData uart; TUartData *P_uart; какаято функция: void crc8(TUartData *uart) { u08 crc = 0; u08 len = uart->message_len; while (len--) { crc = uart->buffer[len-1]+crc; } uart->crc = crc; } void main() { crc8(P_uart); } Но вопрос: не получится ли так, что компилятор разместит структуру целиком в стеке для работы? А если там buffer[] длинной 512 или 1024 байт??? |
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
|
|
23.02.2013, 22:03 | 18 |
Сообщение от Bytt
Код
char *cp = uart.buffer; for (u08 i=0;i<10;i++) *cp++ = i; Нет. Современные компиляторы достаточно умны, чтобы упростить изначальный код топикстартера до вашего. Вообще, низкоуровневая оптимизация -- это на 100% задача компилятора. Прагриннист должен писать ясный и поддерживаемый код. Для этого ему и дан высокоуровневый язык, абстрагированный от аппаратуры. Если же программист желает взять оптимизацию кода под свой контроль, то ему нужно писать на ассемблере. "Подыгрывать" компилятору -- плохой тон. Самый смех, что иногда таким подыгрыванием программист только мешает оптимизатору и конечный машинный код выходит хуже.
0
|
tiix
|
|
23.02.2013, 22:04 | 19 |
Сообщение от btymdmom
|
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
|
|
23.02.2013, 22:12 | 20 |
Сообщение от tiix
0
|
23.02.2013, 22:12 | |
23.02.2013, 22:12 | |
Помогаю со студенческими работами здесь
20
Использование переменных Использование переменных Использование переменных Использование переменных из файла Использование анонимных переменных Правильное использование переменных Использование глобальных переменных Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |