Здравствуйте, пишем на СИ и есть такая проблема для модулей нужно ввести уникальный идентификатор, который определялся бы при компиляции проекта, т.к. в проектах могут добавляться и удаляться модули и не хотелось бы чтобы за этим следили программисты.
можно этого добиться при помощи макросов или можете подсказать инструмент(примочку) с помощью которой удалось бы решить данную проблему?
компилятор "IAR C"
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, пишем на СИ и есть такая проблема для модулей нужно ввести уникальный идентификатор, который определялся бы при компиляции проекта, т.к. в проектах могут добавляться и удаляться модули и не хотелось бы чтобы за этим следили программисты. А>можно этого добиться при помощи макросов или можете подсказать инструмент(примочку) с помощью которой удалось бы решить данную проблему? А>компилятор "IAR C"
Здравствуйте, Аноним, Вы писали:
> с помощью которой удалось бы решить данную проблему?
задача непонятна.
каждый модуль должен иметь уникальный ID? насколько уникальный? уникальный в рамках проекта или в планетарных масштабах (с учетом сторонних разработчиков).
что происходит при перекомпиляции -- должен ли модуль менять ID или сохранять его?
требуется ли защита от дурака и от предамеренного использования неуникального ID?
как реализована загрузка/выгрузка модулей?
в принципе, адрес функции в модуле -- это и есть ID. при условии, что модули не можут выгружаться и загружаться на лету, мы гарантируем, что у всех модулей будет уникальный ID.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, мыщъх, Вы писали:
М>Здравствуйте, Аноним, Вы писали:
>> с помощью которой удалось бы решить данную проблему?
М>задача непонятна.
М>каждый модуль должен иметь уникальный ID? насколько уникальный? уникальный в рамках проекта или в планетарных масштабах (с учетом сторонних разработчиков).
М>что происходит при перекомпиляции -- должен ли модуль менять ID или сохранять его?
М>требуется ли защита от дурака и от предамеренного использования неуникального ID?
М>как реализована загрузка/выгрузка модулей?
М>в принципе, адрес функции в модуле -- это и есть ID. при условии, что модули не можут выгружаться и загружаться на лету, мы гарантируем, что у всех модулей будет уникальный ID.
Каждый модуль должен иметь уникальный ID в виде макросов(ID_LED, ID_UART, ID_I2C) по которым они смогут друг с другом общаться
ID просто не должен повторять в рамках одного проекта, при компиляции не важно будет он меняться или нет
Защита от использования преднамеренного неуникального ID не требуется
Выгрузки нету, загрузка фактически осуществляется добавлением файла исходника в проект
Здравствуйте, narik1985, Вы писали:
N>Каждый модуль должен иметь уникальный ID в виде макросов(ID_LED, ID_UART, ID_I2C) по которым они смогут друг с другом общаться
А сколько у вас модулей, что так уж трудно раздать всем имена раз и навсегда?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, narik1985, Вы писали:
N>>Каждый модуль должен иметь уникальный ID в виде макросов(ID_LED, ID_UART, ID_I2C) по которым они смогут друг с другом общаться E>А сколько у вас модулей, что так уж трудно раздать всем имена раз и навсегда?..
в системе максимум будут работать 20 модулей, но при этом они будут меняться. А вот сам список модулей со временем будет расширяться, пока мы не превысим размер в значение 255(1 байт) можно действительно раздать имена раз и навсегда, а вот когда превысим, на ID будет уходить по 2 байта, если для программ на ПК размер кода не столь критичен, то размер сегмента данных и кодовый сегмент для микроконтроллеров является узким местом.
Здравствуйте, narik1985, Вы писали:
N>Каждый модуль должен иметь уникальный ID в виде макросов(ID_LED, ID_UART, ID_I2C) по которым они смогут друг с другом общаться
тогда просто возьмите адреса функций из модуля. разные функции разных модулей гарантированно не могут располагаться по одному и тому же адресу. хотя это и не на стадии компиляции, а только при линковке или даже загрузке файла.
а в рантайме получать ID не хотите? malloc гарантированно возвращает разные указатели (если не освобождать).
если все-таки нужно делать на стадии компиляции, то в make файл достаточно включить очень простой Cи файл, который компилируется, запускается и генерирует все эти ID для каждого модуля. мне приходится много писать на ANSI C89, возможностей которого не хватает и хочется вкусностей (типа как вам) и потому пришлось копать в сторону метапрограммирования -- это когда результатом программы на Си становится другая программа на Си, которая и компилируется в конечный код. таким образом, можно написать свой препроцессор со своими фичами и таскать его за собой.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, пишем на СИ и есть такая проблема для модулей нужно ввести уникальный идентификатор, который определялся бы при компиляции проекта, т.к. в проектах могут добавляться и удаляться модули и не хотелось бы чтобы за этим следили программисты. А>можно этого добиться при помощи макросов или можете подсказать инструмент(примочку) с помощью которой удалось бы решить данную проблему? А>компилятор "IAR C"
Здравствуйте, мыщъх, Вы писали:
М>Здравствуйте, narik1985, Вы писали:
N>>Каждый модуль должен иметь уникальный ID в виде макросов(ID_LED, ID_UART, ID_I2C) по которым они смогут друг с другом общаться М>тогда просто возьмите адреса функций из модуля. разные функции разных модулей гарантированно не могут располагаться по одному и тому же адресу. хотя это и не на стадии компиляции, а только при линковке или даже загрузке файла.
М>а в рантайме получать ID не хотите? malloc гарантированно возвращает разные указатели (если не освобождать).
М>если все-таки нужно делать на стадии компиляции, то в make файл достаточно включить очень простой Cи файл, который компилируется, запускается и генерирует все эти ID для каждого модуля. мне приходится много писать на ANSI C89, возможностей которого не хватает и хочется вкусностей (типа как вам) и потому пришлось копать в сторону метапрограммирования -- это когда результатом программы на Си становится другая программа на Си, которая и компилируется в конечный код. таким образом, можно написать свой препроцессор со своими фичами и таскать его за собой.
а мы перешли с с++ на С99, по причине медлительности и проблем с размером прошивки(сложно было уложиться в пределы доступного пространства)
увы по адресам не получится, так построена архитектура, что модулям нельзя сообщить адрес другого, похоже придется копать в сторону метапрограммирования, как и вам...
Здравствуйте, narik1985, Вы писали:
N>в системе максимум будут работать 20 модулей, но при этом они будут меняться. А вот сам список модулей со временем будет расширяться, пока мы не превысим размер в значение 255(1 байт) можно действительно раздать имена раз и навсегда, а вот когда превысим, на ID будет уходить по 2 байта, если для программ на ПК размер кода не столь критичен, то размер сегмента данных и кодовый сегмент для микроконтроллеров является узким местом.
То есть id таки должен быть числом? Я верно тебя понял?
Я бы как-то отображал запоминабельные строчки на числа и обратно.
Путь номер один -- использовать конструкцию вроде 'LED', 'URAT', 'I2C' (это int в обоих языках)
Путь номер два -- написать скрипт, который запаковывает в 32 бита 5-6 букв...
С одной стороны 4 байта на ID не так уж и много, даже в микроконтроллере. С другой, мала вероятность случайного совпадения тэга, а с третьей, 4-6 бкув уже достаточно для более или менее осмысленного названия...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, пишем на СИ и есть такая проблема для модулей нужно ввести уникальный идентификатор, который определялся бы при компиляции проекта, т.к. в проектах могут добавляться и удаляться модули и не хотелось бы чтобы за этим следили программисты. А>можно этого добиться при помощи макросов или можете подсказать инструмент(примочку) с помощью которой удалось бы решить данную проблему? А>компилятор "IAR C"
файл со списком ID-ов
в самом модуле потребовать чтоб такая константа была enum { module_i2c_id=ID_I2C };
если нет то добавить в modules.h
Если хочется что бы всё само генерилось. Нет проблем используйте скриптовые языки типа perl,php,pyton и т.п.
Они вам быстро, дёшево и платформо независимо подготовят файлы со списками id-ов перед компиляцией.
И запуск прямо из makefile
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, narik1985, Вы писали:
N>>в системе максимум будут работать 20 модулей, но при этом они будут меняться. А вот сам список модулей со временем будет расширяться, пока мы не превысим размер в значение 255(1 байт) можно действительно раздать имена раз и навсегда, а вот когда превысим, на ID будет уходить по 2 байта, если для программ на ПК размер кода не столь критичен, то размер сегмента данных и кодовый сегмент для микроконтроллеров является узким местом.
E>То есть id таки должен быть числом? Я верно тебя понял?
E>Я бы как-то отображал запоминабельные строчки на числа и обратно.
E>Путь номер один -- использовать конструкцию вроде 'LED', 'URAT', 'I2C' (это int в обоих языках) E>Путь номер два -- написать скрипт, который запаковывает в 32 бита 5-6 букв...
E>С одной стороны 4 байта на ID не так уж и много, даже в микроконтроллере. С другой, мала вероятность случайного совпадения тэга, а с третьей, 4-6 бкув уже достаточно для более или менее осмысленного названия...
Да все верно понял, должно быть числом.
Пока не ясно, как написать скрипт? как это делается? здорово, если бы прям ссылки на пример были
Здравствуйте, narik1985, Вы писали:
N>Пока не ясно, как написать скрипт? как это делается? здорово, если бы прям ссылки на пример были
Ну, например, напиши на С утилиту, которая по имени модуля рожает хедер с таким же имением, и пакует номер в число. Скажем вычисляет MD5, а рядом в коммент пишет расшифровку
Но если 4-х букв достаточно, то можно писать просто так
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
N>а мы перешли с с++ на С99, по причине медлительности и проблем с размером прошивки(сложно было уложиться в пределы доступного пространства)
Смешно. А что в с++ такого медленного и жрущего пространство?
N>увы по адресам не получится, так построена архитектура, что модулям нельзя сообщить адрес другого, похоже придется копать в сторону метапрограммирования, как и вам...
Для пары десятков модулей много проще раздать эти константы руками...
Здравствуйте, Erop, Вы писали:
E>Путь номер один -- использовать конструкцию вроде 'LED', 'URAT', 'I2C' (это int в обоих языках)
Если у них авр, то там инт 16битный
Здравствуйте, enji, Вы писали:
E>>Путь номер один -- использовать конструкцию вроде 'LED', 'URAT', 'I2C' (это int в обоих языках) E>Если у них авр, то там инт 16битный
Ну, тогда, можно просто считать что-то типа MD5 названия модуля и брать 16 бит...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском