|
|
  |
Использование глобальных переменных, как правильнее сделать |
|
|
|
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
|
|
|
|
|
Jun 26 2015, 12:20
|

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

|
QUOTE (Atlantis- @ Jun 26 2015, 13:44)  В первой структуре у меня содержится массив указателей на блоки данных, массив длин этих блоков, массив служебной информации о каждом блоке.... Зачем все эти "массивы" нужны??? Есть приемный буффер. По приему в него кладется (если нужно) Ваш заголовок и принятая информация. Указатель, единственный! параметр!, кладется в очередь сообщений к задачам, котрые сие все обрабатывают. Все. QUOTE Ну я мог бы прямо в прерывании от USB копировать данные в нужные структуры. Зачем, ну зачем! Вообще что-то куда-то копировать! QUOTE Сейчас у меня сообщение вызывает задачу и в ней данные пишутся в структуры... ...Я же данные не копирую в сообщение, а отсылаю только адрес начала и кол-во данных. Вы уж тогда определитесь, что такое у Вас "пишутся" для меня и любого другого читателя, это то-же самое, что копируются, ибо Вы что-то уже принятое и записанное в RAM берете и пишите в другую память выделеную под структуру. Либо Вы назывете словом "пишутся" что-то ведомое только Вам, либо у Вас таки есть копирование данных. QUOTE , просто я использую RTOS для своих задач. И что, это объясняет изобилие и копирование данных???
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 26 2015, 12:53
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(zltigo @ Jun 26 2015, 15:20)  Зачем все эти "массивы" нужны??? Есть приемный буффер. По приему в него кладется (если нужно) Ваш заголовок и принятая информация. Указатель, единственный! параметр!, кладется в очередь сообщений к задачам, котрые сие все обрабатывают. Все. Не совсем понял. Вот у меня приходят данные от хоста, они содержаться в каком то массиве, их туда библиотечные функции складывают. Я эти данные перекопирую в память (в SDRAM). Чтобы их переписать мне нужен указатель и количество данных. Чтобы принять новую порцию - мне нужно знать последний записанный адрес в памяти. Цитата(zltigo @ Jun 26 2015, 15:20)  Зачем, ну зачем! Вообще что-то куда-то копировать!
Вы уж тогда определитесь, что такое у Вас "пишутся" для меня и любого другого читателя, это то-же самое, что копируются, ибо Вы что-то уже принятое и записанное в RAM берете и пишите в другую память выделеную под структуру. Либо Вы назывете словом "пишутся" что-то ведомое только Вам, либо у Вас таки есть копирование данных. Мне как минимум надо копировать в SDRAM, но даже если бы и не так - все равно не понятно. Допустим от хоста надо передать блок данных 256 байт. В первой посылке по USB придет 64 байта, они будут хранится в RAM. Что значит не копировать? Следующая посылка будет записана по тому же адресу. Или Вы имеете ввиду сразу из USB писать по нужному адресу? Это надо переписывать библиотеку, HAL от STM.
|
|
|
|
|
Jun 26 2015, 13:21
|

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

|
QUOTE (Atlantis- @ Jun 26 2015, 15:53)  Не совсем понял. Вот у меня приходят данные от хоста, они содержаться в каком то массиве, их туда библиотечные функции складывают. Отлично. Они УЖЕ в памяти вот С ЭТОЙ памятью и работайте БЕЗ лишнего копирования куда либо. QUOTE В первой посылке по USB придет 64 байта, они будут хранится в RAM. Что значит не копировать? Следующая посылка будет записана по тому же адресу. Не верю, что не смотря на всю "библиотечность" и соответственно почти гарантированную уродливость творений индийских недоученных студентов  , "библиотека" НЕ умеет принимать НЕСКОЛЬКО фреймов подряд. Почему? Потому сие начисто ломает саму идею буферизации и не позволяет в общем случае ни на что, кроме обработки приемы фреймов отвлекаться - чуть овлекся, не успел забрать фрейм и все  . Так-то либо Ваши "библиотеки" неземной кривизны, либо Вы не понимаете, как их реально использовать. А вообще дерьмо-софт от производителей железа, он и есть дерьмо. Можно изучать ТОЛЬКО, как образец того, как делать НЕ надо. Исключений не встречал  . Так-что припасть к первоисточникам и переписать очень даже ПОЛЕЗНО.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 27 2015, 09:05
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(zltigo @ Jun 26 2015, 16:21)  Отлично. Они УЖЕ в памяти вот С ЭТОЙ памятью и работайте БЕЗ лишнего копирования куда либо. Я понял Вашу мысль. Цитата(zltigo @ Jun 26 2015, 16:21)  Не верю, что не смотря на всю "библиотечность" и соответственно почти гарантированную уродливость творений индийских недоученных студентов  , "библиотека" НЕ умеет принимать НЕСКОЛЬКО фреймов подряд. Почему? Потому сие начисто ломает саму идею буферизации и не позволяет в общем случае ни на что, кроме обработки приемы фреймов отвлекаться - чуть овлекся, не успел забрать фрейм и все  . Так-то либо Ваши "библиотеки" неземной кривизны, либо Вы не понимаете, как их реально использовать. Какая разница, ну принимает несколько фреймов подряд - размер блока данных все равно больше. Цитата(zltigo @ Jun 26 2015, 16:21)  А вообще дерьмо-софт от производителей железа, он и есть дерьмо. Можно изучать ТОЛЬКО, как образец того, как делать НЕ надо. Исключений не встречал  . Так-что припасть к первоисточникам и переписать очень даже ПОЛЕЗНО. Это катастрофически увеличит время разработки.
|
|
|
|
|
Jun 27 2015, 09:33
|

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

|
QUOTE (Atlantis- @ Jun 27 2015, 12:05)  Какая разница, ну принимает несколько фреймов подряд - размер блока данных все равно больше. Больше чего? Больше имеющейся у Вас в распоряжении памяти  ? Если нет  , то пусть все и продолжает сваливаться в память. Ну разве только наступит какое-нибудь органичение, типа размера блока памяти доступного каналу DMA который обслуживает USB. Ну, тогда, простите, думайте над протоколом, ибо негоже многие килобайты сначала кидать, а потом уже только разбитаться. QUOTE Это катастрофически увеличит время разработки. Если это НЕ последняя разработка в Вашей жизни, то не важно. Принцип - "Если ты сделаешь быстро и плохо, то скоро забудут, что ты сделал быстро, и долго будут помнить, что ты сделал плохо. А если ты сделаешь медленно и хорошо, то скоро забудут, что ты сделал медленно, и долго будут помнить, что ты сделал хорошо" - таки работает.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|