Re: Уникальный ID
От: мыщъх США http://nezumi-lab.org
Дата: 24.10.12 06:56
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

> с помощью которой удалось бы решить данную проблему?


задача непонятна.

каждый модуль должен иметь уникальный 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.
Re[3]: Уникальный ID
От: мыщъх США http://nezumi-lab.org
Дата: 24.10.12 08:12
Оценка: +1
Здравствуйте, 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.
Уникальный ID
От: Аноним  
Дата: 24.10.12 06:19
Оценка:
Здравствуйте, пишем на СИ и есть такая проблема для модулей нужно ввести уникальный идентификатор, который определялся бы при компиляции проекта, т.к. в проектах могут добавляться и удаляться модули и не хотелось бы чтобы за этим следили программисты.
можно этого добиться при помощи макросов или можете подсказать инструмент(примочку) с помощью которой удалось бы решить данную проблему?
компилятор "IAR C"
Re: Уникальный ID
От: AleksandrN Россия  
Дата: 24.10.12 06:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, пишем на СИ и есть такая проблема для модулей нужно ввести уникальный идентификатор, который определялся бы при компиляции проекта, т.к. в проектах могут добавляться и удаляться модули и не хотелось бы чтобы за этим следили программисты.

А>можно этого добиться при помощи макросов или можете подсказать инструмент(примочку) с помощью которой удалось бы решить данную проблему?
А>компилятор "IAR C"


Содать два файла:
// module_id.h

#ifndef __MODULE_ID__
#define __MODULE_ID__

extern char module_id[];

#endif



// module_id.c

char module_id[] = { "00000000- ... -000000000000" };

Для создания C-файла написать скрипт, который будет создавать файл, если его ещё нет. Этот скрипт запускать при сборке проекта.
Re[2]: Уникальный ID
От: narik1985  
Дата: 24.10.12 07:30
Оценка:
Здравствуйте, мыщъх, Вы писали:

М>Здравствуйте, Аноним, Вы писали:


>> с помощью которой удалось бы решить данную проблему?


М>задача непонятна.


М>каждый модуль должен иметь уникальный ID? насколько уникальный? уникальный в рамках проекта или в планетарных масштабах (с учетом сторонних разработчиков).


М>что происходит при перекомпиляции -- должен ли модуль менять ID или сохранять его?


М>требуется ли защита от дурака и от предамеренного использования неуникального ID?


М>как реализована загрузка/выгрузка модулей?


М>в принципе, адрес функции в модуле -- это и есть ID. при условии, что модули не можут выгружаться и загружаться на лету, мы гарантируем, что у всех модулей будет уникальный ID.


Каждый модуль должен иметь уникальный ID в виде макросов(ID_LED, ID_UART, ID_I2C) по которым они смогут друг с другом общаться
ID просто не должен повторять в рамках одного проекта, при компиляции не важно будет он меняться или нет
Защита от использования преднамеренного неуникального ID не требуется
Выгрузки нету, загрузка фактически осуществляется добавлением файла исходника в проект
Re[3]: Уникальный ID
От: Erop Россия  
Дата: 24.10.12 07:43
Оценка:
Здравствуйте, narik1985, Вы писали:

N>Каждый модуль должен иметь уникальный ID в виде макросов(ID_LED, ID_UART, ID_I2C) по которым они смогут друг с другом общаться

А сколько у вас модулей, что так уж трудно раздать всем имена раз и навсегда?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Уникальный ID
От: narik1985  
Дата: 24.10.12 08:03
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, narik1985, Вы писали:


N>>Каждый модуль должен иметь уникальный ID в виде макросов(ID_LED, ID_UART, ID_I2C) по которым они смогут друг с другом общаться

E>А сколько у вас модулей, что так уж трудно раздать всем имена раз и навсегда?..

в системе максимум будут работать 20 модулей, но при этом они будут меняться. А вот сам список модулей со временем будет расширяться, пока мы не превысим размер в значение 255(1 байт) можно действительно раздать имена раз и навсегда, а вот когда превысим, на ID будет уходить по 2 байта, если для программ на ПК размер кода не столь критичен, то размер сегмента данных и кодовый сегмент для микроконтроллеров является узким местом.
Re: Уникальный ID
От: rpz  
Дата: 24.10.12 08:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, пишем на СИ и есть такая проблема для модулей нужно ввести уникальный идентификатор, который определялся бы при компиляции проекта, т.к. в проектах могут добавляться и удаляться модули и не хотелось бы чтобы за этим следили программисты.

А>можно этого добиться при помощи макросов или можете подсказать инструмент(примочку) с помощью которой удалось бы решить данную проблему?
А>компилятор "IAR C"

Мы используем вот такую штуку http://www.ossp.org/pkg/lib/uuid/
Re[4]: Уникальный ID
От: narik1985  
Дата: 24.10.12 08:21
Оценка:
Здравствуйте, мыщъх, Вы писали:

М>Здравствуйте, narik1985, Вы писали:


N>>Каждый модуль должен иметь уникальный ID в виде макросов(ID_LED, ID_UART, ID_I2C) по которым они смогут друг с другом общаться

М>тогда просто возьмите адреса функций из модуля. разные функции разных модулей гарантированно не могут располагаться по одному и тому же адресу. хотя это и не на стадии компиляции, а только при линковке или даже загрузке файла.

М>а в рантайме получать ID не хотите? malloc гарантированно возвращает разные указатели (если не освобождать).


М>если все-таки нужно делать на стадии компиляции, то в make файл достаточно включить очень простой Cи файл, который компилируется, запускается и генерирует все эти ID для каждого модуля. мне приходится много писать на ANSI C89, возможностей которого не хватает и хочется вкусностей (типа как вам) и потому пришлось копать в сторону метапрограммирования -- это когда результатом программы на Си становится другая программа на Си, которая и компилируется в конечный код. таким образом, можно написать свой препроцессор со своими фичами и таскать его за собой.



а мы перешли с с++ на С99, по причине медлительности и проблем с размером прошивки(сложно было уложиться в пределы доступного пространства)

увы по адресам не получится, так построена архитектура, что модулям нельзя сообщить адрес другого, похоже придется копать в сторону метапрограммирования, как и вам...
Re[5]: Уникальный ID
От: Erop Россия  
Дата: 24.10.12 08:36
Оценка:
Здравствуйте, narik1985, Вы писали:

N>в системе максимум будут работать 20 модулей, но при этом они будут меняться. А вот сам список модулей со временем будет расширяться, пока мы не превысим размер в значение 255(1 байт) можно действительно раздать имена раз и навсегда, а вот когда превысим, на ID будет уходить по 2 байта, если для программ на ПК размер кода не столь критичен, то размер сегмента данных и кодовый сегмент для микроконтроллеров является узким местом.


То есть id таки должен быть числом? Я верно тебя понял?

Я бы как-то отображал запоминабельные строчки на числа и обратно.

Путь номер один -- использовать конструкцию вроде 'LED', 'URAT', 'I2C' (это int в обоих языках)
Путь номер два -- написать скрипт, который запаковывает в 32 бита 5-6 букв...

С одной стороны 4 байта на ID не так уж и много, даже в микроконтроллере. С другой, мала вероятность случайного совпадения тэга, а с третьей, 4-6 бкув уже достаточно для более или менее осмысленного названия...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Уникальный ID
От: kov_serg Россия  
Дата: 24.10.12 09:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, пишем на СИ и есть такая проблема для модулей нужно ввести уникальный идентификатор, который определялся бы при компиляции проекта, т.к. в проектах могут добавляться и удаляться модули и не хотелось бы чтобы за этим следили программисты.

А>можно этого добиться при помощи макросов или можете подсказать инструмент(примочку) с помощью которой удалось бы решить данную проблему?
А>компилятор "IAR C"

// module_i2c.h
#pragma once
#include <modules_ids.h>
enum { module_i2c_id=ID_I2C };
...

// module_i2c.c
#include "module_i2c.h"
...

// modules_ids.h
#pragma once
enum MODULES_IDS {
  ID_I2C,
  ID_PWM,
  ID_SCREEN,
  ID_SOUND,
  ID_SPI,
  ID_TEMP,
  ID_PROFIBUS,
  ID_UART,
  ...

  IDMAX
};

файл со списком ID-ов
в самом модуле потребовать чтоб такая константа была enum { module_i2c_id=ID_I2C };
если нет то добавить в modules.h

Если хочется что бы всё само генерилось. Нет проблем используйте скриптовые языки типа perl,php,pyton и т.п.
Они вам быстро, дёшево и платформо независимо подготовят файлы со списками id-ов перед компиляцией.
И запуск прямо из makefile
Re[6]: Уникальный ID
От: narik1985  
Дата: 24.10.12 10:19
Оценка:
Здравствуйте, 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 бкув уже достаточно для более или менее осмысленного названия...


Да все верно понял, должно быть числом.
Пока не ясно, как написать скрипт? как это делается? здорово, если бы прям ссылки на пример были
Re[7]: Уникальный ID
От: Erop Россия  
Дата: 24.10.12 11:04
Оценка:
Здравствуйте, narik1985, Вы писали:

N>Пока не ясно, как написать скрипт? как это делается? здорово, если бы прям ссылки на пример были



Ну, например, напиши на С утилиту, которая по имени модуля рожает хедер с таким же имением, и пакует номер в число. Скажем вычисляет MD5, а рядом в коммент пишет расшифровку

Но если 4-х букв достаточно, то можно писать просто так
#define ID_SED ('SED' * 1)
/*  ID_SED -- числовой идентификатор модуля SED */
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: Уникальный ID
От: enji  
Дата: 24.10.12 19:38
Оценка:
Здравствуйте, narik1985, Вы писали:


N>а мы перешли с с++ на С99, по причине медлительности и проблем с размером прошивки(сложно было уложиться в пределы доступного пространства)


Смешно. А что в с++ такого медленного и жрущего пространство?

N>увы по адресам не получится, так построена архитектура, что модулям нельзя сообщить адрес другого, похоже придется копать в сторону метапрограммирования, как и вам...

Для пары десятков модулей много проще раздать эти константы руками...
Re[6]: Уникальный ID
От: enji  
Дата: 24.10.12 19:40
Оценка:
Здравствуйте, Erop, Вы писали:

E>Путь номер один -- использовать конструкцию вроде 'LED', 'URAT', 'I2C' (это int в обоих языках)

Если у них авр, то там инт 16битный
Re[7]: Уникальный ID
От: Erop Россия  
Дата: 24.10.12 22:09
Оценка:
Здравствуйте, enji, Вы писали:

E>>Путь номер один -- использовать конструкцию вроде 'LED', 'URAT', 'I2C' (это int в обоих языках)

E>Если у них авр, то там инт 16битный

Ну, тогда, можно просто считать что-то типа MD5 названия модуля и брать 16 бит...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.