jenya7 0 20 августа, 2019 Опубликовано 20 августа, 2019 · Жалоба 1 hour ago, jcxz said: И...? Вам нужно срочно потратить лишнюю ОЗУ в программе и Вы не знаете как это сделать? Тогда да - это подойдёт. Если только оптимизатор не окажется умнее написавшего сиё и не удалит ненужные выделения памяти. И больше не для чего. ой. это с циклом while. я ушел от него. uint8_t ResponseFromTube(uint8_t tube_id) { static uint32_t no_ack_timeout; static uint32_t resp_timeout; uint32_t bit_progress_timeout; static uint8_t st_count = 0; uint8_t result; uint8_t task_done = 0; //no_ack_timeout = globalSysTimer + (g_sfGcpcon[noAck] * 1000); //resp_timeout = globalSysTimer + (g_sfGcpcon[rqpRto] * 1000); switch (tube_state) { case ST_IDLE : no_ack_timeout = globalSysTimer + (g_sfGcpcon[noAck] * 1000); resp_timeout = globalSysTimer + (g_sfGcpcon[rqpRto] * 1000); st_count = 0; tube_state = ST_CAN_RX; break; case ST_CAN_RX : if (globalSysTimer >= bit_progress_timeout) { bit_progress_timeout = globalSysTimer + 1000; write_bit_process(st_count); st_count++; if (st_count > 5) st_count = 0; } canbus_receive_one_channel(tube_id); if (globalSysTimer < no_ack_timeout) { //и так далее } break; } } no_ack_timeout должна быть глобальной так почему ее не сделать статической в функции? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 20 августа, 2019 Опубликовано 20 августа, 2019 · Жалоба 2 minutes ago, jenya7 said: no_ack_timeout должна быть глобальной так почему ее не сделать статической в функции? От этого она не станет глобальной. Ни разу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 20 августа, 2019 Опубликовано 20 августа, 2019 · Жалоба 8 минут назад, Forger сказал: Увы, не удалит Слово static - это как заклинание для компилятора и линкера. Ну, по крайней мере с теми компиляторами, с которыми я работал Компиляторы быстро умнеют. В отличие от основной массы быдлокодеров.... 4 минуты назад, jenya7 сказал: no_ack_timeout должна быть глобальной так почему ее не сделать статической в функции? Вам надо уже наконец-то взять учебник и прочитать раздел о типах памяти в си. И что такое "глобальная", "статическая", "автоматическая", "динамическая" и т.п. памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 20 августа, 2019 Опубликовано 20 августа, 2019 · Жалоба 1 minute ago, jcxz said: В отличие от основной массы быдлокодеров.... Это тема - очередное тому подтверждение, да и вообще, что ни тема, то дедсад про компиляторы или сектанты-кубодрочеры, которые не могу справиться с банальным поиском в гугле Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 20 августа, 2019 Опубликовано 20 августа, 2019 · Жалоба Quote Static local variables: variables declared as static inside a function are statically allocated while having the same scope as automatic local variables. Hence whatever values the function puts into its static local variables during one call will still be present when the function is called again. All static variables exist in what is known as the BSS or DATA data sections; BSS if it is uninitialized (which will initialize it to zero) and DATA if it is. и что? в чем проблема? умники великие. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 20 августа, 2019 Опубликовано 20 августа, 2019 · Жалоба 1 hour ago, jenya7 said: IAR, VxWorks достаточно профессиональные, У IAR профессиональный только компилятор, возможно отладчик и анализатор кода. Может быть что-то ещё. Но никак ни его IDE. То, что они её прикладывают к своему компилятору, совершенно не пригодно для профессиональной работы с кодом (редактирование, я имею в виду, и навигацию, и рефакторинг и т.п.). VxWorks, это же вроде ОС??! 1 hour ago, jcxz said: Судя из вопроса - автор не понимает этого различия. Странно, что он даже и не собирается этого делать. 40 minutes ago, jenya7 said: no_ack_timeout должна быть глобальной так почему ее не сделать статической в функции? Простите, вы читать умеете? Я вам уже ответил на этот вопрос ранее, вот цитата меня же самого 1 hour ago, haker_fox said: Глобальная переменная - это не статическая переменная. Глобальная переменная может быть статической. Вы же говорите о локальных статических переменных. Вы точно понимаете различие между этими типами данных? Если да, то непонятен смысл вашего вопроса. 22 minutes ago, jenya7 said: и что? в чем проблема? Прежде, чем бросаться грозными словами на непонятном языке, прочитайте текст внимательнее. В нём ни разу не говорится, что статическая переменная обязательно становится глобальной. 22 minutes ago, jenya7 said: умники великие Да, мы опытнее вас в вопросе, который вы задали. Что вас задевает и обижает - не понятно. Вы упорно не желаете понять, что вам отвечают. А по десятому кругу задаёте один и тот же вопрос. И как на это реагировать нам, "великим умникам"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 20 августа, 2019 Опубликовано 20 августа, 2019 · Жалоба 1 hour ago, haker_fox said: В нём ни разу не говорится, что статическая переменная обязательно становится глобальной. да я понимаю какой становиться переменная. но зачем объявлять ее снаружи если она используется только в этой функции и должна сохранять свое значение? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 20 августа, 2019 Опубликовано 20 августа, 2019 · Жалоба 26 minutes ago, jenya7 said: если она используется только в этой функции и должна сохранять свое значение? Как раз для этого и придуман static для локальных объектов. Если эта функция вызывается не только в пределах одного потока/задачи (есть RTOS), то все становится очень интересно ))) Поэтому сто раз надо подумать, а так ли сильно тут нужна static? Возможно, для конкретно взятого случая эту задачу можно нормально решить совсем иначе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 20 августа, 2019 Опубликовано 20 августа, 2019 · Жалоба 2 часа назад, jenya7 сказал: no_ack_timeout должна быть глобальной так почему ее не сделать статической в функции? Более бессмысленную фразу редко услышишь... Автор, вы не понимаете значение понятий "глобальная" и "статическая". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
amaora 20 20 августа, 2019 Опубликовано 20 августа, 2019 · Жалоба 6 hours ago, jenya7 said: В последнее время увлекся использованием статических переменных в функции. Очень удобно - повышается переносимость функции из проекта в проект, повышается читаемость функции - видишь какими переменными она оперирует. Но я как то не встречал проектов изобилующих статическими переменными в функции. Есть какие то подводные камни? Код привязывается к данным. Нельзя извне например сбросить состояние, или сделать несколько экземпляров данных обрабатываемых одной функцией. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 20 августа, 2019 Опубликовано 20 августа, 2019 · Жалоба Если переменная используется только в одной функции, и нужно, чтобы её значение сохранялось между вызовами, то вполне логично объявить её static. Естественно, надо быть уверенным, что функция вызывается только из одного потока и без рекурсии. Например, для обработчиков прерывания - милое дело. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 21 августа, 2019 Опубликовано 21 августа, 2019 · Жалоба 18 hours ago, jenya7 said: она используется только в этой функции и должна сохранять свое значение? Это единственная правильная причина, почему вам в вашей функции требуется статическая локальная переменная. А то, что вы озвучили в первом посте темы - это вообще ни о чём. Или вы имели ввиду то, что до того, как узнали о существовании статических локальных переменных использовали внутри функций для этих целей глобальные? А потом вдруг узнали и заменили их на статические локальные? Тогда да, ваши доводы из первого поста становятся понятными. Вам надо было сразу объяснить что с чем вы сравниваете: 1. Использование глобальных объектов в функциях 2. Использование статических локальных объектов в функциях. Какие есть плюсы, минусы и ограничения у данных подходов по отношению друг к другу. Такая постановка вопроса правильная. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться