tag 标签: uuid

相关博文
  • 热度 25
    2015-4-21 17:41
    1389 次阅读|
    0 个评论
    mspdebug是Linux下调试msp430系列单片机的工具,它能够实现JTAG的所有功能。 uuidgen是Linux下生成随机序列号的工具。 msp430系列单片机是不包含唯一序列号的,想用?Sorry,自己烧写到flash里面去! 虽然这个功能使用mspdebug的mw命令很容易实现,可难道每烧写一块单片机都要执行一次uuidgen命令,然后将序列号粘贴在mw命令里,uuidgen的输出还得分割成一个字节一个字节才能使用,这样实在是有点麻烦。 一直说Linux代表了freedom,代表了unlimited possibility,眼下这个情况,正是发挥源代码魔力的机会^_^ Step 1:在sourceforge上下载mspdebug的源代码 http://mspdebug.sourceforge.net/index.html 安装库依赖: # yum install readline # yum install readline-devel # yum install libusb # yum install libusb-devel 编译源代码: $ tar xvf mspdebug-0.23.tar.gz $ cd mspdebug-0.23/ $ make 创建软链接并在单片机代码目录运行它: # ln -s /home/maria/maria_work/msp430_workspace/mspdebug-0.23/mspdebug /usr/bin/mspdebug-new # mspdebug-new -j uif -d /dev/ttyUSB4 (它和运行mspdebug的效果是一样的。) (ttyUSB4是仿真器FET430UIF对应的设备号。) (这里就不要用make install了,从mspdebug源代码目录运行,不要覆盖原来的版本。) Step 2:修改ui/devcmd.c文件: #include fcntl.h #include sys/wait.h #define UUID_TEST "/home/maria/.mspdebug/uuid_test" static int do_cmd_prog(char **arg, int prog_flags) {     /* 原来的内容不要动它 */     /* mw the uuid to 0xF000*/     int pid;     if ((pid = fork()) 0) {         printc_err("Cannot fork child.\n");         goto END;     } else if (pid == 0) {         FILE *file;         printc("== child: fopen uuid_test\n");         if ((file = fopen(UUID_TEST, "w+")) == NULL) {             printc_err("Cannot open uuid_test\n");             exit(1);         }         printc("== child: dup2 uuid_test STDOUT_FILENO\n");         if (dup2(fileno(file), STDOUT_FILENO) == -1) {             printc_err("Cannot dup2 uuid_test\n");             fclose(file);             exit(2);         }         fflush(stdout);         fclose(file);         execlp("/usr/bin/uuidgen", "", "-r", (char *)0);     }     int status, i, j;     FILE *file;     char uuid ;     uint8_t uuid_2 , hex ;     waitpid(pid, status, 0);     if ((file = fopen(UUID_TEST, "r+")) == NULL) {         printc_err("Cannot open uuid_test.\n");         goto END;     }     fread(uuid, 36, 1, file);     fclose(file);     uuid = '\0';     printc("== uuid: %s\n", uuid);     for (i = 0, j = 0; i 37; i++) {         if (uuid == '-')             continue;         if (uuid = '0' uuid = '9') {             uuid_2 = uuid - '0';             continue;         }         if (uuid = 'a' uuid = 'f') {             uuid_2 = uuid - 'a' + 10;             continue;         }     }     for (i = 0; i 16; i++)         hex = uuid_2 * 16 + uuid_2 ;     if (device_writemem(0xF000, hex, 16) 0)     printc_err("== device_writemem error.\n"); END:     if (device_ctl(DEVICE_CTL_RESET) 0)         printc_err("warning: PRog: "             "failed to reset after programming\n");     unmark_modified(MODIFY_SYMS);     return 0; } 这一段看着挺复杂,其实功能很简单: 首先使用子进程调用execlp,从而执行uuidgen,在此过程中使用dup2将子进程的输出重定向到文件uuid_test; 然后将uuid_test的内容读到数组中; 接着将数组的ascii码转换成hex数据; 最后调用device_writemem,将数据写入0xf000地址处,即flash的segment0起始位置。 这段程序有很多可以优化的地方,目前就是顺溜下来实现功能,以后再优化(maybe never)。 原谅俺停留在《UNIX环境高级编程》第十章信号的编程水平~(线程、管道和网络,还不知何年何月再相约,先搞搞单片机^_^) Step 3:编译并运行: # mspdebug-new -j uif -d /dev/ttyUSB4 (mspdebug) reset (mspdebug) prog hexout Erasing... Programming... Writing 1756 bytes at 1100 ... Writing   74 bytes at 17dc ... Writing   32 bytes at ffe0 ... Done, 1862 bytes total == child: fopen uuid_test == child: dup2 uuid_test STDOUT_FILENO == uuid: a5747abb-8d99-4590-a71d-a42bea494570 == hex: a5 74 7a bb 8d 99 45 90 a7 1d a4 2b ea 49 45 70 (mspdebug) md 0xf000     0f000: a5 74 7a bb 8d 99 45 90 a7 1d a4 2b ea 49 45 70 |.tz...E....+.IEp|     0f010: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|     0f020: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|     0f030: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| (mspdebug) 每执行一次prog,都会调用一次uuidgen,这样即使在批量烧写的时候也可以方便的更改唯一序列号啦! 开源的魅力远远不仅如此,喜欢DIY的你,值得拥有^_^
相关资源