реклама на сайте
подробности

 
 
> Передача структуры в функцию.
Jenya7
сообщение Feb 28 2018, 14:52
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Поправте если ошибаюсь.

Если я передам структуру by value
Код
void MyFunc (MyStruct my_struct)

то копия ляжет на стак и с ней ф-ция будет работать.

А если я передам структуру by reference
Код
void MyFunc (MyStruct *my_struct)

то ф-ция будет работать непосредственно со структурой.

А что со скоростью доступа - быстрее by value?

Сообщение отредактировал Jenya7 - Feb 28 2018, 14:52
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jcxz
сообщение Feb 28 2018, 14:56
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Feb 28 2018, 16:52) *
то копия ляжет на стак и с ней ф-ция будет работать.

Не факт. Зависит от размера структуры. Если структура влезает в два регистра, то IAR вроде как может её в регистрах передавать.

Цитата(Jenya7 @ Feb 28 2018, 16:52) *
А что со скоростью доступа - быстрее by value?

"Открыть асм и посмотреть" - так точно будет быстрее чем даже написать в форум. laughing.gif
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 28 2018, 14:59
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(jcxz @ Feb 28 2018, 19:56) *
Не факт. Зависит от размера структуры. Если структура влезает в два регистра, то IAR вроде как может её в регистрах передавать.


"Открыть асм и посмотреть" - так точно будет быстрее чем даже написать в форум. laughing.gif

структура 200-300 байт.
про асм совсем забыл. посчитать инструкции?

Сообщение отредактировал Jenya7 - Feb 28 2018, 14:59
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 28 2018, 15:01
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Feb 28 2018, 16:59) *
про асм совсем забыл. посчитать инструкции?

Например так. А в IAR достаточно просто открыть окошко с регистрами и посмотреть на регистр CCSTEP.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 28 2018, 15:07
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(jcxz @ Feb 28 2018, 20:01) *
Например так. А в IAR достаточно просто открыть окошко с регистрами и посмотреть на регистр CCSTEP.

да. есть такой регистр. а что он показывает?

Сообщение отредактировал Jenya7 - Feb 28 2018, 15:07
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 28 2018, 15:08
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Feb 28 2018, 17:07) *
да. есть такой регистр. а что он показывает?

А Вы попробуйте пошагать по инструкциям и функциям и понаблюдать за ним. Узнаете много нового. laughing.gif
Только предварительно полезно установить галку на пункте "запрещать прерывания при шагании" в пункте меню "J-Link" IAR-а.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 28 2018, 15:19
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(jcxz @ Feb 28 2018, 20:08) *
А Вы попробуйте пошагать по инструкциям и функциям и понаблюдать за ним. Узнаете много нового. laughing.gif
Только предварительно полезно установить галку на пункте "запрещать прерывания при шагании" в пункте меню "J-Link" IAR-а.

а у меня ST-LINK там нет такого

CCSTEP все время 0.

Сообщение отредактировал Jenya7 - Feb 28 2018, 15:21
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 28 2018, 15:26
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Feb 28 2018, 17:19) *
CCSTEP все время 0.

Печалька. J-Link - круче! sm.gif
Регистр этот показывает сколько прошло тактов CPU за время шага. Он очень пользителен для профилирования кода.
Можно попробовать его вбить вручную в окно Watch: DWT.CYCCNT. Только предварительно его надо включить в модуле DWT.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 28 2018, 15:38
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(jcxz @ Feb 28 2018, 20:26) *
Печалька. J-Link - круче! sm.gif
Регистр этот показывает сколько прошло тактов CPU за время шага. Он очень пользителен для профилирования кода.
Можно попробовать его вбить вручную в окно Watch: DWT.CYCCNT. Только предварительно его надо включить в модуле DWT.

ой точно. можно ж на таймере такты отсчитать. спасибо.
а как все таки предпочтительней передавать - by value или by reference? или тут нет однозначного ответа? при условии что поля структуры не модифицируются.

Сообщение отредактировал Jenya7 - Feb 28 2018, 15:39
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 28 2018, 15:56
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Feb 28 2018, 17:38) *
ой точно. можно ж на таймере такты отсчитать. спасибо.
а как все таки предпочтительней передавать - by value или by reference? или тут нет однозначного ответа? при условии что поля структуры не модифицируются.

По значению, это что - Вы все 300 байт на стек копировать собрались??? 01.gif
А места там хоть хватит? Естественно быстрее передать указатель, чем копировать всё на стек. А если структура внутри не изменяется, то и в объявлении должно фигурировать const.

Цитата(Jenya7 @ Feb 28 2018, 17:19) *
а у меня ST-LINK там нет такого

PS: Вообще DWT.CYCCNT находится в ядре. Т.е. - не зависит от используемого эмулятора. Да и у Вас он показывается, только всё время ==0. Значит видимо выключен. Нужно его просто включить, найдя соответствующий бит в регистрах конфигурирования DWT. А J-Link видимо сам его включает.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 28 2018, 16:18
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(jcxz @ Feb 28 2018, 20:56) *
По значению, это что - Вы все 300 байт на стек копировать собрались??? 01.gif
А места там хоть хватит? Естественно быстрее передать указатель, чем копировать всё на стек. А если структура внутри не изменяется, то и в объявлении должно фигурировать const.


PS: Вообще DWT.CYCCNT находится в ядре. Т.е. - не зависит от используемого эмулятора. Да и у Вас он показывается, только всё время ==0. Значит видимо выключен. Нужно его просто включить, найдя соответствующий бит в регистрах конфигурирования DWT. А J-Link видимо сам его включает.

я понял. стек у меня на всякий случай 2К. а структура в этой ф-ции не модифицируется, а в другом месте поля могут измениться.
DWT таки выключен, надо вручную включать.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Jenya7   Передача структуры в функцию.   Feb 28 2018, 14:52
|- - Baser   Цитата(Jenya7 @ Feb 28 2018, 18:18) струк...   Feb 28 2018, 17:31
- - x893   Можно просто запустить в симуляторе и посмотреть в...   Feb 28 2018, 16:42
|- - Jenya7   Цитата(x893 @ Feb 28 2018, 21:42) Можно п...   Feb 28 2018, 16:56
- - dimka76   Цитата(Jenya7 @ Feb 28 2018, 17:52) то ко...   Feb 28 2018, 18:31
- - Unfog   1. Если нужно работать с копией: void foo(type obj...   Mar 1 2018, 04:28
- - Jenya7   А если я передаю адрес объекта я могу в другой фун...   Mar 1 2018, 05:56
- - Unfog   Да, можно. Но нужно помнить про прерывания.   Mar 1 2018, 06:00


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 08:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.0154 секунд с 7
ELECTRONIX ©2004-2016