0 / 0 / 0
Регистрация: 02.10.2011
Сообщений: 26
|
|
1 | |
глобальные и локальные переменные06.10.2011, 00:07. Показов 5113. Ответов 10
Метки нет Все метки)
(
Как лучше реализовывать для достижения минимального кода/ максимального быстродействия?
1 вариант: например в main() есть локальная переменная, и будет вызываться некая функция и в эту функцию будет передаваться значение этой переменной или адрес на нее. 2 вариант: объявить глобальную переменную и ее использовать в main() и в функции. С точки зрения читаемости кода второй вариант плохо, но интересует быстродействие и размер кода.
0
|
|
06.10.2011, 00:07 | |
Ответы с готовыми решениями:
10
Локальные переменные Глобальные переменные с общим доступом из задач Выделение памяти под глобальные переменные в IAR неправильно отображаются локальные переменные Глобальные переменные vs Локальные |
0 / 0 / 0
Регистрация: 07.04.2011
Сообщений: 663
|
|
06.10.2011, 01:31 | 2 |
глобальные переменные жрут память, а её и так мало. локальные - при передаче жрут стек, а он тоже мал. Выбирайте сами, если у вас 1-2 переменных, то имхо проще с глобальными, а то с локальными там будет по 5 тактов на входе в процедуру (загрузка из стека) и еще 5 на выход...
0
|
0 / 0 / 0
Регистрация: 18.04.2010
Сообщений: 598
|
|
06.10.2011, 10:10 | 3 |
глобальными переменными должно быть только то, что должно быть видно везде - какие-то параметры, настройки, ключевые значения, которые изменяют логику программы. параметры функции должны быть локальными. это просто правила хорошего кодирования, которые позволяют избежать тонны лишних косяков
0
|
0 / 0 / 0
Регистрация: 27.06.2010
Сообщений: 405
|
|
06.10.2011, 11:15 | 4 |
У АВР 32 регистра общего назначения, параметры в функции передаются в регистрах и большинство локальных переменных тоже живут в регистрах. В стек они помещаются только если регистров не хватает. Отсюда вывод: все, что помещается в регистры лучше сделать локальными переменнами. Объёмные структуры -размещать где удобнее, но передавать в функции их использующие по указателю.
0
|
2 / 2 / 0
Регистрация: 25.05.2010
Сообщений: 3,609
|
|
06.10.2011, 13:49 | 5 |
![]() А также замечу, что вопрос вообще лишен смысла, если речь идет об одной-двух или о десятке-двух переменных. Нащупать там разницу в коде или быстродействии... это надо быть извращенцем :)
0
|
0 / 0 / 0
Регистрация: 02.10.2011
Сообщений: 26
|
|
06.10.2011, 14:01 | 6 |
![]()
0
|
0 / 0 / 0
Регистрация: 28.02.2011
Сообщений: 461
|
|
06.10.2011, 14:18 | 7 |
![]()
0
|
4 / 4 / 0
Регистрация: 12.03.2013
Сообщений: 24
|
|
06.10.2011, 16:44 | 8 |
![]() а что в данном случаем меняет volatile?
0
|
0 / 0 / 0
Регистрация: 13.10.2009
Сообщений: 3
|
|
06.10.2011, 18:10 | 9 |
![]()
0
|
4 / 4 / 0
Регистрация: 12.03.2013
Сообщений: 24
|
|
06.10.2011, 18:57 | 10 |
![]()
0
|
0 / 0 / 0
Регистрация: 07.04.2011
Сообщений: 663
|
|
07.10.2011, 01:35 | 11 |
![]() хотя у него еще свободных регистров- ешь не хочу... а прерывания это вообще песня: Код
ISR(ADC_vect) { 48: 1f 92 push r1 4a: 0f 92 push r0 4c: 0f b6 in r0, 0x3f ; 63 4e: 0f 92 push r0 50: 11 24 eor r1, r1 52: 8f 93 push r24 54: 9f 93 push r25 // ACP=(ADC>>8); //Забираем только старший байт (у нас выравнивание по левому краю) ..... 7a: 9f 91 pop r25 7c: 8f 91 pop r24 7e: 0f 90 pop r0 80: 0f be out 0x3f, r0 ; 63 82: 0f 90 pop r0 84: 1f 90 pop r1 86: 18 95 reti из ISR(ADC_vect) { ACP=(ADC>>8); //Забираем только старший байт (у нас выравнивание по левому краю) ACP=ACP/8; if (ACP==0) ACP=1; } Да, еще - при передаче в функцию нет никакой разницы с точки зрения использования памяти передаете вы переменную, или указатель на неё. А вот массив и структуры надо уже с указателем.
0
|
07.10.2011, 01:35 | |
Помогаю со студенческими работами здесь
11
Глобальные и локальные переменные
Глобальные и локальные переменные
Локальные и глобальные переменные. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |