|
Передача структуры в функцию. |
|
|
|
Feb 28 2018, 14:52
|
Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 28 2018, 15:38
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(jcxz @ Feb 28 2018, 20:26)  Печалька. J-Link - круче!  Регистр этот показывает сколько прошло тактов CPU за время шага. Он очень пользителен для профилирования кода. Можно попробовать его вбить вручную в окно Watch: DWT.CYCCNT. Только предварительно его надо включить в модуле DWT. ой точно. можно ж на таймере такты отсчитать. спасибо. а как все таки предпочтительней передавать - by value или by reference? или тут нет однозначного ответа? при условии что поля структуры не модифицируются.
Сообщение отредактировал Jenya7 - Feb 28 2018, 15:39
|
|
|
|
|
Feb 28 2018, 15:56
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Jenya7 @ Feb 28 2018, 17:38)  ой точно. можно ж на таймере такты отсчитать. спасибо. а как все таки предпочтительней передавать - by value или by reference? или тут нет однозначного ответа? при условии что поля структуры не модифицируются. По значению, это что - Вы все 300 байт на стек копировать собрались??? А места там хоть хватит? Естественно быстрее передать указатель, чем копировать всё на стек. А если структура внутри не изменяется, то и в объявлении должно фигурировать const. Цитата(Jenya7 @ Feb 28 2018, 17:19)  а у меня ST-LINK там нет такого PS: Вообще DWT.CYCCNT находится в ядре. Т.е. - не зависит от используемого эмулятора. Да и у Вас он показывается, только всё время ==0. Значит видимо выключен. Нужно его просто включить, найдя соответствующий бит в регистрах конфигурирования DWT. А J-Link видимо сам его включает.
|
|
|
|
|
Feb 28 2018, 16:18
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(jcxz @ Feb 28 2018, 20:56)  По значению, это что - Вы все 300 байт на стек копировать собрались??? А места там хоть хватит? Естественно быстрее передать указатель, чем копировать всё на стек. А если структура внутри не изменяется, то и в объявлении должно фигурировать const. PS: Вообще DWT.CYCCNT находится в ядре. Т.е. - не зависит от используемого эмулятора. Да и у Вас он показывается, только всё время ==0. Значит видимо выключен. Нужно его просто включить, найдя соответствующий бит в регистрах конфигурирования DWT. А J-Link видимо сам его включает. я понял. стек у меня на всякий случай 2К. а структура в этой ф-ции не модифицируется, а в другом месте поля могут измениться. DWT таки выключен, надо вручную включать.
|
|
|
|
|
Feb 28 2018, 17:31
|

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

|
Цитата(Jenya7 @ Feb 28 2018, 18:18)  структура в этой ф-ции не модифицируется, а в другом месте поля могут измениться. Если структура и стек расположены в памяти с одинаковым доступом, и если структура во время работы вашей функции в другом месте не меняется (в прерывании или из-за работы РТОС), то ессно нужно передавать указатель и работать с оригиналом. Если структура может меняться, то нужно обеспечивать разграничение доступа. Причем простая передача копии структуры в функцию этой проблемы не решает. А если доступ к стеку и памяти структуры разный по времени, то тут уже считать нужно.
|
|
|
|
|
Feb 28 2018, 18:31
|

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

|
Цитата(Jenya7 @ Feb 28 2018, 17:52)  то копия ляжет на стак и с ней ф-ция будет работать. Ключевое слово копия. На копирование необходимо затратить какое-то время. А передача указателя - вычисление адреса структуры произойдет на этапе компиляции.
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|