|
Использование глобальных переменных, как правильнее сделать |
|
|
|
Jun 26 2015, 07:50
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Здравствуйте! Абстрагируясь, моя задача состоит в том, чтобы принять несколько разных блоков данных по USB, массивы определяющие в какой последовательности, по сколько раз и с какой паузой между ними выдавать эти блоки по I2S. Я разбил все эти данные на три глобальные структуры: 1) структура содержащая адреса блоков данных и их длины 2) структура содержащая массивы определяющие в какой последовательности, по сколько раз и с какой паузой между ними выдавать эти блоки 3) структуру содержащую счетчики, которые изменяются в процессе выдачи данных для расчета окончания блока данных, количества его повторений, паузы между блоками и т.д. Переменные этой структуры будут меняться в теле прерывания.
Вопрос у меня такой: правильно ли я вообще мыслю, не будет ли путаницы с глобальными переменными, чего следует остерегаться и может быть есть какие то другие варианты, без глобальных переменных?
Забыл сказать - использую FreeRTOS и меня немного смущает использование в задачах глобальных переменных.
Сообщение отредактировал Atlantis- - Jun 26 2015, 07:53
|
|
|
|
|
 |
Ответов
|
Jun 26 2015, 08:28
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Atlantis- @ Jun 26 2015, 10:50)  Я разбил все эти данные на три глобальные структуры: Зачем три? В чем страхи пред одной? Заодно в чем конкретно страхи перед глобальными переменными? Хотя, конечно, те переменные, которые используются в одной задаче, красивее положить в стек этой задачи. Вообще-то абстрактно надо стремится передавать информацию между задачами через очереди сообщений, а не через кучи глобальных переменных - это насколько я понимаю, явно отностися к помянутому Вами в 1)
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 26 2015, 08:43
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(zltigo @ Jun 26 2015, 11:28)  Зачем три? В чем страхи пред одной? Получится 18 переменных в одной структуре, я могу запутаться и забыть какая чего означает. Придется названиями разделять на три вида. А в чем преимущество одной большой структуры перед тремя маленькими? Ну теоретически первые две структуры можно объединить, а третью уже не хочется. Цитата(zltigo @ Jun 26 2015, 11:28)  Заодно в чем конкретно страхи перед глобальными переменными? Да не знаю, перестраховываюсь. По идее у меня возможен одновременная запись и чтение 2-й структуры Цитата(zltigo @ Jun 26 2015, 11:28)  Вообще-то абстрактно надо стремится передавать информацию между задачами через очереди сообщений, а не через кучи глобальных переменных - это насколько я понимаю, явно отностися к помянутому Вами в 1) У меня конкретно сейчас сделано так: приходит блок данных по USB, отправляется сообщение содержащее адрес, размер блока и адрес структуры куда это надо переписать. В задаче данные переписываются. Но сегодня меня "осенило", что зачем адреса структур передавать, они у меня все равно глобальные...
|
|
|
|
|
Jun 26 2015, 09:24
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Atlantis- @ Jun 26 2015, 11:43)  Получится 18 переменных в одной структуре, я могу запутаться и забыть какая чего означает.  QUOTE А в чем преимущество одной большой структуры перед тремя маленькими? Компилятору в принципе проще оптимизировать и использовать команды идексной адресации. QUOTE Ну теоретически первые две структуры можно объединить, а третью уже не хочется. Вообще-то, могу только повторить, что, насколько я смог понять, что Вы наворотили, первой структуры вообще быть не должно. QUOTE Да не знаю, перестраховываюсь. Незнание это страшная беда - ведет прямиком к стучанию в бубен и прочим камланиям  QUOTE У меня конкретно сейчас сделано так: приходит блок данных по USB, отправляется сообщение содержащее адрес, размер блока и адрес структуры куда это надо переписать. Совершенено очевидно, что если дела получателя этого сообщения только в копировании куска памяти, то такой получатель нинафиг не нужен вообще. Подумайте, как делать прием и обработку фреймов в стиле zero-copy.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 26 2015, 10:44
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(zltigo @ Jun 26 2015, 12:24)  Вообще-то, могу только повторить, что, насколько я смог понять, что Вы наворотили, первой структуры вообще быть не должно. В первой структуре у меня содержится массив указателей на блоки данных, массив длин этих блоков, массив служебной информации о каждом блоке, номер (индекс в массиве) записываемого блока и текущий указатель записи (блоки большие и по USB передаются не за один раз). Цитата(zltigo @ Jun 26 2015, 12:24)  Совершенено очевидно, что если дела получателя этого сообщения только в копировании куска памяти, то такой получатель нинафиг не нужен вообще.Подумайте, как делать прием и обработку фреймов в стиле zero-copy. Почему? Ну я мог бы прямо в прерывании от USB копировать данные в нужные структуры. Сейчас у меня сообщение вызывает задачу и в ней данные пишутся в структуры, просто я использую RTOS для своих задач. Я же данные не копирую в сообщение, а отсылаю только адрес начала и кол-во данных.
Сообщение отредактировал Atlantis- - Jun 26 2015, 10:52
|
|
|
|
Сообщений в этой теме
Atlantis- Использование глобальных переменных Jun 26 2015, 07:50    zltigo QUOTE (Atlantis- @ Jun 26 2015, 13:4... Jun 26 2015, 12:20     Atlantis- Цитата(zltigo @ Jun 26 2015, 15:20) Зачем... Jun 26 2015, 12:53      zltigo QUOTE (Atlantis- @ Jun 26 2015, 15:5... Jun 26 2015, 13:21       Atlantis- Цитата(zltigo @ Jun 26 2015, 16:21) Отлич... Jun 27 2015, 09:05        zltigo QUOTE (Atlantis- @ Jun 27 2015, 12:0... Jun 27 2015, 09:33 DASM а кто не тупые, кроме вас? Jun 26 2015, 14:38
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|