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

 
 
 
Reply to this topicStart new topic
> Использование глобальных переменных, как правильнее сделать
Atlantis-
сообщение Jun 26 2015, 07:50
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Здравствуйте!
Абстрагируясь, моя задача состоит в том, чтобы принять несколько разных блоков данных по USB, массивы определяющие в какой последовательности, по сколько раз и с какой паузой между ними выдавать эти блоки по I2S.
Я разбил все эти данные на три глобальные структуры:
1) структура содержащая адреса блоков данных и их длины
2) структура содержащая массивы определяющие в какой последовательности, по сколько раз и с какой паузой между ними выдавать эти блоки
3) структуру содержащую счетчики, которые изменяются в процессе выдачи данных для расчета окончания блока данных, количества его повторений, паузы между блоками и т.д. Переменные этой структуры будут меняться в теле прерывания.

Вопрос у меня такой: правильно ли я вообще мыслю, не будет ли путаницы с глобальными переменными, чего следует остерегаться и может быть есть какие то другие варианты, без глобальных переменных?

Забыл сказать - использую FreeRTOS и меня немного смущает использование в задачах глобальных переменных.

Сообщение отредактировал Atlantis- - Jun 26 2015, 07:53
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 26 2015, 08:28
Сообщение #2


Гуру
******

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



QUOTE (Atlantis- @ Jun 26 2015, 10:50) *
Я разбил все эти данные на три глобальные структуры:

Зачем три? В чем страхи пред одной?
Заодно в чем конкретно страхи перед глобальными переменными? Хотя, конечно, те переменные, которые используются в одной задаче, красивее положить в стек этой задачи.
Вообще-то абстрактно надо стремится передавать информацию между задачами через очереди сообщений, а не через кучи глобальных переменных - это насколько я понимаю, явно отностися к помянутому Вами в 1)






--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Jun 26 2015, 08:43
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 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, отправляется сообщение содержащее адрес, размер блока и адрес структуры куда это надо переписать. В задаче данные переписываются. Но сегодня меня "осенило", что зачем адреса структур передавать, они у меня все равно глобальные...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 26 2015, 09:24
Сообщение #4


Гуру
******

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



QUOTE (Atlantis- @ Jun 26 2015, 11:43) *
Получится 18 переменных в одной структуре, я могу запутаться и забыть какая чего означает.

sm.gif sm.gif sm.gif
QUOTE
А в чем преимущество одной большой структуры перед тремя маленькими?

Компилятору в принципе проще оптимизировать и использовать команды идексной адресации.
QUOTE
Ну теоретически первые две структуры можно объединить, а третью уже не хочется.

Вообще-то, могу только повторить, что, насколько я смог понять, что Вы наворотили, первой структуры вообще быть не должно.
QUOTE
Да не знаю, перестраховываюсь.

Незнание это страшная беда - ведет прямиком к стучанию в бубен и прочим камланиям sad.gif
QUOTE
У меня конкретно сейчас сделано так: приходит блок данных по USB, отправляется сообщение содержащее адрес, размер блока и адрес структуры куда это надо переписать.

Совершенено очевидно, что если дела получателя этого сообщения только в копировании куска памяти, то такой получатель нинафиг не нужен вообще. Подумайте, как делать прием и обработку фреймов в стиле zero-copy.




--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Jun 26 2015, 10:44
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 26 2015, 12:20
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Jun 26 2015, 12:53
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 26 2015, 13:21
Сообщение #8


Гуру
******

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



QUOTE (Atlantis- @ Jun 26 2015, 15:53) *
Не совсем понял. Вот у меня приходят данные от хоста, они содержаться в каком то массиве, их туда библиотечные функции складывают.

Отлично. Они УЖЕ в памяти вот С ЭТОЙ памятью и работайте БЕЗ лишнего копирования куда либо.
QUOTE
В первой посылке по USB придет 64 байта, они будут хранится в RAM. Что значит не копировать? Следующая посылка будет записана по тому же адресу.

Не верю, что не смотря на всю "библиотечность" и соответственно почти гарантированную уродливость творений индийских недоученных студентов sad.gif, "библиотека" НЕ умеет принимать НЕСКОЛЬКО фреймов подряд.
Почему? Потому сие начисто ломает саму идею буферизации и не позволяет в общем случае ни на что, кроме обработки приемы фреймов отвлекаться - чуть овлекся, не успел забрать фрейм и все sad.gif. Так-то либо Ваши "библиотеки" неземной кривизны, либо Вы не понимаете, как их реально использовать. А вообще дерьмо-софт от производителей железа, он и есть дерьмо. Можно изучать ТОЛЬКО, как образец того, как делать НЕ надо. Исключений не встречал sad.gif. Так-что припасть к первоисточникам и переписать очень даже ПОЛЕЗНО.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
DASM
сообщение Jun 26 2015, 14:38
Сообщение #9


Гуру
******

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



а кто не тупые, кроме вас?
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Jun 27 2015, 09:05
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Цитата(zltigo @ Jun 26 2015, 16:21) *
Отлично. Они УЖЕ в памяти вот С ЭТОЙ памятью и работайте БЕЗ лишнего копирования куда либо.

Я понял Вашу мысль.

Цитата(zltigo @ Jun 26 2015, 16:21) *
Не верю, что не смотря на всю "библиотечность" и соответственно почти гарантированную уродливость творений индийских недоученных студентов sad.gif, "библиотека" НЕ умеет принимать НЕСКОЛЬКО фреймов подряд.
Почему? Потому сие начисто ломает саму идею буферизации и не позволяет в общем случае ни на что, кроме обработки приемы фреймов отвлекаться - чуть овлекся, не успел забрать фрейм и все sad.gif. Так-то либо Ваши "библиотеки" неземной кривизны, либо Вы не понимаете, как их реально использовать.

Какая разница, ну принимает несколько фреймов подряд - размер блока данных все равно больше.

Цитата(zltigo @ Jun 26 2015, 16:21) *
А вообще дерьмо-софт от производителей железа, он и есть дерьмо. Можно изучать ТОЛЬКО, как образец того, как делать НЕ надо. Исключений не встречал sad.gif. Так-что припасть к первоисточникам и переписать очень даже ПОЛЕЗНО.

Это катастрофически увеличит время разработки.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 27 2015, 09:33
Сообщение #11


Гуру
******

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



QUOTE (Atlantis- @ Jun 27 2015, 12:05) *
Какая разница, ну принимает несколько фреймов подряд - размер блока данных все равно больше.

Больше чего? Больше имеющейся у Вас в распоряжении памяти sm.gif? Если нет sm.gif, то пусть все и продолжает сваливаться в память. Ну разве только наступит какое-нибудь органичение, типа размера блока памяти доступного каналу DMA который обслуживает USB. Ну, тогда, простите, думайте над протоколом, ибо негоже многие килобайты сначала кидать, а потом уже только разбитаться.
QUOTE
Это катастрофически увеличит время разработки.

Если это НЕ последняя разработка в Вашей жизни, то не важно. Принцип - "Если ты сделаешь быстро и плохо, то скоро забудут, что ты сделал быстро,
и долго будут помнить, что ты сделал плохо. А если ты сделаешь медленно и хорошо, то скоро забудут, что ты сделал медленно, и долго будут помнить, что ты сделал хорошо" - таки работает.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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