目录

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

比如说,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. Java自动装箱与拆箱

    装箱就是自动将基本数据类型转换为包装器类型(int-->Integer).调用方法:Integer的 valueOf(int) 方法 拆箱就是自动将包装器类型转换为基本数据类型(Integer- ...

  2. drf-day1——web应用模式、API接口、接口测试工具postman

    目录 学习资料 一.web 应用模式 二.API接口 API概念 三.接口测试工具postman postman介绍 postman下载与使用 四.如何在浏览器中测试 学习资料 # 个人博客:http ...

  3. MySQL软件安装教程(windows系统)

    目录 一.访问官网下载安装包 1.访问官网 2.点击DOWNLOADS 3.下拉页面,点击MySQL Community (GPL) Downloads » 4.接着点击MySQL Community ...

  4. appium之安卓7.0环境搭建

    appium 在安卓7.0的手机上运行上报错---------Failure [INSTALL_FAILED_ALREADY_EXISTS: Attempt to re-install io.appi ...

  5. springboot输出json日志

    <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-lo ...

  6. linux-基础及相关软件安装

    1.linux常见岗位 自动化运维.容器运维.DBA ps:会的越多给的就越多!!! """ IDC运维:机房运维员 不要做!!! """ ...

  7. drf-jwt源码分析以及自定义token签发认证、alc和rbac

    1.drf-jwt源码执行流程 1.1 签发(登录) 1.代码: urls.py: from rest_framework_jwt.views import obtain_jwt_token urlp ...

  8. SpringBoot+mybatis的驼峰命名转换不生效

    使用SpringBoote+mybatis在mybatis-config.xml的配置文件内配置的驼峰命名不生效 然后我就将mybatis的配置写在application.yml内,然后就生效了 用注 ...

  9. Vue33 使用nvm管理nodejs

    1 nvm简介 NVM:Node Version Manage,即Node的版本管理工具.使用NVM,可以按照nodejs,可以进行版本切换,可以卸载nodejs等等. 由于项目开发当中,不同的项目可 ...

  10. Vue过滤案例、按键修饰符、数据双向绑定

    目录 Vue过滤案例.按键修饰符.数据双向绑定 一.v-for能循环的类型 二.js的几种循环方式 三.key值的解释 四.数组.对象的检测与更新 五.input的几个事件 六.事件修饰符 七.按键修 ...