为mspdebug的prog命令添加烧写uuid序列号的功能

来源:本站
导读:目前正在解读《为mspdebug的prog命令添加烧写uuid序列号的功能》的相关信息,《为mspdebug的prog命令添加烧写uuid序列号的功能》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《为mspdebug的prog命令添加烧写uuid序列号的功能》的详细说明。
简介: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

安装库依赖:

[root@localhost msp430]# yum install readline

[root@localhost msp430]# yum install readline-devel

[root@localhost msp430]# yum install libusb

[root@localhost msp430]# yum install libusb-devel

编译源代码:

[maria@localhost msp430_workspace]$ tar xvf mspdebug-0.23.tar.gz

[maria@localhost msp430_workspace]$ cd mspdebug-0.23/

[maria@localhost msp430_workspace]$ make

创建软链接并在单片机代码目录运行它:

[root@localhost constant_current]# ln -s /home/maria/maria_work/msp430_workspace/mspdebug-0.23/mspdebug /usr/bin/mspdebug-new

[root@localhost constant_current]# mspdebug-new -j uif -d /dev/ttyUSB4

(它和运行mspdebug的效果是一样的。)

(ttyUSB4是仿真器FET430UIF对应的设备号。)

(这里就不要用make install了,从mspdebug源代码目录运行,不要覆盖原来的版本。)

Step 2:修改ui/devcmd.c文件:

#include

#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_testn");

if ((file = fopen(UUID_TEST, "w+")) == NULL) {

printc_err("Cannot open uuid_testn");

exit(1);

}

printc("==> child: dup2 uuid_test STDOUT_FILENOn");

if (dup2(fileno(file), STDOUT_FILENO) == -1) {

printc_err("Cannot dup2 uuid_testn");

fclose(file);

exit(2);

}

fflush(stdout);

fclose(file);

execlp("/usr/bin/uuidgen", "", "-r", (char *)0);

}

int status, i, j;

FILE *file;

char uuid[37];

uint8_t uuid_2[37], hex[16];

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[36] = '';

printc("==> uuid: %sn", uuid);

for (i = 0, j = 0; i < 37; i++) {

if (uuid[i] == '-')

continue;

if (uuid[i] >= '0' && uuid[i] <= '9') {

uuid_2[j++] = uuid[i] - '0';

continue;

}

if (uuid[i] >= 'a' && uuid[i] <= 'f') {

uuid_2[j++] = uuid[i] - 'a' + 10;

continue;

}

}

for (i = 0; i < 16; i++)

hex[i] = uuid_2[i * 2] * 16 + uuid_2[i * 2 + 1];

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 programmingn");

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:编译并运行:

[root@localhost constant_current]# mspdebug-new -j uif -d /dev/ttyUSB4

(mspdebug) reset

(mspdebug) prog hexout

Erasing...

Programming...

Writing 1756 bytes at 1100 [section: .text]...

Writing 74 bytes at 17dc [section: .rodata]...

Writing 32 bytes at ffe0 [section: .vectors]...

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的你,值得拥有^_^

提醒:《为mspdebug的prog命令添加烧写uuid序列号的功能》最后刷新时间 2024-03-14 01:08:20,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《为mspdebug的prog命令添加烧写uuid序列号的功能》该内容的真实性请自行鉴别。