-
- не для 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, )
- имхо имелись в виду не собственно скрипты, а инструменты, которые эти скрипты используют для того чтобы код сгенерить. У вас это питон? - Alex B.(13.02.2010 14:00)
- В общем случае -- может быть. Но у меня скрипты-кодогенераторы лежат прямо рядом с исходниками, и по зависимостям автоматически запускаются при сборке (scons). - bialix(13.02.2010 12:42)
- в языке Си есть только один "способ" частичной автоматизации: препроцессор. Этот способ настолько жалкий, что я бы за него не брался. - 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)