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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Передача структуры в функцию.
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
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
x893
сообщение Feb 28 2018, 16:42
Сообщение #12


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

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Можно просто запустить в симуляторе и посмотреть в окне Disassembler.
Вопрос просто не возник бы после этого.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 28 2018, 16:56
Сообщение #13


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

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



Цитата(x893 @ Feb 28 2018, 21:42) *
Можно просто запустить в симуляторе и посмотреть в окне Disassembler.
Вопрос просто не возник бы после этого.

тоже идея.
Go to the top of the page
 
+Quote Post
Baser
сообщение Feb 28 2018, 17:31
Сообщение #14


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(Jenya7 @ Feb 28 2018, 18:18) *
структура в этой ф-ции не модифицируется, а в другом месте поля могут измениться.

Если структура и стек расположены в памяти с одинаковым доступом,
и если структура во время работы вашей функции в другом месте не меняется (в прерывании или из-за работы РТОС),
то ессно нужно передавать указатель и работать с оригиналом.

Если структура может меняться, то нужно обеспечивать разграничение доступа.
Причем простая передача копии структуры в функцию этой проблемы не решает.

А если доступ к стеку и памяти структуры разный по времени, то тут уже считать нужно.
Go to the top of the page
 
+Quote Post
dimka76
сообщение Feb 28 2018, 18:31
Сообщение #15


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



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


Ключевое слово копия.
На копирование необходимо затратить какое-то время.
А передача указателя - вычисление адреса структуры произойдет на этапе компиляции.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th June 2025 - 16:25
Рейтинг@Mail.ru


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