自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 蓝牙MCU开发之旅:不后悔踏进这个深坑

去年年初的时候,由于公司的大神离开了,小公司没有冗余的人员,一下子没有能做固件的人了。恰逢我司的app逐渐转移到米家的插件上去了,在美女领导一番蛊惑下,无知的我踏入了固件开发这个深坑。 前些日子因为一些原因险些不得不离职,因为公司目前只有我一个人熟悉蓝牙芯片的固件开发,会导致很多项目delay。后来想了想,决定将自己这一年来从android转mcu开发的经验写一写...

2019-08-04 18:32:14 4572 8

原创 快速部署一个简易的环温监测网络(BLE+MQTT+HTTP)

来新公司几个月了,发现有一个困扰的点是,货架上的机器对环境温度还比较敏感,然后机器本身散热也挺严重,导致货架上部分机器受到高温干扰无法正常运行。 因为我在秒测时主要就是做的测温这一块儿,所以提了个主意,想要在货架上部署温度传感器,然后通过物联网网关集成数据,我们就可以随时监测当前的机器处在什么温度下。领导雷厉风行,觉得对研发有一定的帮助,直接拍板了。 想法有了,就去找了一下,发现了有很多专用的物联网服务器,比如mosquitto之类的。再加上蓝牙网关,初步想法基...............

2022-06-19 23:18:04 1434 1

原创 工作、人生...随想

前几天发生了几件事情。第一个事儿。一个合作方(外包员工)的同事,把私人电脑带到了办公室工位上,并且从工作电脑上抄录了一些内容,被我注意到了。 OPPO对于信息安全的管控非常重视。员工手册中,是明确规定,不允许将私人电脑带到工作场所的,这种行为属于信息安全违规,尤其是,他还抄录了工作相关的资料。如果是正编同事被抓到,这种最低是要扣绩效分的。按照信息安全的相关规定,我应该上报这一情况。但是我之前瞟了一眼,他抄录的东西是VScode的一些对......

2021-10-30 18:26:23 299

原创 ADC的相关知识整理

最近发生了多起电子表退货的事件,拿回来之后发现是电池没电了,从购买日期算起,已经多数使用超过一年了,符合产品标准。但是由于当初硬件同学定下的最低电压数值太低了,导致在没有达到这个电压的时候就带不动了。这里调整电压后,领导让整理一下ad相关的知识,做个ppt。我这个做软件的电路文盲,为了整理这些东西,我查询了数十篇网上的教程,然后翻阅了包括电子表、体温计和智能日历的PCB原理图以及对应平台的datasheet,前后请教了包括我牛逼上天的亲哥、我们牛逼上天的硬件总监以及Nordic的工程师好友。搞出来之...

2020-08-22 17:04:49 6280 5

原创 Nordic使用SAADC实现超高精度体温采集

2019年下半年,打磨了将近四个月的体温计终于在米家上线了,上线后恰逢疫情,销量非常可观,也算是没有辜负当时的呕心沥血。记得当时除了软件之外,主要的问题点包括以下几点: 1.基于产品的硬件电路设计,LED亮度受到了电流尖峰的影响,导致屏幕在亮屏的时候闪烁,甚至电压尖峰过大的时候,段码也会闪烁。然后导致闪烁的地方有包括广播的时候会产生非常大的尖峰电流,saadc采集的时候也会产生较大的电压波动,然后我们的体温计还采用了主从设计,会扫描我们的另一个电子表产品用于将体温发送到那个产品上显示,扫描...

2020-08-22 15:43:12 973 1

原创 点阵墨水屏的使用以及图像预处理

我们电子日历的产品,屏幕分辨率为480*648,使用的是单色位图,只有黑白两色,每个位都能表示一个像素点。所以对于这个屏幕而言,要显示一整幅图,需要的字节数为 480*648/8。然后,由于屏幕需要的只是像素点,所以不能直接将一个位图数据写进去,需要预先转换一下。 ...

2020-06-22 22:20:35 3226 4

原创 简易异步timer、一个基本的程序运行框架和中断处理程序

此文有重大BUG,稍后有空了更新 -_-|| 12月20日已修复所有已知问题。 一般的情况下,低功耗蓝牙芯片由于要保持低功耗工作,本身会提供一种轻度休眠模式,在这种模式下保持内核时钟继续运行以定期进行广播或交换连接数据。SDK中一般都会提供一个基于BLE内核时钟的timer,这个timer在CPU轻度休眠的时候,仍然可以继续工作,功能非常强大。但是在非BLE的CP...

2019-10-03 22:41:17 798

原创 Dialog OTA方案梳理以及小包传输改造

Dialog 14585 OTA采用双备份方案,对外接口以一个单独的Service(0xF5FE,不使用他们的手机app进行OTA的话,也可以改为自己定义的UUID)嵌入到用户的应用中。 如下图中,整个OTA方案包含一个ProductHeader和2个Image,每个image中又有一个ImageHeader,用来存储image信息,其中ProductHeader...

2019-09-15 14:54:51 1171

原创 针对ARM处理器的C语言优化

这是一篇读书笔记:《ARM嵌入式系统开发——软件设计与优化》稍后记得将前边贴出的代码照此规则处理一遍!数据类型优化:1.局部变量类型尽量申明为32位甚至是64位,来避免寄存器(32位)装载数据时进行位扩展,并减少编译器可能增加的边界检查代码;2.访问数组的时候,尽量使用指针增量而不是数组下标(避免产生额外的指令);3.函数的参数和返回值使用int类型(而不是8位或者16位)更有效,避...

2019-09-03 19:31:25 417

原创 生成Nordic DFU升级ZIP包和混合HEX烧录包以及使用python脚本实现自动打包

Nordic的大部分蓝牙芯片,其打包方式都是差不多的,这里贴出我整理好的打zip升级包和hex混合烧录包的步骤,主要使用Nordic官方的打包工具nrfutil。打包的时候,有几个重要的东西,包括private key,bootloader等需要先准备好。 nrfutil的所有合法的命令和参数都可以通过“nrfutil pkg generate --help”命令...

2019-08-29 17:26:38 1528 1

原创 二分法遍历 flash

Dialog的sdk没有提供类似fds的这种文件操作系统,DA14585 的话基本上也用不着。目前原生的dialog sdk中,仅提供了一个叫做 spi_flash的库函数,用于基本的flash操作。我在我们的一个产品中,设计数据存储结构的时候,分配了50页(50*4096Byte)用来存储不间断实时记录的温度数据,当存储的数据量超过50页的记录上限后,就会擦除第一页,在这一页继续...

2019-08-29 14:32:44 568 1

原创 记一次有趣的LED闪屏消除及模拟PWM降低尖峰电流

我们的体温计项目中,显示屏上边有背光可以点亮。硬件的同事在设计的时候,最开始是直接将led接到了回路上。当电压变化的时候,会导致led的亮度跟随变化。我们的产品上使用的电池是1620,驱动能力不足,当时用saadc采集温度或者广播、扫描等操作的时候,都会产生较大的电流,使电路上出现无法忽视的压降,于是led也不停的闪烁~ 出于成本上的考虑,硬件最初不同意做任...

2019-08-22 19:56:54 1025 1

原创 Nordic的sdk中,使用app_scheduler执行蓝牙回调中的异步任务

刚接触的时候,碰到了一个问题,就是我们的某个蓝牙接口允许用户写入一些配置,然后我会将这些配置写到flash中保存起来。很简单的操作结果出错了,fds操作没有任何回调,问题在哪儿呢? 我以为是fds的操作有问题,写了测试代码,结果测试代码跑的好好的,有回调!问题很明显,必然是执行的上下文环境有问题。 前边研究fds的源码中有提到,使用fds,初始化操...

2019-08-18 11:13:57 1634

原创 使用宏来简化在Nordic 的sdk中添加蓝牙Service和attribute

Nordic的SDK做的很好,但是他们一副生怕有什么地方做的不到位一样, 很多简单的功能代码却写的很复杂,如果是java还好,但是C语言实现起来,很多地方的代码读起来特别费劲。我在添加自己的服务的时候,没有仿照他们的示例格式去定义,而是重新处理了一下,由于复用了大量的代码,比示例程序更容易理解和阅读。 核心代码使用两个宏来定义,一个是向Service添加attri...

2019-08-12 16:56:54 1109 2

原创 Nordic fds 文件系统源码探究

项目中使用到了flash,而Nordic为操作flash准备了很丰富的工具,包括fstorage 和fds,两者都是异步返回真实操作结果的,其中fds依赖于fstorage,是一个简单易用的文件系统。 使用fds之前一般都需要初始化一下,包括使用 fds_register 函数来注册一个事件回调,用来获得异步操作的结果。然后还需要使用 fds_init 函...

2019-08-08 20:04:46 2032 1

原创 Dialog 14585 广播中设备名称的问题

有一段日子,发现电子表的蓝牙广播中无法识别出设备名称了。后来经过烧脑的调试,发现原来是设备名称重复添加了。因为我们使用了米家的sdk,然后米家的sdk部分代码照抄了原厂的sdk,又没有做好兼容工作。在使用米家sdk设置或者修改广播数据的时候,需要同时提供adv_data和scan_resp_data,然后我往scan_resp_data中添加了我们的设备名称,然后就不广播了,因为原厂的s...

2019-08-04 20:17:52 785

原创 传输notification的一些问题

目前大部分BLE芯片都支持BLE 4.2 协议,默认情况下,不论是read/write 还是notify等操作每次传输最长不超过23个字节,其中有三个字节是头,所以有效的容量是20个字节。 对于Dialog14585而言,通过修改max_mtu可以使最大长度达到247字节(蓝牙4.2 为247,蓝牙5.0为 512),但是传输的数据多了,相应的传输每个包所需要的时...

2019-08-04 19:47:33 794

原创 Dialog SDK中app_easy_timer的大坑

我们的电子表产品有一个墨水屏,整个系统使用Dialog14585芯片来驱动,每秒都会尝试刷新屏幕。墨水屏有一个特点是,就算是断电了,屏幕还是能正常显示出内容的。中间有几次发现,屏幕彻底不动了,看起来是程序死机了,但是蓝牙仍然正常工作,说明没有死机。 开始找问题。我设计的应用架构,是通过一个全局的timer来驱动各种测温湿度、刷新屏幕、存储数据和更新广播内容等逻辑的...

2019-08-04 19:26:07 1355

原创 android 事件分发

这篇文章是针对 Carson_Ho 的文做的笔记和总结,原文地址:https://www.jianshu.com/p/38015afcdb58 。   几个基本要点:    1,分发的是什么?Touch事件。    2,分发的顺序:Activity -->ViewGroup -->View。    3,三个关键方法:dispatchTouchEvent,onInterceptTouch...

2018-06-05 20:37:16 240

原创 Handler的问题总结

    某个线程使用Handler的前提是该线程绑定了一个Looper,android UI主线程已经绑定过Looper所以无需再绑定,如果要在某个子线程中使用Handler,则需要使用 Looper.prepare()方法初始化一个Looper对象,该方法中通过一个ThreadLocal 对象使当前线程绑定了new出来的Looper对象。    Looper的构造方法中,会初始化一个Messag...

2018-05-08 19:05:01 280

原创 Android自定义自由样式日历控件CaleandarView

    我们在一款关爱女性健康的app里边,有用到自定义日历的需要,最后的实现如下:    因为要在一个listview里边显示日历,最多的时候,一屏幕会显示3个月,这样的话, 如果采用网上流行的堆叠大量子view的方式实现(每一天都是一个子view),会导致性能严重下降甚至卡顿,因此这里思考采用一个画布将一整个月都整体绘制出来的方案。    然后,由于每一天的样式可能有很多个,月经期是红色实心圆...

2018-04-26 20:33:46 1437

原创 Lock锁中lock()与tryLock()的区别,生产者消费者模式

    整理了一个简单的生产者与消费者demo,中间意外的各种出现 IllegalMonitorStateException 异常,看了好半天才发现问题不在于逻辑,而是由于一个错误的方法使用。    在ReentrantLock 中,lock()方法是一个无条件的锁,与synchronize意思差不多,但是另一个方法 tryLock()方法只有在成功获取了锁的情况下才会返回true,如果别的线程当...

2018-04-12 23:45:54 24527

原创 android自定义圆形日期选择轮盘

开新项目了,一款适用于女性用户的app。其中有一个页面含有一个时间选择器,设计师爸爸给的design是这样的:图中左下角的文字部分先不管,轮盘部分为选择器,通过左右上下滑动来滚动,圆周上的点分别代表女性经期中的四个状态:经期、安全期、易孕期、排卵日。这四个状态分别使用不同颜色的小圆来表示,空心圆表示预测将来的经期,因此总共有5套样式。圆盘45度角的位置上面那颗稍微大一些的圆表示选中的...

2017-10-23 22:15:46 2381

原创 android在oncreate()方法中获取view的宽高width,height

在android的oncreate方法中,直接获取view的width,height等信息会返回0,因为oncreate方法仅仅是使用LayoutInflater解析XML并将其填充到ContentView中,填充过程只包括创建view,不包括设置视图的大小。 实际上,可以使用view的post方法解决这个问题。

2017-06-13 16:29:35 518

原创 android自定义层级view,扑克牌堆叠效果,cascadeLayout

需要自定义一个组件CascadeLayout,让子view可以像拿扑克牌那样的层叠起来,主要实现效果:                                                     为了设置子view之前的偏移距离,这里需要定义子view相对于上一张卡片的的左边距,上边距。然后每张卡片也可以单独的设置自己需要的边距。这个边距和不是指的内边距(paddi

2017-06-13 13:58:16 2398

原创 Zbar扫码优化

项目中有用到二维码扫描的功能,集成zbar后,一切看起来都挺好的,功能都好使,直到使用乐固进行了加固。加固后的表现简直令人难受,扫描动画几乎停滞,整个界面卡的看起来和使用20kB的网速观看高清视频一样,点击按钮和返回键甚至都没反应或者过了很久才反应。很明显,主线程时间被大幅度占用了。开始怀疑是加固方有问题,就换用了几个其他的加固方案,比如360加固,发现表现都差不多。然后直接联系乐固的客服

2017-04-06 15:17:42 5971 1

原创 LayoutInflater的inflate()方法参数问题

加载一个layout的时候,LayoutInflater提供了以下两个方法:LayoutInflater.inflate(int layoutRes,ViewGroup parent);LayoutInflater.inflate(int layoutRes,ViewGroup parent,booelan attachToRoot);以前经常使用第一个方法,且习惯将parent参数填

2017-04-06 15:10:00 500

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除