## 【C语言深入】指针的一个错误赋值

struct I2C_CONFIG {
// ...
char *i2c_buff;
int length;
// ...
};

struct I2C_CONFIG cfg;
char *i2c_buff;

void I2C_init()
{
// ...
cfg.buff = i2c_buff;
cfg.length = sizeof(buff);
// ...
}

void I2C_send(new_buff)
{
// ...
i2c_buff = new_buff;
I2C_MasterTransferData(LPC_I2C1, cfg);
// ...
}


void I2C_send(new_buff)
{
// ...
i2c_buff = new_buff;
cfg.buff = i2c_buff;
I2C_MasterTransferData(LPC_I2C1, cfg);
// ...
}


## The Limitations of Classical PID Controller and Its Advanced Derivations

Since founded by N. Weiner in 1947, the control theory has been evolved for more than 60 years and is still full of challenges and opportunities. The most important principle of the control theory, in my opinion, is the feedback mechanism. Without feedback and closed-loop, almost no algorithm and control technique can be implied. The idea of feedback is that by comparing the reference input and the actual output, an error signal can be obtained and then can be used by the controller to trace and eliminate the difference between the input and the output. Apart from Watt’s steam engine, one could say that the first formally implication of (negative) feedback is the amplifier invented by H.S. Black. It is a genius idea when first came out in 1927 and was proved to be an extremely useful way to solve electronic and control problems. The idea of output feedback has also been extended to state feedback and error feedback to achieve state control and estimation in more advanced control techniques.

Classical control is the foundation of control theory and it is more concentrated on analysing the stability and performance of a controlled plant. However, only linear and SISO systems have been discussed in classical control theory. Although traditional control techniques such as PID controller are still widely used in industry, they cannot handle more complex engineering scenarios such as aerospace, chemistry and biology. Another problem of classical control is that all parameters are designed and tuned based on the current system model, in which case the system will be more vulnerable to further disturbance and parameters varying.

In order to solve these problems of classical PID controller which mentioned before, more advanced approaches have been derived nowadays. If using classical approach to control a MIMO system, one should divide the system into different modes and control each mode separately. However if the system inputs and outputs are coupled with each other, it cannot be decoupled and this method will not be practicable anymore. Here comes the state-space method, which solved the limitation of classical control by using state variables. The advantage of state-space is that it can be represented by matrices and such is very computer-friendly. State-space representation is actually defined in time domain instead of frequency domain and every state can have some extend of physical meaning which gives some clues about what is happening inside a controlled plant. One milestone which makes the state-space method more practicable is the invention of Kalman filter. Kalman filter uses a series of history measurements in the presence of noise to estimate the current state of the system. Kalman filter can work as a state estimator or simply a special filter which uses the physical system model to remove the process and the measurement noise.

Optimal control method such as MPC and LQR is another derivation of classical control. In most circumstances, there are more than one possible control inputs which can drive the system to work properly, but we need is to find the optimal one. Optimal control actually transforms the control problem into an optimal problem which tries to minimise an objective function to get the best outcome. Another advantage of optimal control is that it can take constraints into consideration. One defect of PID controller is that it cannot handle system constraints like actuator saturation or output limitation. In the optimal case control, design a controller with constraints could be feasible.

It is also known that no system is constant and some parameters are likely to vary with time or to the working condition. In classical control, the controller is designed just for the current system model and thus may loss performance or even be unstable due to the system change and uncertainties. In such aspect, adaptive control or robust control may be more applicable. Both adaptive control and robust control are designed to cope with uncertainties. The difference is that adaptive control identifies the system model and changes its parameters in real-time, but robust control fixed its parameters after deployed to the plant. For the truth that adaptive control has to calculate the system model every few periods, it needs much more computational time. What’s more, since the control parameters in the adaptive controller are changing every time, it may be difficult to prove its stability.  On the other hand, the gain of robust controller has already been designed before applied to the system, so it doesn’t need to do additional calculation during the operation. Since robust controller is globally optimised and especially designed to handle uncertainties, it may not have a performance as good as other controllers. But since the real control problems are always not ideal, it is meaningful to take uncertainties and disturbance into the system model.

Some more advanced control techniques such as neural network and expert control are being discussed today. In my opinion, these new approaches have the potential to be the next generation of control theory. With the developing of computer science, it is now possible to model extremely complex networks. This kind of controller can actually take all the possible system states and its corresponding solutions into a database and each time just search for the best solution according to the current system data.  New techniques such as machine learning can also be absorbed into the controller and make the controller more flexible which can handle different control problems using a same configuration.

However, no matter how powerful the control method is, there are rarely situations where we do not need to make trade-offs. As human-beings, we always need to make decisions and balance the income and the expense. Being too greedy is like giving an infinite gain to a helicopter, which may work at the beginning but will suddenly crash whenever there is any disturbance. So push yourself while keep in mind that you have limitation. Take it easy, be adaptive to the environment and always try to get the optimal solution of your life.

## REFERENCES

[1] R.C. Dorf & R.H. Bishop, Modern Control Systems (Twelfth Edition), Pearson, USA.

[2] Wikipedia, Harold Stephen Black. Available at: http://en.wikipedia.org/wiki/Harold_Stephen_Black. Last accessed 26th Mar 2014

[3] E.F. Camacho and C. Bordons, Modern Predictive Control, Springer, London, 2003

# 1. 引子

• 直接和GPIO插口对接的屏幕，使用SPI与CPU进行通信。需要特殊的驱动程序将framebuffer的内容发送到LCD控制器上，一般带有触屏功能，大小以3.5寸为主流。受限于SPI通信速度，刷新速率不高；
• 专用USB接口的屏幕，如RoboPeak Mini USB Display。这类屏幕通过USB连接，需要本地运行驱动程序；
• 通用LCD屏幕，通过HDMI和树莓派连接。因其通用性不需要特殊的驱动程序，但是很多都不支持触屏功能，而且都需要额外的转接板，体积较大；

▲ 图.  树莓派官方7寸屏实拍

• 官方屏的LCD模组最有保证，淘宝上的HDMI LCD一般成像质量不高；
• 官方屏的触摸功能在所有方案中是支持的最好的，有十点电容触摸（目前Raspbian还只支持单点，以后会升级），且不需要额外驱动。而HDMI接口的LCD如果有触摸功能，都需要额外接一根USB用于提供触摸控制；
• 官方触屏和树莓派3可以直接通过铜柱物理连接，无需额外的驱动电路板。连线也非常少，只需要一根DSI软排线和供电接口即可。

▲ 图. 树莓派官方LCD屏实拍 – 正面

## 【C语言深入】C/C++变量命名规范

• 变量名 以小写的英文字母构成，词与词之间用下划线连接，如key_value, data_src; 不可使用数字，不混用大小写；
• 模块名 声明该变量属于的模块，防止模块与模块的命名冲突。如timer_prescalar_value, DMA_channel_name等；
• 作用域前缀 (Scope Prefix) 标注变量的作用域，提高代码可读性：
g_: 全局变量；
n_: 局部变量；
t_: 中间变量；
s_: static静态变量；
• 类型前缀 (Type Prefix) 指明变量的数据类型:
ptr_: 指针变量，在程序中临时需要使用指针时，也常简写为p_，如*p_src；
h_: 句柄，如h_file；
n_: 整形，s_: 短整形，l_: 长整形， u_: 无符号整型，可增加数据位数，如u32；
ch_: 字符型变量；
f_: 浮点，d_: 双精度浮点；
b_: boolean；
by_: byte字节型（关注数据的位特性，需要位操作的情况下使用）；
reg_: 表示寄存器；
• 后缀 (Suffix) 指明变量的性质:
_src: 源，_dst: 目的；
_str: 字符串；
_t: 在声明数据类型时使用，表示为自定义的数据类型，如u32_t；
_st: 表示为结构体；
_buff: 数据缓冲, msg_buff；
_arr, _a, _m: 数组或矩阵；

• 循环控制变量 i, j, k, m, n，除循环控制外应避免使用这些变量名称;
• 函数名 使用(模块名 + )动词 + 名词的形式，同样小写 + 下划线：sys_find_file(), IO_get_data(). 后者因为IO为专用名词故破例使用大写；
• 类名或结构体名 使用首字母大写加下划线连接：如Mystring, Datetime_type;
• 私有类成员 Private使用下划线_前缀，如_data_src_ptr, _init_module();
• 宏定义或常量 使用全部大写：如MAX_NUMBER, LOOP_NUMBER;
• 缩写 使用能广泛接受的缩写：如add, ans, avg, chk, cnt, col, ctrl, def, del, dst, disp, err, freq, idx, init, len, min, max, mid, msg, num, opt, pos, ptr, recv, res, ret, src, str, sub, num, ts (timestamp), val等。

## 近日关注的几个KickStarter项目

KickStarter是国外最著名的众筹网站。项目发起者可以在只有基本idea的情况下提前发布产品信息，以获得来自个人的资金支持，达到满意的标准后再进行产品的实际生产，从而减少了产品发售的风险。 这几天在KS上比较热门的科技项目都是智能设备/可穿戴设备，这里我聊一聊几个我最近关注的项目。

## 1. Sweep激光雷达

▲ 图1. Sweep低成本激光雷达

▲ 图2. Sweep工作在四轴飞行器上（慢速摄影）

▲ 图3. Sweep与其他激光雷达的参数对比

## 2. Pebble 2智能手表

▲ 图4. Pebble智能手表第二代

1、增加了心率传感器。现在心率传感器已经是智能手表的标配了，Pebble自然要与时俱进；
2、增加了麦克风外设，支持语音信息回复，应该还可以通过Google Voice (Android) 和Siri (iOS) 进行语音控制）；
3、核心处理器从Cortex M3升级为M4，有更大的信号处理能力；
4、在增加了额外的传感器之后，防水能力从50m下降到30m，但是依然足够日常使用；
5、Pebble Time 2实际上是上一代的Pebble Time Steel，Pebble Steel这个型号可能不会再推出。

▲ 图5. Pebble 2和Pebble Time 2

▲ 图6. Pebble 2有五种可选颜色

1、Pebble Time 2的屏幕尺寸更大 ，同时使用的是彩色e-ink屏，而Pebble 2是黑白灰度e-ink屏 （e-ink即Kindle所使用的电纸屏，功耗极低）；
2、外观和材质上，Pebble Time 2更佳，Pebble 2则看上去比较廉价；
3、当然，Pebble Time 2的价格比Pebble 2多70%。

## 如何做一个好的博客

2016年04月21日 于 英国约克

## 【RPi树莓派使用指南】树莓派3代介绍及历代树莓派比较

• 更高的处理速度。树莓派3首次采用了64位处理器：基于Cortex-A53的博通BCM2837。BCM2837为四处理器核心，主频也由树莓派2的900MHz提高到了1.2GHz。根据官方提供的数据，这将使树莓派3的处理速度较2代提高50%。如果和1代的700MHz单核相比，提升大约在3 – 4倍。更高的CPU速度使得树莓派可以胜任更大负荷的运算工作：如科学计算，机器人路径规划等。
• 更高的互联性。树莓派3使用了集成蓝牙4.0和WiFi的设计。集成通信的设计的意义是多方面的。首先，使用者无需再购买额外的USB设备，从一定程度上来说，鼓励了用户在自己的设计中使用这些通信功能；其次，集成的通信模块可以进行更好的功耗管理，同时IO吞吐的性能也会得到提高；最后，可以更进一步的优化内核，只针对板载的芯片专门进行优化。避免可能出现的兼容性或者未优化的驱动导致通信性能下降问题。

 型号 发布时间 主要特点 PI 1 Model B 2012年02月 第一代树莓派。Model A不含以太网。 PI Compute Module 2014年04月 模块化设计，使用SODIMM大小的金手指接口。 PI 1 Model B+ 2014年07月 增加了2个USB接口，增加了9个GPIO：26脚->40脚。 使用MicroSD卡。 PI 2 Model B 2015年02月 升级处理器：四核900MHz Cortex-A9。升级为1GB RAM。 PI Zero 2015年11月 无网络通信功能，廉价，小尺寸。 PI 3 2016年02月 升级处理器：64bit四核1.2GHz Cortex-A53。 内置蓝牙4.0和WiFi。

 型号 处理器 主频 内存 GPIO 互联性 功耗级别 PI 1 Model B BCM2835 (ARM11) 700MHz 512MB 26 2 USB HDMI 10/100M Ethernet 700mA (3.5W) PI Compute Module BCM2835 (ARM11) 700MHz 512MB 0 无。需要配合扩展板使用。 200mA (1W) PI 1 Model B+ BCM2835 (ARM11) 700MHz 512MB 40 4 USB HDMI 10/100M Ethernet 600mA (3W) PI 2 Model B BCM2836 (Cortex-A9 四核) 900 MHz 1GB 40 4 USB HDMI 10/100M Ethernet 800mA (4W) PI Zero BCM2835 (ARM11) 1 GHz 512MB 40 (无排针) 1 Micro-USB Mini HDMI 无板载网卡 160mA (0.8W) PI 3 BCM2837 (Cortex-A53 64位四核) 1.2 GHz 1GB 40 4 USB HDMI Bluetooth 4.1 WiFi 802.11n 10/100M Ethernet 800mA (4W)

## 机器学习 | 机器学习入门知识

– 经济学模型建立
– 图像处理和机器视觉
– 生物DNA解码
– 能源负载、使用、价格预测
– 汽车、航空和制造
– 自然语言处理
– … …

Machine Learning从其采用的学习方式来说有以下三大类：
– 监督学习 (Supervised Learning)：用于训练的数据包含已知结果（回归与分类问题）。
– 无监督学习 (Unsupervised Learning)：用于训练的数据不包含已知结果（聚类问题）。
– 强化学习 (Reinforcement Learning)：用于训练的数据不包含已知结果，但是可以用Award函数对其进行评价。

▲ 图. 机器学习的分类（图中没有强化学习，一般强化学习会被认为是semi-supervised）[1]

▲ 图. 常见Machine Learning算法的思维导图，点击放大 (Picture from http://machinelearningmastery.com/)

▲ 图. Machine Learning算法的选择 [1]

## Reference

[1] Introducing Machine Learning, Mathworks