背景简介:由于单片机上的RAM资源有限,而我们的物联终端时时刻刻都在采集数据,如果RAM中的数据未来得及发动到服务端(比如进入了信号盲区),我们就希望使用FLASH进行缓存,而FLASH缓存之后如何保证数据的有序性,以及不丢失,就需要在单片机中实现一个理论上无限长的消息队列

其中todo部[……]

阅读全文

背景介绍:在硬件产线检测中,需要自动化的读取硬件状态,并逐一判断硬件状态是否健康,如:

最近对于这个需求设计了一个DSL,如:

每次工厂产品下线检测只需要设置好对应的DSL脚本,便有产线上位机自动加载并解释执行,以及与硬件串口进行交互检测

[……]

阅读全文

之前自己实现了一些math库中的一些函数

在写exp函数时用的公式是:

exp-1

后来看了别人的实现, 比起我的版本, 每一次循环都少做一个乘法

就把别人的代码贴了进去, 把自己的注释起来了

当时没想过原理, 只简单用几个数字验证了下正确性

今天抽空写写画画算是搞明白了

公式还是相同的公式,[……]

阅读全文

最近自己实现了math.h中的一些函数, 目的还是为了熟悉一些原理性的知识, 虽然很多函数都有直接对应的硬件指令了…

#define LLMAX 0x7FFFFFFFFFFFFFFFLL
#define LLMIN 0X8000000000000000LL

typedef union[......]

阅读全文

一. 轮询

试想这样一种情形,  一个主线程中创建两个(多个)工作线程, 主线程需要等待一个或者多个工作线程执行结束.

比较直接的做法就是主线程中用一个循环, 每次都锁住和工作线程相同的一个互斥锁并检查是否有工作线程已经结束.

#include <stdio.h>
#inc[......]

阅读全文

前几天和一朋友聊到手机解锁, 朋友问我有没有想过手机pattern lock有多少种组合方式. 其实这个问题早就想过了, 以前感觉会有很多种特殊情况, 用程序解还不如用排列组合来得快

后来讨论了下, 就决定把问题简化: 只考虑4个点或4个点以上的情形, 并且包含下图这种路径的不算有效的组合方式
lock[……]

阅读全文

一. 最近邻插值

这是最简单的插值办法, 为了方便描述, 先考虑一维的情况:

最近邻插值将连续坐标x近似为最近的整数u0, 输出值g_out(x) = g_in(u0) , 其中u0 = round(x)

假设给定一个输入 123, 60, 255 长度为3, 那么每个点对应的坐标分别是0, 1[……]

阅读全文

一. 首先看看默认情况下是如何对齐

IA32:

无论数据是否对齐, IA32硬件都能正确工作, 不过, Intel还是建议要求对齐数据以提高存储器系统的性能. Linux沿用的对齐策略是, 2字节数据类型 (例如 short) 的地址必须是2的倍数, 而较大的数据类型 (例如 int, int *[……]

阅读全文

曾经一直好奇c编译器如何做的类型转换, 最近研究了几天, 有了个大概的了解, 这里做个总结:

一.整型间转换

整型间的转换比较简单, 如果字长变化, 只需进行扩展或者截断

这方面gcc和msvc编译器做法大同小异, 就不分开讨论了, 就以gcc为例

1. 扩展:

比如int8到int32的扩展,[……]

阅读全文

前段时间看了下glibc的一些string库函数实现

自己照猫画虎的写了几个函数测了测, 比起windows vc中自带的实现, 并没有更快, 反倒是慢了很多.

比如memset函数, 微软公开的vc crt中memset.c是以字节为单位循环的.  如果用glibc中操作块与循环展开[……]

阅读全文

近来打算阅读glibc源码, 便从最简单的string.h开始. 说道string库, 第一个想到的是什么函数? 当然是strlen

于是翻开strlen.c , 大牛写的代码就是不一样, 总像是故意把原本简单的东西写得复杂, 仔细阅读才发现简直是神作.

对任何c程序员来说以下代码可以说是信手拈[……]

阅读全文

这个问题一开始源于用vc编译一个utf8文件, 遇到了错误error C2001: 常量中有换行符

原本是个mingw下写的程序, gcc编译时没问题的, 后来网上搜了下, 说是因为vc对无bom的utf8文件支持不太好, 得加上bom才能正常编译
在vc上面测试以下代码

#include &lt[......]

阅读全文