32位机转化11位手机号以及BLE与USB的切换
用现有的资源,去实现本应该用更多资源来实现的需求,是一件很有意思的事情。不是说提倡这样使用,而是换一种思路解决问题比较新奇,或是在很多限制既定的情况下可以应急。
比如说,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的切换的更多相关文章
- c# 32位机和64位机 读取Excel内容到DataSet
// ----------------------32位机 //注释说明 //ExclePath 为Excel路径 批号 是指Excel文件中某一列必填项 public static DataSet ...
- 32位机和64位机下面各类型sizeof的大小
---<这种类型的题目出的太多了,还是整理下吧!>--- 一.机器平台:X86_64 处理器 操作系统:Red Hat 4.1.2-14 编译器: gcc version 4.1.2 20 ...
- SQLServer生成三位姓名及11位国内电话号码(生成测试数据用)
SELECT SUBSTRING(N'王李张刘陈杨黄赵吴周徐孙马朱胡郭何高林郑谢罗梁宋唐许韩冯邓曹彭曾肖田董袁潘于蒋蔡余杜叶程苏魏吕丁任沈姚卢姜崔钟谭陆汪范金石廖贾夏韦付方白邹孟熊秦邱江尹薛闫段雷侯龙 ...
- 最新手机号正则表达式 java 、javascript版正则表达式验证是否为11位有效手机号码
最近在做注册登陆页面,都要涉及到验证11位有效手机号码,这里贴出代码,希望能帮到有这个开发需求的朋友. function isPoneAvailable($poneInput) { var myreg ...
- 转--Python re模块 验证11位手机号
一.常用正则表达式符号和语法: '.' 匹配所有字符串,除\n以外 ‘-’ 表示范围[0-9] '*' 匹配前面的子表达式零次或多次.要匹配 * 字符,请使用 \*. '+' 匹配前面的子表达 ...
- EditText格式化11位手机号输入xxx xxxx xxxx
EditText格式化11位手机号输入xxx xxxx xxxx /** * 格式化11位手机号码输入 xxx xxxx xxxx格式 * 如果一直是添加:输入到第三个或第8个数字时 ...
- 32位机,CPU是如何利用段寄存器寻址的
转自:http://blog.sina.com.cn/s/blog_640531380100xa15.html 32位cpu 地址线扩展成了32位,这和数据线的宽度是一致的.因此,在32位机里其实并不 ...
- Python基础-random模块及随机生成11位手机号
import random # print(random.random()) # 随机浮点数,默认取0-1,不能指定范围# print(random.randint(1, 20)) # 随机整数,顾头 ...
- C# 32位程序访问64位系统注册表
原文:C# 32位程序访问64位系统注册表 我的上一篇文章已经阐述了“32位程序和64位程序在64位平台上读\写注册表的区别”,那么接下来将要回答上篇所留下来的一个问题:32位程序如何访问64位系统注 ...
- Win7下64位机安装SQL2000
win7下64位机安装SQLSERVER20001.右击计算机属性,查看操作系统 2.打开安装文件夹,按图点击 3.开始安装 4. 下一步选择 安装SQL Server2000 组件 5. 下一步 选 ...
随机推荐
- Keepalived高可用集群部署
KeepAlived 目录 KeepAlived KeepAlived安装 KeepAlived部署 准备工作 主备模式 节点配置 验证 正常状态 故障 故障恢复 1+N(一主多备)模式 节点配置 验 ...
- jjq(友链:https://tg.hszxoj.com/user/475)
- Object类的toString方法-Object类的equas方法
Object类的toString方法 Object 是类层次结构的根(最顶层)类.每个类都是用 Object 作为超(父)类. 所有对象(包括数组) 都实现这个类的方法 Person类默认继承了Obj ...
- sync.Once 使用及解析
目录 前言 1. sync.Once 简介 2. sync.Once 源码解析 2.1 为什么 done 作为第一个字段 2.2 Do 方法的实现细节 2.3 其他重要细节 3. sync.Once ...
- 浅谈Pytest中的marker
浅谈Pytest中的marker 没有注册marker 我们写一个简单的测试 # test_demo.py import pytest @pytest.mark.login def test_demo ...
- FAQ os.system调用失效问题
os.system调用失效问题 背景 有个学员反馈allure无法生成报告 # 示例代码 import pytest,os def test_os(): pass if __name__ == '__ ...
- P13_协同工作_小程序权限管理的概念以及成员管理的两个方面
协同工作和发布 - 协同工作 了解权限管理需求 在中大型的公司里,人员的分工非常仔细:同一个小程序项目,一般会有不同岗位.不同角色的员工同时参与设计与开发. 此时出于管理需要,我们迫切需要对不同岗位. ...
- 学习Java Day18
一.面向对象(面向过程) 1. 面向对象 找对象(封装了过程)来干. 例如:洗衣服(洗衣机就是对象). 2. 面向对象思想特点 是一种更符合我们思想习惯的思想. 可以将复杂的事情简单化. 将我们从执行 ...
- 2021级《JAVA语言程序设计》上机考试试题3
ok,现在是学生的界面实现,因为代码上篇都给出来了,那个是打分卡里面要求全了的,然后service,servlet不全,嗯,刚刚忘说了,没写完,就写了那么多. 先注册: 代码如下: <%@ pa ...
- 【Vue】Vue开源样式库 Vuex的使用 vuex的执行流程 Vue-router的使用 路由跳转 路由守卫
目录 昨日回顾 纯净的Vue项目 今日内容 0 开源样式库 1 Vuex 的使用 1.1 vuex的执行流程图 Vuex的使用 购物车案例 2 Vue-router的使用 2.1 基本使用 2.2 路 ...