Перейти к содержанию
    

Передача структуры в функцию.

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

 

Если я передам структуру by value

void MyFunc (MyStruct my_struct)

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

 

А если я передам структуру by reference

void MyFunc (MyStruct *my_struct)

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

 

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

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

 

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

структура 200-300 байт.

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

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Например так. А в IAR достаточно просто открыть окошко с регистрами и посмотреть на регистр CCSTEP.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Например так. А в IAR достаточно просто открыть окошко с регистрами и посмотреть на регистр CCSTEP.

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

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

А Вы попробуйте пошагать по инструкциям и функциям и понаблюдать за ним. Узнаете много нового. :laughing:

Только предварительно полезно установить галку на пункте "запрещать прерывания при шагании" в пункте меню "J-Link" IAR-а.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А Вы попробуйте пошагать по инструкциям и функциям и понаблюдать за ним. Узнаете много нового. :laughing:

Только предварительно полезно установить галку на пункте "запрещать прерывания при шагании" в пункте меню "J-Link" IAR-а.

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

 

CCSTEP все время 0.

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

CCSTEP все время 0.

Печалька. J-Link - круче! :)

Регистр этот показывает сколько прошло тактов CPU за время шага. Он очень пользителен для профилирования кода.

Можно попробовать его вбить вручную в окно Watch: DWT.CYCCNT. Только предварительно его надо включить в модуле DWT.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Печалька. J-Link - круче! :)

Регистр этот показывает сколько прошло тактов CPU за время шага. Он очень пользителен для профилирования кода.

Можно попробовать его вбить вручную в окно Watch: DWT.CYCCNT. Только предварительно его надо включить в модуле DWT.

ой точно. можно ж на таймере такты отсчитать. спасибо.

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

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ой точно. можно ж на таймере такты отсчитать. спасибо.

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

По значению, это что - Вы все 300 байт на стек копировать собрались??? :01:

А места там хоть хватит? Естественно быстрее передать указатель, чем копировать всё на стек. А если структура внутри не изменяется, то и в объявлении должно фигурировать const.

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По значению, это что - Вы все 300 байт на стек копировать собрались??? :01:

А места там хоть хватит? Естественно быстрее передать указатель, чем копировать всё на стек. А если структура внутри не изменяется, то и в объявлении должно фигурировать const.

 

 

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

я понял. стек у меня на всякий случай 2К. а структура в этой ф-ции не модифицируется, а в другом месте поля могут измениться.

DWT таки выключен, надо вручную включать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно просто запустить в симуляторе и посмотреть в окне Disassembler.

Вопрос просто не возник бы после этого.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно просто запустить в симуляторе и посмотреть в окне Disassembler.

Вопрос просто не возник бы после этого.

тоже идея.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

структура в этой ф-ции не модифицируется, а в другом месте поля могут измениться.

Если структура и стек расположены в памяти с одинаковым доступом,

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

то ессно нужно передавать указатель и работать с оригиналом.

 

Если структура может меняться, то нужно обеспечивать разграничение доступа.

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

 

А если доступ к стеку и памяти структуры разный по времени, то тут уже считать нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Ключевое слово копия.

На копирование необходимо затратить какое-то время.

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...