2015-12-24 4 views
-1

Я разрабатываю проект, в котором есть функция Receive, которая проверяет HW, чтобы узнать, есть ли что-либо, полученное от HDLC. Период опроса составляет 1 мс. И если что-то доступно, мое программное обеспечение отправляет подтверждение по HDLC, чтобы подтвердить, что сообщение получено.Избегайте использования памяти стека

Максимальное количество байтов, разрешенных в моем протоколе, составляет 1000 байт. Считаете ли вы, что наличие локально объявленного буфера приема с этим размером является хорошей идеей? Или я должен объявить его в моем файле cpp со статическим ключевым словом, учитывая, что переменная изменена только в функции приема, но нигде больше?

+1

Вы используете встроенную систему? Если нет, тогда нет необходимости беспокоиться о пространстве стека. И даже если вы находитесь на встроенной системе, это действительно зависит от системы. –

+0

Да, это встроенная система с FreeRTOS. Фактически, моя задача состояла в том, чтобы сохранить тактовые циклы процессора, чтобы ему не приходилось выделять 1000 байт за каждые 1 мс. что вы думаете ? – tguclu

+1

Когда компилятор «выделяет» память в стеке, это не то же самое, что выделение в куче, нет функции, которая вызывается или нажимается на стек. Вместо этого компилятор просто генерирует код, который перемещает одно значение в регистр указателя стека. Неважно, сколько локальных переменных у вас или их размер, это все равно будет одной записью в один регистр. Важным является размер вашего стека, и если вы можете позволить себе хранить такой массив в стеке (и за исключением самых маленьких систем, вы можете легко хранить 1000 байт в стеке). –

ответ

1

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

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

Смежные вопросы