- 
	- не для modbus, а для доморощенного UART протокола использовал доморощенную БД.  abivan(3062 знак., 11.02.2010 21:50 - 21:54)
			- с ходу не всё смог переварить. Надо подумать, смогу ли я что-то из этого применить к своей задаче. Кстати, что такое "стандартный обработчик параметра"? - koyodza(11.02.2010 22:05)
					- стандартный это просто записать или прочитать значение из/в БД(EEPROM) - abivan(12.02.2010 09:03)
 
 
- с ходу не всё смог переварить. Надо подумать, смогу ли я что-то из этого применить к своей задаче. Кстати, что такое "стандартный обработчик параметра"? - koyodza(11.02.2010 22:05)
					
- Я вижу два вопроса: 1.Как описать 2. Как заполнить эту структуру. По второму вопросу: подобные вещи, как не странно, легче делать на ассемблере. Скрипач(151 знак., 11.02.2010 20:02)
- выскажу свое мнение немного образно. у нас не модбас, но формирование кучи пакетов для передачи между хостом и периферией -- постоянная задача. Для каждого регистра заводится свой "класс": структура для данных внутри железки + как минимум функции  bialix(164 знак., 11.02.2010 14:32)
			- не очень хочется под каждую структуру заводить свою функцию сериализации. Т.е. по сути я хочу сделать одну такую функцию для всех данных, а вот "рассказать" этой функции где и что лежит собирался с помощью одной общей структуры (вернее  koyodza(50 знак., 11.02.2010 19:46)
					- метаданные -- это данные о данных. в банальном случае: для каждой переменной в структуре нужен адрес и тип. тогда можно просто проходить по списку. я бы такие списки генерил автоматически, а не руками расписывал. про кодогенерацию я вот в dao спрашивал. - bialix(11.02.2010 20:03)
							- да, Вы правильно понимаете. Вот как раз об автоматизации (частичной) и идёт речь  koyodza(177 знак., 11.02.2010 20:22)
									- в языке Си есть только один "способ" частичной автоматизации: препроцессор. Этот способ настолько жалкий, что я бы за него не брался. - bialix(13.02.2010 12:05)
											- Я не совсем понял что именно ты имел в виду. Если препроцессор, то  BK(111 знак., 13.02.2010 16:13,  ) )
- чем не нравится вариант "внешней" кодогенерации: со временем такие "примочки" имеют свойство теряться, забываться, да и просто сложнее передать такой проект кому-то в будущем. Препроцессор конечно жалкий, но лучше чем ничего - koyodza(13.02.2010 12:13)
													- В общем случае -- может быть. Но у меня скрипты-кодогенераторы лежат прямо рядом с исходниками, и по зависимостям автоматически запускаются при сборке (scons). - bialix(13.02.2010 12:42)
															- имхо имелись в виду не собственно скрипты, а инструменты, которые эти скрипты используют для того чтобы код сгенерить. У вас это питон? - Alex B.(13.02.2010 14:00)
																	- да, у меня это питон. и поскольку для сборки нужен scons, то питон по любому будет стоять. - bialix_без_пароля(14.02.2010 12:51,  ) )
 
- да, у меня это питон. и поскольку для сборки нужен scons, то питон по любому будет стоять. - bialix_без_пароля(14.02.2010 12:51, 
 
- имхо имелись в виду не собственно скрипты, а инструменты, которые эти скрипты используют для того чтобы код сгенерить. У вас это питон? - Alex B.(13.02.2010 14:00)
																	
 
- В общем случае -- может быть. Но у меня скрипты-кодогенераторы лежат прямо рядом с исходниками, и по зависимостям автоматически запускаются при сборке (scons). - bialix(13.02.2010 12:42)
															
 
- Я не совсем понял что именно ты имел в виду. Если препроцессор, то  BK(111 знак., 13.02.2010 16:13, 
 
- в языке Си есть только один "способ" частичной автоматизации: препроцессор. Этот способ настолько жалкий, что я бы за него не брался. - bialix(13.02.2010 12:05)
											
 
- да, Вы правильно понимаете. Вот как раз об автоматизации (частичной) и идёт речь  koyodza(177 знак., 11.02.2010 20:22)
									
 
- метаданные -- это данные о данных. в банальном случае: для каждой переменной в структуре нужен адрес и тип. тогда можно просто проходить по списку. я бы такие списки генерил автоматически, а не руками расписывал. про кодогенерацию я вот в dao спрашивал. - bialix(11.02.2010 20:03)
							
 
- не очень хочется под каждую структуру заводить свою функцию сериализации. Т.е. по сути я хочу сделать одну такую функцию для всех данных, а вот "рассказать" этой функции где и что лежит собирался с помощью одной общей структуры (вернее  koyodza(50 знак., 11.02.2010 19:46)
					
- Честно говоря не понимаю смысл вопроса. Делал управление по ModBus 21 устройством. Для каждого устройства создавал управляющий объект. Объекту давалась команда - сформировать фрейм для ModBus. Объект возвращал указатель на последовательность байт, дальше  Михаил Е.(129 знак., 11.02.2010 11:52)
			- гм... Вы видимо невнимательно прочитали вопрос. Попытаюсь объяснить ещё раз koyodza(1378 знак., 11.02.2010 19:52 - 20:32)
 
- Мысль одна - данные должны записываться в нативном виде, только не для процессора, а для человека. Одна из структур, которые могут быть прочитаны по интерфейсу, описывается вот так, в отдельном файле: Vladimir Ljaschko(1497 знак., 11.02.2010 11:30)
- Я, лично, перенес это из данных в код! Вместо структур в памяти длиннючая процедура if-else-if... памяти программ у меня заметно больше чем оперативки, да и быстродействие с запасом... - Скрипач(10.02.2010 20:51)
			- так я тоже делал - ещё раньше, чем описанный вариант. Годится только для относительно небольших проектов  koyodza(280 знак., 10.02.2010 22:54)
					- Не совсем понял пассаж из астрономии. У меня введена процедура "netGetValueToSend()". К модбасу она никак не привязана. (Других протоколов пока не делал, но общение с тремя мастерами = ок).  Скрипач(656 знак., 11.02.2010 00:31 - 00:38)
							- всё верно - koyodza(11.02.2010 19:47)
									- Ок. И все же, чем эта стратегия, с вашей точки зрения, плоха для "больших" систем? - Скрипач(11.02.2010 19:52)
											- тем, что if else if будет слишком длинным, и контролировать изменения становится крайне затруднительно - koyodza(11.02.2010 20:01)
													- Контролирует изменения, при таком подходе,  линкер. Или вы о чем-то другом? - Скрипач(11.02.2010 20:06)
															- о другом: заказчик захотел в алгоритм управления добавить пару параметров. Линкер тут ни при чём  koyodza(705 знак., 11.02.2010 20:19)
																	- "Спагетти-код"?! Вы ничего не путаете?  Скрипач(532 знак., 11.02.2010 20:37)
																			- нет, раскидывать по разным модулям процедуры, которые в общем-то делают одно и то же, только с разными данными я уж точно не буду. Спасибо :=) - koyodza(11.02.2010 20:46)
																					- А таблицы, "дырки в адресации", выделение блоками вас не смущает? Во истину, у каждого своя дорога - Скрипач(11.02.2010 20:54)
																							- нет, дырки в адрессации не смущают ни секунды. Это абсолютно нормальная практика  koyodza(434 знак., 11.02.2010 21:15)
																									- Таблица ваша займет почти столько же сколько "мой" код, а по обозримости... не знаю. Функционал потеряете - факт. - Скрипач(11.02.2010 21:31)
 
 
- нет, дырки в адрессации не смущают ни секунды. Это абсолютно нормальная практика  koyodza(434 знак., 11.02.2010 21:15)
																									
 
- А таблицы, "дырки в адресации", выделение блоками вас не смущает? Во истину, у каждого своя дорога - Скрипач(11.02.2010 20:54)
																							
 
- нет, раскидывать по разным модулям процедуры, которые в общем-то делают одно и то же, только с разными данными я уж точно не буду. Спасибо :=) - koyodza(11.02.2010 20:46)
																					
 
- "Спагетти-код"?! Вы ничего не путаете?  Скрипач(532 знак., 11.02.2010 20:37)
																			
 
- о другом: заказчик захотел в алгоритм управления добавить пару параметров. Линкер тут ни при чём  koyodza(705 знак., 11.02.2010 20:19)
																	
 
- Контролирует изменения, при таком подходе,  линкер. Или вы о чем-то другом? - Скрипач(11.02.2010 20:06)
															
 
- тем, что if else if будет слишком длинным, и контролировать изменения становится крайне затруднительно - koyodza(11.02.2010 20:01)
													
 
- Ок. И все же, чем эта стратегия, с вашей точки зрения, плоха для "больших" систем? - Скрипач(11.02.2010 19:52)
											
 
- всё верно - koyodza(11.02.2010 19:47)
									
- а структуры ссылок и так во флеши будут, поскольку они - константы. Само собой ОЗУ под это дело я пустить не могу, мало его - koyodza(10.02.2010 23:47)
 
- Не совсем понял пассаж из астрономии. У меня введена процедура "netGetValueToSend()". К модбасу она никак не привязана. (Других протоколов пока не делал, но общение с тремя мастерами = ок).  Скрипач(656 знак., 11.02.2010 00:31 - 00:38)
							
- Немного о побочных эффектах. Например о синхронизации доступа к ресурсам :) Посмотрел еще раз на свою "длиннючую" процедуру - а че, даже красивО :) - Скрипач(10.02.2010 20:56)
 
- так я тоже делал - ещё раньше, чем описанный вариант. Годится только для относительно небольших проектов  koyodza(280 знак., 10.02.2010 22:54)
					
- У нас обычно данные в памяти хранятся в их нативном (естественном) для данной архитектуры виде. Запрос мастера обрабатывается путем поиска по таблице описаний. В таблице описаний есть указатель на начало объекта, размер объекта, тип объекта (переменная  rezident(664 знак., 10.02.2010 19:49)
			- а как именно Вы составляете "таблицу описаний"? Можно для примера кусочек? Или на словах хотя бы - koyodza(10.02.2010 22:56)
					- Дык я же вроде понятно словами описал. Как-то так примерно. rezident(1293 знак., 11.02.2010 01:23 - 01:27)
 
 
- а как именно Вы составляете "таблицу описаний"? Можно для примера кусочек? Или на словах хотя бы - koyodza(10.02.2010 22:56)
					
- Наша "таблица ссылок"-"подарок модбасу" содержит:  amusin(242 знак., 10.02.2010 15:23)
			- а тип данных (разрядность)? Или у Вас МК с BigEndian и переворачивать не нужно? Кстати, насчет 1МБ это видимо преувеличение  koyodza(89 знак., 10.02.2010 15:35 - 15:46)
					- Ответ amusin(215 знак., 10.02.2010 16:04)
 
 
- а тип данных (разрядность)? Или у Вас МК с BigEndian и переворачивать не нужно? Кстати, насчет 1МБ это видимо преувеличение  koyodza(89 знак., 10.02.2010 15:35 - 15:46)
					
- были такие же мысли, делал так [+]  megajohn(1226 знак., 10.02.2010 13:22)
			- это чуть-чуть другое. К тому же корректно работать будет только с данными одинаковой разрядности - koyodza(10.02.2010 13:28)
- То есть 4 разных структуры, совмещенные в одно модбас-простанство - megajohn(10.02.2010 13:25)
 
- кроме того, ещё сюда накладывается проблема индейцев  koyodza(563 знак., 10.02.2010 12:55 - 13:12)
			- Никогда не пробовал, но в ИАРе Project/Options/General Options/Endian mode для чего то предназначена? - Михаил Е.(10.02.2010 13:14)
					- В ИАР можно использовать атрибут __big_endian для данных, которые с таким выравниванием. sbb(78 знак., 10.02.2010 19:53)
- в кейле тоже есть птичка "BigEndian" на вкладке Target, только для кортекс-М3 она серенькая  koyodza(49 знак., 10.02.2010 13:21)
							- В ИАРе переключается и компилируется нормально без ошибок. - Михаил Е.(10.02.2010 13:27)
									- Компилируется, а запустить получилось?  sbb(111 знак., 10.02.2010 19:31)
											- Запускать не пробовал, не на чем пока. Я так думаю что должно влиять только на байтовую пересылку через указатель. Внутри процессора конечно меняться ничего не должно. - Михаил Е.(11.02.2010 11:01)
													- У меня глухо зависает еще при загрузке через JLink, что ожидаемо.  sbb(182 знак., 11.02.2010 13:51)
															- т.е. можно и не пытаться? Спасибо - koyodza(11.02.2010 18:56)
 
- это же не 8-битник, какая такая "байтовая пересылка через указатель"? - koyodza(11.02.2010 11:06)
															- Например через UART передача 4-х байтового. Последовательность байт через указатель адресуется. - Михаил Е.(11.02.2010 11:16)
 
 
- У меня глухо зависает еще при загрузке через JLink, что ожидаемо.  sbb(182 знак., 11.02.2010 13:51)
															
- вот-вот, у меня те же мысли  koyodza(75 знак., 10.02.2010 22:57)
													- Как писал выше, атрибут __big_endian в IAR неплохо решает проблему. sbb(174 знак., 11.02.2010 00:38)
 
 
- Запускать не пробовал, не на чем пока. Я так думаю что должно влиять только на байтовую пересылку через указатель. Внутри процессора конечно меняться ничего не должно. - Михаил Е.(11.02.2010 11:01)
													
- какой МК выбран? - koyodza(10.02.2010 13:28)
											- ST STM32F10xxB - Михаил Е.(10.02.2010 13:30)
													- а версия иара какая? Попробую посмотреть - koyodza(10.02.2010 13:31)
															- 5.40 - Михаил Е.(10.02.2010 13:34)
																	- Кстати, программа на С написана? На С++ просто переопределяется оператор "=" для указателя на WORD и все дела. - Михаил Е.(10.02.2010 13:40)
 
 
- 5.40 - Михаил Е.(10.02.2010 13:34)
																	
 
- а версия иара какая? Попробую посмотреть - koyodza(10.02.2010 13:31)
															
 
- ST STM32F10xxB - Михаил Е.(10.02.2010 13:30)
													
 
- Компилируется, а запустить получилось?  sbb(111 знак., 10.02.2010 19:31)
											
 
- В ИАРе переключается и компилируется нормально без ошибок. - Михаил Е.(10.02.2010 13:27)
									
 
 
- Никогда не пробовал, но в ИАРе Project/Options/General Options/Endian mode для чего то предназначена? - Михаил Е.(10.02.2010 13:14)
					
- "грязный хак", так как по стандарту вычитать можно только указатели в пределах одного объекта. Но должно работать в реальных условиях.  ReAl(329 знак., 10.02.2010 13:04)
			- ошибки  koyodza(141 знак., 10.02.2010 13:08)
					- Ну там в OFFS(a) лишняя закрывающая скобка, а вот ругань не не-константу, это уже, похоже, от таки нежелания брать разность указателей на разне объекты, так как на  ReAl(68 знак., 10.02.2010 13:17)
							- да оно и без разности указателей, просто на попытку применить к указателю любые действия (отсечь или обнулить старшие биты) тоже ругается что типа это уже не-константа - koyodza(10.02.2010 13:25)
									- Так как раз разность - это единственное, что допустимо делать с двумя указателями, с одним - это добавить-вычесть целое. Просто стадарт допускает это (вычитание) делать только между указателями, показывающими на части одного объекта (массива, структуры).  ReAl(528 знак., 10.02.2010 14:51)
											- ОК. Может, какие мысли есть как это всё сделать совсем иначе? - koyodza(10.02.2010 15:07)
 
 
- Так как раз разность - это единственное, что допустимо делать с двумя указателями, с одним - это добавить-вычесть целое. Просто стадарт допускает это (вычитание) делать только между указателями, показывающими на части одного объекта (массива, структуры).  ReAl(528 знак., 10.02.2010 14:51)
											
 
- да оно и без разности указателей, просто на попытку применить к указателю любые действия (отсечь или обнулить старшие биты) тоже ругается что типа это уже не-константа - koyodza(10.02.2010 13:25)
									
 
- Ну там в OFFS(a) лишняя закрывающая скобка, а вот ругань не не-константу, это уже, похоже, от таки нежелания брать разность указателей на разне объекты, так как на  ReAl(68 знак., 10.02.2010 13:17)
							
 
- ошибки  koyodza(141 знак., 10.02.2010 13:08)
					
 
- не для modbus, а для доморощенного UART протокола использовал доморощенную БД.  abivan(3062 знак., 11.02.2010 21:50 - 21:54)