目录

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

比如说,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. Linux c 获取U盘挂载路径

    思路: 1.执行df -h 找到 带mnt的行.将结果存入一个文件中. system("df -h |grep mnt >./extendevinfo.txt"); 也可以直 ...

  2. 图文并茂--微信小程序,获取用户地理位置信息,并调用腾讯地图API来获取用户具体位置

    今天开始搞这个东西,下面是详细的记录 先看一下效果啦 1.小程序代码先获取用户基础位置信息 js data: { myLocation: 'GET LOCATION', }, openMap() { ...

  3. 为什么 Go 不支持 []T 转换为 []interface

    在 Go 中,如果 interface{} 作为函数参数的话,是可以传任意参数的,然后通过类型断言来转换. 举个例子: package main import "fmt" func ...

  4. 行为型模式 - 迭代器模式iterator

    模式的定义与特点 迭代器模式(iterator Pattern),为的提是可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象.多个对象聚在一起形成的总体称之为聚集,聚集对象是能够包容一组对象的容器对 ...

  5. Docker命令的自动补齐

    Docker命令的自动补齐 背景 在linux下输入命令或文件都是可以自动补齐的,这个特性极大的提高了我们的效率,多数情况下我们很少用命令参数的自动补齐. 但对docker git这类参数特别多的命令 ...

  6. concurrent.futures之ThreadPoolExecutor python线程池代码实现方法

    from concurrent.futures import ThreadPoolExecutor def main(i): print(i) THREAD_NUM = 20 # 线程数 with T ...

  7. XYplorer使用教程

    XYplorer使用教程 XYplorer是Windows的文件管理器.它具有标签式浏览,强大的文件搜索功能,多功能预览,高度可定制的界面,可选的双窗格以及一系列独特的方法,可以有效地自动执行频繁重复 ...

  8. redis服务创建失败:Could not create server TCP listening socket 127.0.0.1:6379: bind

    1. redis-cli.exe 2.shutdown 如果出现   (error) NOAUTH Authentication required.,则需要验证之前设置的密码(没出现请忽略第三步) 3 ...

  9. Windows必装软件,一个比一个好用

    前言 每次重装完系统,或者新换了电脑之后,你第一时间会安装哪些软件呢?那这次小卷就为大家带来18款电脑必备软件,它们共同的特点是绿色小巧无广告,而且在我看来,每一个同类型软件中最出类拔萃的,我就这么说 ...

  10. 图扑 Web SCADA 智慧制硅厂,打造新时代制硅工业

    前言 我国目前是全球最大的工业硅生产国.消费国和贸易国,且未来该产业的主要增量也将来源于我国.绿色低碳发展已成为全球大趋势和国际社会的共识,随着我国"双碳"目标的推进,光伏产业链快 ...