Jump to content
    

psL

Свой
  • Posts

    520
  • Joined

  • Last visited

Everything posted by psL


  1. да, между производителем ПЛК и конечным пользователем - пропасть, интеграцией нормально никто не занимается, в основном интегратор сейчас - это банальный дилер. ну и производители не особо спешат вкладывать средства в тестирование своего продукта: испытания - по минимуму, в особо "тяжелых" случаях испытания вообще проходят уже на объекте... пмсм, "набивать руку" нужно с "верхнего" уровня, т.е. разработки инфраструктуры системы, ее развертывания и мониторинга хотя бы на основе существующего стороннего оборудования. В этом случае можно оценить особенности и недостатки оборудования будущих конкурентов, и, наверное, что-то заработать на заказах по интеграции.
  2. за нцать лет могли бы уже сделать макроячейки с rising/falling и куды только маркетинг смотрит :)
  3. оптимистично. Кстати, на странице: Display Parallel RGB LVDS
  4. обработку можно как в самой команде сделать в if(!args), так и в цикле поиска команды по имени: struct cmd { char* name; int (*cmd_read)(void); int (*cmd_write)(char** args); }; ... int test_read(){ return 0; } ... if(!strcmp(cmds[i].name, args[0])) { if(args[1]) cmds[i].cmd_write(&args[1]); else cmds[i].cmd_read(); }
  5. Нет. Эта функция в таком виде в данном конкретном случае не нужна. Нужно вот так, с некоторыми оговорками: //char cmd[] = "test";// arg1 arg2"; //char test[] = "test arg1 arg2"; char test[] = "test2"; struct cmd { char* name; int (*cmd)(char** args); }; int cmd_test(char** args) { enum { ARG1=1, ARG2=2 }; int argc=ARG1; printf("CMD test,"); if(!args) { printf("required parameters!\n"); return -1; } do { switch(argc++) { case ARG1: printf(" ARG1: %s", *args); break; case ARG2: printf(" ARG2: %s", *args); break; default: printf("Unknown param: %s\n", *args); break; } } while(*++args); printf("\n"); return 0; } int cmd_test2(char** args) { printf("CMD test2\n"); return 0; } struct cmd cmds[] = { { .name = "test", .cmd = cmd_test }, { .name = "test2", .cmd = cmd_test2 }, }; int main () { int argc, i; argc = parse_command(test, args); for(i=0;i<sizeof(cmds)/sizeof(struct cmd); i++) { if(!strcmp(cmds[i].name, args[0])) cmds[i].cmd(args[1]?&args[1]:NULL); } return 0; } Для расширения функциональности нужно просто дописывать функцию и добавлять ее в таблицу команд cmds[] Пример разбора аргументов - в cmd_test, test2 - как пример второй команды. В случае управляющего терминала видимо команда должна сразу выдавать результат работы в выходной буфер последовательного порта, поэтому вот так.
  6. Как уже отвечал в предыдущей теме, в вашей задаче проще парсить входящий буфер в массив указателей на подстроки. Тогда arg[0] будет командой, а все остальные arg - ее параметры Т.е. в результате должно получиться как-то так: struct cmd { char* name; void* (*proc)(void*); }; void* cmd1_proc(char** arg) { while(NULL != *arg++){ .. } } scruct cmd cmds[]={ { .cmd="cmd1", .proc=cmd1_proc }, .. } .. if(strcmp(arg[0], cmds[i].name)) cmds[i].proc(&arg[1]);
  7. По идее как-то так д.б. : #define ARGS_MAX 16 #define ARGS_DELIM " " static char* args[ARGS_MAX]={ NULL }; int parse_command(char* str, char** args) { int argc=0; args[argc] = strtok (str, ARGS_DELIM); while (args[argc] != NULL) { if(argc >= ARGS_MAX) break; args[++argc] = strtok (NULL, ARGS_DELIM); } return argc; } void uart_send_string(int uart, char* command) { printf("send: %s\n", command); } int main () { char str[] = "run arg1 arg2"; int argc, i; argc = parse_command(str, args); for(i=0;i<argc; i++) { uart_send_string(1, args[i]); } return 0; } непонятно только, зачем отправлять команду в порт порциями?
  8. #define LCD_SEGMENT_B_POS_SEG(_pos ) { ... (1<<_pos)... } либо #define LCD_SEGMENT_B_POS_SEG(_pos ) { ... ## _pos ... }
  9. Может проще парсить команду при помощи strtok в массив указателей? http://www.cplusplus.com/reference/cstring/strtok/
  10. Если правильно понимаю, нужно прокинуть виртуальный RS232 порт с ПК в реальный порт на контроллере. Делал такое кажется при помощи http://www.eterlogic.com/Products.VSPE.html утилита эта кажется есть в местных закромах, давно это было не помню. Судя по исходнику на плате создается netconn_new( NETCONN_TCP ) , соответственно программа эта tcp клиент + создает на ПК виртуальный ком-порт,который доступен при удачном подключении к серверу. Возможно в программе и udp режим обмена есть.
  11. начинать нужно с ардуин в виде модулей с 5 и 9, в качестве продолжения - шилды для оного в том же исполнении. Для военных самое оно. зы: еще, рассмотрите возможность выпуска батутов...
  12. Принимает. Но есть тонкости. Написал вам. Задаю вопросы, которые интересны лично мне. ТС пишет: POLL, почему вы так болезненно воспринимаете обсуждение проекта? Вы автор железа или что? Непонятно...
  13. В случае производителя ПО пишется под всю заложенную на плате функциональность, в случае кастомера - только под необходимые узлы.
  14. Отсутствует возможность установки сим-карты или sd-карты не вскрывая корпус. Видимо.
  15. Не очень понятно: вы производитель этой платы или кастомер, который разрабатывает свое устройство на ее основе? Вопрос про RS485 и т.д. - для первого случая. Можно ТЗ и имеющуюся документацию на psl8080@yаndех.ru ? Если не сложно, напишите бюджет разработки, ожидаему стоимость конечного устройства, а также где находитесь.
  16. Непонятно, что вы пытаетесь сделать. Небольшой пример #define FREQ_START_ADDR 0x000 #define FREQ_CNT_ADDR 0xFF0 #define FREQ_CNT_MAX 16 uint8_t cnt; uint32_t freq[16]; // чтение таблицы частот cnt=eeprom_read_byte((uint8_t*) INDEX_FREQ_ADDR); // число частот в таблице { uint8_t i; uint32_t* ptr=(uint32_t*)FREQ_START_ADDR; for(i=0;i<cnt;i++;){ freq[i]=eeprom_read_dword(ptr++); } } // добавление частоты freq[cnt]=100500; eeprom_write_dword((uint32_t*)(FREQ_START_ADDR+sizeof(uint32_t)*cnt), freq[cnt]); cnt++; eeprom_write_byte((uint8_t*) FREQ_CNT_ADDR, cnt); // обновить число частот в таблице
  17. есть функция записи байта eeprom_write_byte #define INDEX_EEPROM_ADDRESS 0xFF0 uint8_t index; // запись eeprom_write_byte((uint8_t*) INDEX_EEPROM_ADDRESS, index); // чтение index=eeprom_read_byte((uint8_t*) INDEX_EEPROM_ADDRESS);
  18. Нужно тип приводить: F = ((uint32_t)t4<<24)|((uint32_t)t3<<16)|((uint32_t)t2<<8)|(uint32_t)t1; В противном случае сдвиг не имеет смысла. При помощи eeprom_write_dword ( uint32_t *addr , uint32_t value ) вы пишите 32 разрядное значение, соответственно адрес по которому это значение пишется должен быть указателем на 32битную величину. Для записи unsigned long нужно использовать eeprom_write_dword: #define K_EEPROM_ADDRESS 0x00 uint32_t K; // запись eeprom_write_dword((uint32_t*)K_EEPROM_ADDRESS,K); // чтение K=eeprom_read_dword((uint32_t*)K_EEPROM_ADDRESS);
  19. Статья интересная. В принципе, практически все то же самое можно было сделать руками и на С. Например, как-то так: #include <stdbool.h> enum { PORT_A=0, PORT_B=1 }; static void portA_set(int pin_num, bool val){ ... } static void portA_dir(int pin_num, bool val){ ... } static void portB_set(int pin_num, bool val){ } static void portB_dir(int pin_num, bool val){ } struct port_handler { void (*set)(int, bool); void (*dir)(int, bool); }; static struct port_handler handlers[]={ { .set=portA_set, .dir= portA_dir }, { .set=portB_set, .dir= portB_dir } }; void port_set(int port_num, int pin_num, bool val){ struct port_handler* p=&handlers[port_num]; p->set(pin_num, val); } void port_dir(int port_num, int pin_num, bool val){ struct port_handler* p=&handlers[port_num]; p->dir(pin_num, val); } #define EN_ 9 int main(){ port_set(PORT_A, EN_, true); ... } В случае C++ компилятор сам развернет portX_set, portX_dir по шаблону. Но статья интересная.
  20. Вопросов много: Почему Cortex-M3? А не хотябы Cortex-A5? Чем обусловлен выбор контроллера? "Взаимодействие устройств по каналу" это M2M? С точки зрения Rs485, CAN, ZigBee ваше устройство главное или подчиненное? Где хранить тексты смс? Язык обработки сценариев? Как добраться до sim и sd? Корпус вскрывать чтоли? Обновление ПО через USB CDC сделано крайне неудобно с т.з. пользователя. И главное: что охранять? Кто пользователь вашего Охранного устройства?
  21. ну а чем это лучше struct pin { int* port; int num; ... }; void pin_set(struct pin* pin, bool val){ ... } ... // дисплей один, поэтому все статическое static struct pin dist_pins[]={ { .port=..., .pin=... }, // a ... // f } void disp_print(char* str){ ... } void disp_update(){ ... } ? Насколько понимаю, в вашем коде шаблоны используются как макросы? Инициализация производится в конструкторах объектов? пмсм, не очень удобно. Использования каких-то особенностей C++, принципиально не реализуемых на C (перегрузки операторов, наследования и т.п.), в приведенном коде не наблюдается. Кстати, Александреску подался в D ;)
  22. начинайте с постановки задачи. Для реализации "экран, Ethernet" производительности и ресурсов Cortex-M может оказаться недостаточно
  23. смотрите в ядре: http://www.mjmwired.net/kernel/Documentati.../ieee802154.txt вот например: https://wiki.analog.com/resources/tools-sof...c802154/adf7242 насколько понимаю, здесь плата расширения с ADF7242 подключается через SPI. Видимо при большом желании можно подключить к любой "платке с Ембеддед Линух"
  24. Имеется в виду этот? http://www.starterkit.ru/html/index.php?na...view&id=114 http://www.starterkit.ru/html/index.php?na...view&id=115 Интересно, как под эту плату собирать ядро? В оф.репозитории http://git.freescale.com/git/cgit.cgi/ отсутствует arch/arm/mach-mvf/ Вообще, у FS похоже нет поддержки Linux BSP под эти SoC, только стороннее
×
×
  • Create New...