打印
[技术问答]

赛元单片机的UID在哪里?

[复制链接]
1609|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hayden0|  楼主 | 2019-9-28 12:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
taobaofarmer| | 2019-9-29 13:57 | 只看该作者
赛元MCU就没有这个,我的办法是产生4个随机数,按这4个地址在CODE区里找到4个字节的数据作为UID,这样也可以,跟自带的UNIQUE ID效果一样

使用特权

评论回复
板凳
hayden0|  楼主 | 2019-9-29 14:36 | 只看该作者
taobaofarmer 发表于 2019-9-29 13:57
赛元MCU就没有这个,我的办法是产生4个随机数,按这4个地址在CODE区里找到4个字节的数据作为UID,这样也可 ...

请问你随机数的种子是什么?

使用特权

评论回复
地板
taobaofarmer| | 2019-9-29 15:06 | 只看该作者
不需要种子呀

使用特权

评论回复
5
赛元MCU3| | 2019-9-29 15:51 | 只看该作者
赛元MCU,前256B禁止MOVC操作,可用于程序加密。加密方式可见92系列MCU应用指南,或工具使用手册

使用特权

评论回复
6
hayden0|  楼主 | 2019-9-30 17:35 | 只看该作者

不需要种子?用的什么高级方法,没听说过呀?

使用特权

评论回复
7
taobaofarmer| | 2019-10-2 20:41 | 只看该作者
就用标准C函数产生一个随机数,还需要什么种子?

使用特权

评论回复
8
hayden0|  楼主 | 2019-10-2 23:22 | 只看该作者
算了,看来你根本不知道这回事。
rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。关于随机数种子请参考srand()。

使用特权

评论回复
9
taobaofarmer| | 2019-10-7 13:55 | 只看该作者
楼上高人,今天我又学习了,搞了22年嵌入式开发今天终于又被学习了一回,RAND()之前确实没用过,也没啥用,所以一直没去了解它,刚刚百度了下SRAND(),确实有种子这回事儿,我之前的架构是在上位机软件里下发4个随机数给MCU,然后MCU把这4个随机数作为指针指向CODE区里相应位置的数据返回给上位机软件,作为MCU的UNIQUE ID,然后进行加密算法乱七八糟的一顿计算,现在看来还真得修改下上位机软件,每次rand()之前重新设置下种子,百度上介绍的经验是取当时的时间,这个方法不错,我就准备这么做了

使用特权

评论回复
10
hayden0|  楼主 | 2019-10-7 20:52 | 只看该作者
taobaofarmer 发表于 2019-10-7 13:55
楼上高人,今天我又学习了,搞了22年嵌入式开发今天终于又被学习了一回,RAND()之前确实没用过,也没啥用, ...

不是什么高人,C语言课本里好像就有介绍,估计你是时间长不用,所以忘了。
对于随机数我记得rand这类函数都是通过线性同余法得到伪随机数,一般种子可以选
1、时间,如定时器值
2、AD采集温度或电源噪声
3、UID
4、搭建硬件电路产生种子

种子是随机数的重点。
也有单片机自带随机数发生器的,那就比较方便了,比如STM32F4自带了硬件随机数发生器(RNG)!

使用特权

评论回复
11
taobaofarmer| | 2019-10-12 13:46 | 只看该作者
仔细研究了下种子的问题,确实是重中之重,一顿折腾之后我在VC++6.0里实现如下:
        BYTE  m;
        WORD  i, crc16;
        DWORD rand_data[4], dwBuf0, dwBuf1, dwBuf2;

        SYSTEMTIME sysTime;
        GetLocalTime(&sysTime);

        i = sysTime.wYear      +
                sysTime.wMonth     +
                sysTime.wDay       +
                sysTime.wDayOfWeek +
                sysTime.wHour      +
                sysTime.wMinute    +
                sysTime.wSecond    +
                sysTime.wMilliseconds;
       
        dwBuf0   = ~i;
        dwBuf0 <<= 16;
        dwBuf0  += i;

        for(m=0; m<4; m++)
        {
                //循环右移5位后的数据作为下一个随机数的种子
                dwBuf1  = dwBuf0 << 27;
                dwBuf1 &= 0xfe000000;

                dwBuf2  = dwBuf0 >> 5;
                dwBuf2 &= 0x01ffffff;

                dwBuf0  = dwBuf1 + dwBuf2;
               
                dwBuf0  = ~dwBuf0;
                dwBuf0 ^=  0xxxxxxxxx;
       
                srand(dwBuf0);
                rand_data[m] = rand();
        }
你觉得这个效果如何?

使用特权

评论回复
12
hayden0|  楼主 | 2019-10-12 17:15 | 只看该作者
taobaofarmer 发表于 2019-10-12 13:46
仔细研究了下种子的问题,确实是重中之重,一顿折腾之后我在VC++6.0里实现如下:
        BYTE  m;
        WORD   ...

如果实在电脑上,种子用时间CRC校验值做种子最方便,如果是单片机你这种移位处理是最常用的

使用特权

评论回复
13
taobaofarmer| | 2019-10-17 18:07 | 只看该作者
常用的CRC算法有哪些

使用特权

评论回复
14
单模先声| | 2020-3-16 09:00 | 只看该作者
想多了吧,就你这样的程序,谁会去**?人家是看到好的产品,不容易实现的才会去**,你的就算贴源码在产品上都没人看一眼

使用特权

评论回复
15
taobaofarmer| | 2020-3-16 10:49 | 只看该作者
葡萄确实有点儿酸

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

284

帖子

3

粉丝