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

 
 
> Язык С, ARM - простые вопросы
Slash
сообщение Jan 21 2009, 15:17
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 202
Регистрация: 10-04-05
Из: Санкт-Петербург
Пользователь №: 4 011



Здравствуйте!

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

А если программа строится в виде задач в бесконечном цикле:
Код
while (1)
{
    Task1();
    Task2();
    Task3();
}

Как обмениваться сообщениями между задачами? Мне понравилась система глобальных флагов - данные готовы к отправке, данные приняты, какое-то действие завершено и т.д.
Как без них?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Jan 23 2009, 15:10
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Demeny @ Jan 23 2009, 12:34) *
Теперь мне нужно прикрутить в проект второй UART с той же функциональностью, третий, четвёртый ... И вообще - я, как менеджер проекта, не знаю, сколько у заказчика будет UART-ов. Как мне Ваш модуль с минимальными доработками несколько раз включить в проект ?
Что-то я не понял затруднений. Статические переменные объявленные внутри функции имеют область видимости в пределах этой функции. Статические переменные объявленные вне какой-либо функции имеют область видимости в пределах данного модуля. Разве не так?
Могу конечно ошибаться, но по-моему singlskv имел в виду как раз такой случай. Глобальная переменная (объявленная вне тела функции) типа static имеет область видимости в пределах данного модуля. Никто не мешает дублировать эти модули в требуемых количествах. Хотя конечно же, если модуль состоит из одной функции, то разумнее было бы объявить эти переменные как static, но внутри самой функции.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 23 2009, 15:57
Сообщение #3


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(rezident @ Jan 23 2009, 18:10) *
Могу конечно ошибаться, но по-моему singlskv имел в виду как раз такой случай. Глобальная переменная (объявленная вне тела функции) типа static имеет область видимости в пределах данного модуля. Никто не мешает дублировать эти модули в требуемых количествах. Хотя конечно же, если модуль состоит из одной функции, то разумнее было бы объявить эти переменные как static, но внутри самой функции.
примерно это я и имел в виду,
только одна функция это частный случай и тогда действительно переменные нужно определять как статические внутри функции,
а вот если несколько функций в модуле работают с одной статической переменной, то без глобальных определений никак не обойтись,
но ведь можно ограничить область видимости таких переменных...

Я вот совсем теперь не понимаю за что ратует Demeny,
совсем без глобальных переменных ну никак.., и сохранение состояния автомата это один из примеров,
возможно речь о том что не нужно к ним обращаться напрямую ? то есть нужно предоставить интерфейс через вызов функций ?
ну дык это и не очень большой вопрос, и в каждом проекте он решаеться в частном порядке...
Go to the top of the page
 
+Quote Post
Demeny
сообщение Jan 26 2009, 09:58
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237



Цитата(singlskv @ Jan 23 2009, 18:57) *
Я вот совсем теперь не понимаю за что ратует Demeny ...

Попробую ещё раз пояснить преимущества локальных переменных перед глобальными, пусть даже и статическими, т. е. видимыми в пределах одного программного модуля.
1) Если Ваш конечный автомат, или другой программный модуль (функция) хранит своё внутреннее состояние в статических или глобальных переменных, он тут же становится непригодным для многопоточного использования, проще говоря, становится "non-reenterable", во всяком случае, Вам придётся прибегнуть к специальным ухищрениям навроде синхронизации, чтобы использование Ваших функций в многопоточном приложении не вызвало крах всего приложения. Также она не может быть безопасно вызвана в качестве обработчика прерывания.
В случае локальных переменных всё безопасно - ведь у каждого потока свой стек, следовательно, каждый поток работает со своим уникальным набором переменных.
2) Ваш модуль в составе программы может вообще оказаться невостребованным (ну нет у клиента 8 UART-ов, заложенных по максимуму ...), однако память под буфера и прочие настройки Вы уже зарезервировали статически. Или же Ваш модуль нужен только на этапе инициализации - один раз при старте системы, а память занята уже "навсегда" ...
3) Доступ к локальным переменным осуществляется, как правило, быстрее, чем к глобальным (статическим), потому что любой оптимизирующий компилятор старается раскидать по возможности локальные переменные по регистрам процессора.
4) С точки зрения проектирования удобно представлять себе отдельную функцию, как законченный функциональный блок ("черный ящик") с входными и выходными параметрами. Это позволяет отлаживать функцию отдельно от остальных. Использование глобальных переменных размывает это понятие, поскольку, как ни крути, поведение функции зависит от поведения остальной части программы. Вот и будем ломать голову при отладке, какого же рожна глобальная переменная имеет "не то" значение, какое должно быть, и какая собака его испортила. Придётся бросить отладку текущей функции и заняться поиском "собаки". unsure.gif


--------------------
Сделано в Китае. Упаковано в России.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jan 26 2009, 10:45
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Demeny @ Jan 26 2009, 12:58) *
Попробую ещё раз пояснить ...

Этап системного проектирования, постановки задачи и разбиения задачи на подзадачи вообще-то присутствует?
Вот и выбирается на этом этапе все, включая способы взаимодействия, ресурсы, особенности.
В общем случае "глобальность против локальности" не имеет решения. Та же "реентерабельность". Почему printf не реентерабельный, не задумывались? Почему разработчики компиляторов не хотят осчастливить страждущих?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 26 2009, 11:13
Сообщение #6


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Dog Pawlowa @ Jan 26 2009, 13:45) *
В общем случае "глобальность против локальности" не имеет решения. Та же "реентерабельность".

Есть костыли - работать с указателем на структуру, содержащую "локальные" параметры функции, являющейся де-юре нереентерабельной. Если шаловливые ручки добираются до таких решений, то что это? (Что такое хорошо и что такое плохо?)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Slash   Язык С, ARM - простые вопросы   Jan 21 2009, 15:17
- - aaarrr   Цитата(Slash @ Jan 21 2009, 18:17) Стоит ...   Jan 21 2009, 15:29
- - Demeny   Цитата(Slash @ Jan 21 2009, 18:17) Стоит ...   Jan 22 2009, 08:33
|- - aaarrr   Цитата(Demeny @ Jan 22 2009, 11:33) Прави...   Jan 22 2009, 09:09
|- - Demeny   Цитата(aaarrr @ Jan 22 2009, 12:09) Поясн...   Jan 22 2009, 10:20
- - aaarrr   Для отладки глобальные переменные наоборот удобнее...   Jan 22 2009, 11:29
|- - Demeny   Цитата(aaarrr @ Jan 22 2009, 14:29) Для о...   Jan 22 2009, 12:35
||- - aaarrr   Цитата(Demeny @ Jan 22 2009, 15:35) Всё э...   Jan 22 2009, 12:48
||- - singlskv   Цитата(Demeny @ Jan 22 2009, 15:35) Это с...   Jan 23 2009, 00:27
||- - Demeny   Цитата(singlskv @ Jan 23 2009, 03:27) В к...   Jan 23 2009, 07:34
||- - A. Fig Lee   Цитата(singlskv @ Jan 22 2009, 19:27) В к...   Jan 23 2009, 19:06
|- - VladimirYU   Цитата(aaarrr @ Jan 22 2009, 14:29) Для о...   Jan 22 2009, 12:52
|- - zltigo   Цитата(VladimirYU @ Jan 22 2009, 14:52) К...   Jan 22 2009, 13:05
|- - aaarrr   Цитата(VladimirYU @ Jan 22 2009, 15:52) Д...   Jan 22 2009, 13:05
- - sergeeff   Это скорее организационная проблема. Один человек ...   Jan 22 2009, 15:14
|- - zltigo   Цитата(sergeeff @ Jan 22 2009, 17:14) Это...   Jan 22 2009, 17:14
- - rezident   Я бы предложил спорщикам уточнить, для какой облас...   Jan 23 2009, 00:46
|- - zltigo   Цитата(Demeny @ Jan 26 2009, 12:58) 1) Ес...   Jan 26 2009, 10:32
||- - A. Fig Lee   Цитата(zltigo @ Jan 26 2009, 05:32) Стати...   Jan 26 2009, 14:20
||- - _Pasha   Цитата(A. Fig Lee @ Jan 26 2009, 18:20) Т...   Jan 26 2009, 14:49
|||- - A. Fig Lee   Цитата(_Pasha @ Jan 26 2009, 09:49) Стати...   Jan 26 2009, 17:55
|||- - _Pasha   Цитата(A. Fig Lee @ Jan 26 2009, 21:55) 2...   Jan 26 2009, 18:33
||||- - sonycman   Цитата(_Pasha @ Jan 26 2009, 22:33) стати...   Jan 26 2009, 20:17
||||- - singlskv   Цитата(sonycman @ Jan 26 2009, 23:17) А е...   Jan 26 2009, 20:27
||||- - rezident   Цитата(singlskv @ Jan 27 2009, 01:27) Бол...   Jan 26 2009, 20:40
|||||- - singlskv   Цитата(rezident @ Jan 26 2009, 23:40) Раб...   Jan 26 2009, 21:29
|||||- - sonycman   Цитата(singlskv @ Jan 27 2009, 01:29) Вас...   Jan 26 2009, 21:51
|||||- - Dima_G   Цитата(singlskv @ Jan 27 2009, 01:29) Я э...   Jan 28 2009, 10:21
|||||- - A. Fig Lee   Цитата(Dima_G @ Jan 28 2009, 05:21) Локал...   Jan 28 2009, 14:45
||||- - sonycman   Цитата(singlskv @ Jan 27 2009, 00:27) Пер...   Jan 26 2009, 21:07
|||- - singlskv   Цитата(A. Fig Lee @ Jan 26 2009, 20:55) 2...   Jan 26 2009, 19:45
|||- - A. Fig Lee   Цитата(singlskv @ Jan 26 2009, 14:45) Вот...   Jan 26 2009, 22:07
|||- - zltigo   Цитата(A. Fig Lee @ Jan 27 2009, 01:07) О...   Jan 26 2009, 22:52
|||- - singlskv   Цитата(A. Fig Lee @ Jan 27 2009, 01:07) Н...   Jan 26 2009, 22:52
|||- - A. Fig Lee   Цитата(singlskv @ Jan 26 2009, 17:52) ага...   Jan 26 2009, 23:46
||- - zltigo   Цитата(A. Fig Lee @ Jan 26 2009, 17:20) Т...   Jan 26 2009, 15:22
|- - Dog Pawlowa   Цитата(_Pasha @ Jan 26 2009, 14:13) Есть ...   Jan 26 2009, 15:10
|- - _Pasha   Цитата(Dog Pawlowa @ Jan 26 2009, 18:10) ...   Jan 26 2009, 15:23
|- - zltigo   Цитата(_Pasha @ Jan 26 2009, 18:23) Один ...   Jan 26 2009, 15:25
- - Goodefine   Я, вот, по простому спрошу... Допустим, имеем обра...   Jan 23 2009, 19:09
|- - A. Fig Lee   Цитата(Goodefine @ Jan 23 2009, 14:09) Я,...   Jan 24 2009, 03:01
|- - VladimirYU   Цитата(A. Fig Lee @ Jan 24 2009, 06:01) п...   Jan 24 2009, 08:23
|- - zltigo   Цитата(A. Fig Lee @ Jan 24 2009, 05:01) п...   Jan 24 2009, 08:47
|- - _Pasha   Цитата(zltigo @ Jan 24 2009, 11:47) Их до...   Jan 24 2009, 14:43
|- - A. Fig Lee   Цитата(zltigo @ Jan 24 2009, 03:47) Опять...   Jan 24 2009, 17:14
|- - zltigo   Цитата(A. Fig Lee @ Jan 24 2009, 20:14) н...   Jan 24 2009, 17:50
|- - A. Fig Lee   Цитата(zltigo @ Jan 24 2009, 12:50) Ага, ...   Jan 25 2009, 13:43
- - Serj78   Можно, я свои 5 копеек вставлю? Иногда , на мало...   Jan 24 2009, 08:14
- - A. Fig Lee   вот правильный стандард - C++: The zeroinitializa...   Jan 27 2009, 14:42
|- - zltigo   Цитата(A. Fig Lee @ Jan 27 2009, 17:42) в...   Jan 27 2009, 16:10
||- - A. Fig Lee   Цитата(zltigo @ Jan 27 2009, 11:10) Вы, к...   Jan 27 2009, 16:23
|- - singlskv   Цитатакстати, я все никак не добьюсь - речь о C ил...   Jan 27 2009, 22:27
|- - A. Fig Lee   Цитата(singlskv @ Jan 27 2009, 17:27) Ну ...   Jan 27 2009, 23:44
- - rezident   Модератор. Тема закрыта по просьбе топикстартера.   Feb 2 2009, 21:01


Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 12:47
Рейтинг@Mail.ru


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