目录

用现有的资源,去实现本应该用更多资源来实现的需求,是一件很有意思的事情。不是说提倡这样使用,而是换一种思路解决问题比较新奇,或是在很多限制既定的情况下可以应急。

比如说,582m芯片,默认用32位计算,而无符号32位二进制数据,最多可以存放的十进制数为4,294,967,295,是个4开头的10位十进制数,若要存放11位数,最好能支持64位运算,直接转换就好了。那么如何将11位的手机号转换为2个32位的无符号二进制32_L和32_H存放呢。582m芯片支持64位运算,配置见上一篇博客。如果想节省使用64位库的flash和ram的开销,只好用32位计算去实现。先提供一个思路,C代码等有时间了再补上。

总体思路:手机号码可以视作1开头的11位数,那么用无符号32位二进制数的最大值,“预处理”一下手机号码,看看能分出去几个4,294,967,296,剩下的数就好用32位计算了。

字符串转换十进制数过程先省略,视作十进制数。比如说如数手机号码为字符串“12,811,111,111”,先“预处理”一下,能减掉2个4,294,967,296,就知道32_H的数值应该是2了。

要是能算12,811,111,111 - 2 * 4,294,967,296 = 4,221,176,521 < 4,294,967,296,岂不是得用64位机?

观察一下4,294,967,296这个数据,离4,300,000,000很近,差值为5,032,704,那么可以用4,300,000,000去“预处理”。这个过程中注意“预处理”时,4,300,000,000的倍数与实际值间差值较小时的问题,会在下文提出分析。

预先设置两个字符串,“12,884,901,888” (4,294,967,296 * 3 = 12,884,901,888)和“17,179,869,184”(4,294,967,296 * 4 = 17,179,869,184),以帮助我们划分32_L与32_H的界限。

输入一串1开头的11位的字符串,可以从十进制的从高到低,即字符串首地址偏移的从小到大,按字符值逐个比较,可以帮助判断32_H的值。

比如说对于字符串“12,811,111,111”,从十进制的高位到低位,逐个字符比较,发现前三个数是相等的,第四个数 '1' < '8',故判断为小于3倍的4,294,967,296,可以先转换前3位为十进制数128,128 - 2 * 43 = 42 < 43 ,这个表达式可以由32位机处理。再把"42"放回字符串,得到“4,211,111,111”,再转换十进制,加上用4,300,000,000“预处理”时的差值2 * 5,032,704 = 4,221,176,519,这个数就在32位机处理范围内了,可以转换成32位二进制数作为32_L。

但是对于字符串“12,899,999,999”,比对一下高几位,发现大于3倍的4,294,967,296,“预处理”时发现128 - 3 * 43为负数,不够减的。那么这个时候需要再处理一下,发现大于3倍的4,294,967,296时,32_H值为3没问题,还需要判断一下前三位是不是小于3 * 43,若小于,则直接忽略高三位,用99,999,999 - 84,901,888 = 15,098,111,这个值作为32_L。

不仅仅是软件程序方面,软硬件结合也能实现另辟蹊径。比如说,用582模拟一个USB设备,并在如何在使用BLE低功耗时,及时切换到USB设备,完成USB主机对设备的枚举。

先说明一下为什么BLE和USB同时使用会出问题。BLE是通过不断地休眠唤醒来实现低功耗的,而USB需要常供电。如果接入芯片模拟的USB设备时,芯片正处于休眠状态,没有及时响应主机,则会被主机判断为设备有问题而被挂起。这也是为什么默认的BLE_USB例程中是不开启HAL_SLEEP的,开了就会由协议栈进管理休眠,休眠时接入USB设备会出问题。

另一方面,TMOS从休眠到唤醒,有两个方法,一个是RTC定时,由TMOS内部处理,到时间后唤醒;另一个是GPIO中断唤醒,在中断中置位一个标志,根据标志位来开TMOS任务。582的BLE是基于TMOS系统跑的,TMOS不是抢占机制而是轮询机制,不具备中断能力,所以需要借用芯片本身的中断系统。

USB-A口中通常有VCC、GND、D+和D-,其实还有一处可以利用——外壳脚。

一般来讲,USB接口的外壳,会在PCB板上接地,以增强抗干扰能力和稳固性。但其实USB对外壳接地抗干扰的要求也没那么死,只是接上更好。按常规推测,USB母口那边与主机电路板的GND相连,故我们可以将模拟USB设备的A口外壳引脚,连到GPIO唤醒引脚上,设置低电平触发或者下降沿触发,以作为USB接入的识别条件。GPIO口一旦检测到接入,就准备好进行设备枚举。

32位机转化11位手机号以及BLE与USB的切换的更多相关文章

  1. c# 32位机和64位机 读取Excel内容到DataSet

    // ----------------------32位机 //注释说明 //ExclePath 为Excel路径 批号 是指Excel文件中某一列必填项 public static DataSet ...

  2. 32位机和64位机下面各类型sizeof的大小

    ---<这种类型的题目出的太多了,还是整理下吧!>--- 一.机器平台:X86_64 处理器 操作系统:Red Hat 4.1.2-14 编译器: gcc version 4.1.2 20 ...

  3. SQLServer生成三位姓名及11位国内电话号码(生成测试数据用)

    SELECT SUBSTRING(N'王李张刘陈杨黄赵吴周徐孙马朱胡郭何高林郑谢罗梁宋唐许韩冯邓曹彭曾肖田董袁潘于蒋蔡余杜叶程苏魏吕丁任沈姚卢姜崔钟谭陆汪范金石廖贾夏韦付方白邹孟熊秦邱江尹薛闫段雷侯龙 ...

  4. 最新手机号正则表达式 java 、javascript版正则表达式验证是否为11位有效手机号码

    最近在做注册登陆页面,都要涉及到验证11位有效手机号码,这里贴出代码,希望能帮到有这个开发需求的朋友. function isPoneAvailable($poneInput) { var myreg ...

  5. 转--Python re模块 验证11位手机号

      一.常用正则表达式符号和语法:   '.' 匹配所有字符串,除\n以外 ‘-’ 表示范围[0-9] '*' 匹配前面的子表达式零次或多次.要匹配 * 字符,请使用 \*. '+' 匹配前面的子表达 ...

  6. EditText格式化11位手机号输入xxx xxxx xxxx

    EditText格式化11位手机号输入xxx xxxx xxxx  /**     * 格式化11位手机号码输入 xxx xxxx xxxx格式     * 如果一直是添加:输入到第三个或第8个数字时 ...

  7. 32位机,CPU是如何利用段寄存器寻址的

    转自:http://blog.sina.com.cn/s/blog_640531380100xa15.html 32位cpu 地址线扩展成了32位,这和数据线的宽度是一致的.因此,在32位机里其实并不 ...

  8. Python基础-random模块及随机生成11位手机号

    import random # print(random.random()) # 随机浮点数,默认取0-1,不能指定范围# print(random.randint(1, 20)) # 随机整数,顾头 ...

  9. C# 32位程序访问64位系统注册表

    原文:C# 32位程序访问64位系统注册表 我的上一篇文章已经阐述了“32位程序和64位程序在64位平台上读\写注册表的区别”,那么接下来将要回答上篇所留下来的一个问题:32位程序如何访问64位系统注 ...

  10. Win7下64位机安装SQL2000

    win7下64位机安装SQLSERVER20001.右击计算机属性,查看操作系统 2.打开安装文件夹,按图点击 3.开始安装 4. 下一步选择 安装SQL Server2000 组件 5. 下一步 选 ...

随机推荐

  1. VUE上传表格文件发送后端,后端解析以及上传文件,前端进行解析的实现方法

    首先来说前端上传表格,然后利用纯前端技术进行解析表格的办法 详细步骤----请点击这里 接下来来说上传发送给后端的代码实现 html <input ref="myInput" ...

  2. vue修改内容点击显示隐藏内容不自动刷新问题

    今天遇到一个在card组件中点击显示隐藏的问题,修改了动态绑定的值,但是组件内容没有刷新,但是偶而其他元素修改导致页面动态刷新又刷新了,就猜想修改这个数组中一个对象的值并没有引起vue的动态刷新 解决 ...

  3. Linux实时同步

    实时同步 一.概述 背景: 以前,通过rsync+定时任务实现对文件的定时备份/同步 现在,对于NFS来说,需要进行实时同步 选择: 分布式存储 使用实时同步服务+NFS 选择公有云对象存储OSS,七 ...

  4. Asp.Net Core中利用过滤器控制Nginx的缓存时间

    前言 Web项目中很多网页资源比如html.js.css通常会做服务器端的缓存,加快网页的加载速度 一些周期性变化的API数据也可以做缓存,例如广告资源位数据,菜单数据,商品类目数据,商品详情数据,商 ...

  5. Linux上安装jdk Tomcat mysql redis等

    1.安装JDk  1.1这里使用xshell中xfxp进行文件的上传,将jdk二进制包上传到Linux服务器上 下载地址:https://www.oracle.com/java/technologie ...

  6. wsl 网络探究

    省流:wsl2能否固定ip地址? - 豆腐干的回答 - 知乎 https://www.zhihu.com/question/387747506/answer/2764445888 割--------- ...

  7. TypeScript 学习笔记 — 看官方文档

    TYPESCRITP OF GEEK NOTE 以后会更新这个完整度,和理解度,目前这个还不够 ts官方推荐使用let来替代 var ts 支持 js语法 声明变量 let temp:string = ...

  8. P27_wxss - 全局样式和局部样式

    全局样式 定义在 app.wxss 中的样式为全局样式,作用于每一个页面. 局部样式 在页面的 .wxss 文件中定义的样式为局部样式,只作用于当前页面. 注意: 当局部样式和全局样式冲突时,根据就近 ...

  9. 如何在Net6.0里配置多版本支持并支持注释说明的Swagger

    一.前言 现在已经进入了微服务的开发时代了,在这个时代,如果有人问你什么是微服务,你说不知道,就有点太丢人了,别人会有异样的眼光看你,俗话说:唾液淹死人.没办法,我们只能去学习新的东西.一提到微服务, ...

  10. Mybatis 实体类驼峰命名与数据库字段之间映射

    数据库的命名规则和 Java 的命名规则不一致,导致实体类与数据库字段不能完美映射. 一.可以在 mapper.xml 中通过 resultMap 来解决: <resultMap id=&quo ...