IAR 工程文件分析

注意:下文以IAR 7.2 For ARM版本来分析XML工程文件

初衷

IAR工程中添加文件,一直很麻烦,最近发现RTT用Scons能自动生成IAR模版,并添加源文件,为此分析了IAR工程管理结构,重点在于源文件管理结构

构建语法

采用标准XML形式来构建工程

在新建工程后,IAR默认包含debug和release两个模版,在XML文件中,有所体现,我们可以在XML中删掉release的配置信息,减轻我们分析的负担

IAR 工程结构

  • *.ewp IAR工程文件,包含配置项和文件列表
  • *.ewt IAR配置文件,包含C-STAT和RuntimeChecking的信息
  • *.dep IAR调试信息配置,主要用于描述源文件和obj文件的关联信息
  • *.eww IAR workspace,用于管理多个project
  • *.ewd 调试相关,比如选择的调试器和调试器ID等等

简单介绍一下用途
1)如果只是保留基本工程信息,不需要调试器和链接器的信息,只保留ewwewp文件即可
2)如果需要保存链接器和调试器信息,保留ewp, ewt, dep, eww四个文件即可
3)ewt主要包含一些静态检查和动态检查,可以不用这些配置项

也就是说,在复制IAR工程时,只需要保留这几个文件,其它的文件(夹)都可以删掉,比如setting, Debug,Release文件夹

因为分析IAR主要是为了自动生成模版文件,所以下面重点分析ewp文件结构

ewp文件分析

打开文件,可以看到顶层结构为

1
2
3
4
5
6
<project>
<fileVersion>2</fileVersion>
<configuration>Debug工程配置</configuration>
<configuration>Release工程配置</configuration>
<file>工程文件结构</file>
</project>

这里加注了行号,第3/4行为工程具体配置,包括DebugRelease版本配置,还可以添加其它配置页,为了简化分析,我删掉了Release配置项,再次打开IAR工程,如下所示:

第5行是工程文件目录结构,也是我们重点分析的部分,主要分为两块

  1. 单个文件
  2. 目录组织结构

我在创建IAR工程时,只包含一个main.c文件,XML对应结构如下

1
<name>$PROJ_DIR$\main.c</name>

尝试添加两个源文件test.c test.h, XML 结构变成下面的形式

1
2
3
4
5
6
7
8
9
<file>
<name>$PROJ_DIR$\main.c</name>
</file>
<file>
<name>$PROJ_DIR$\test.c</name>
</file>
<file>
<name>$PROJ_DIR$\test.h</name>
</file>

可见每一个文件对应一个file结构,我们尝试新建一个group,然后将test.c和test.h文件放到里面

1
2
3
4
5
6
7
8
9
10
11
12
<group>
<name>test</name>
<file>
<name>$PROJ_DIR$\test.c</name>
</file>
<file>
<name>$PROJ_DIR$\test.h</name>
</file>
</group>
<file>
<name>$PROJ_DIR$\main.c</name>
</file>

可见增加了一个group结构,并用name来表示group的名字
OK,分析到这里,我们就可以利用python来编写脚本自动添加文件到IAR工程中了

至于Debug配置项的细节信息,等有机会慢慢研究

“树莓派2B+学习笔记-开篇”

前言

github这个博客好久更新了,大概有一年吧,期间各种事情,其实主要原因还是自己懒
终究发现做技术的,还是要常常做一些笔记,不然就会容易忘记,所以今天重抄旧业,将hexo升级到了3.1.0

接下来会不断更新蓝牙4.0和linux,USB相关知识

先拿树莓派开刀吧^_^

1 致谢

最近一直想学linux驱动编程和学习内核,刚好得到一块儿树莓派2B,所以准备用心搞一下
在此特意感谢21ic 小跑堂美女和may美女

树莓派图片

2 树莓派2B升级了什么

下面是官方网站展示的2B的性能参数:

  • A 900MHz quad-core ARM Cortex-A7 CPU
  • 1GB RAM
  • 4 USB ports
  • 40 GPIO pins
  • Full HDMI port
  • Ethernet port
  • Combined 3.5mm audio jack and composite video
  • Camera interface (CSI)
  • Display interface (DSI)
  • Micro SD card slot
  • VideoCore IV 3D graphics core

相比于前代的树莓派,2B采用TF卡,尺寸更小,也去掉了不常用的RCA接口(俗称AV接口),完全采用HDMI接口
这么改,最大的好处就是树莓派形状变得很整齐,不再像原来那样突起一部分

从处理器来说,将原来的高通BCM2835更新到了BCM2836,增大RAM到1G,估计你对这些也不太感冒,只要知道速度提高了6倍就好了

因为处理器架构从ARM7TMDI变成了4核A7,所以能跑标准的操作系统,比如安卓或者ubuntu或者win10

大致看了win10烧录内核的步骤,看到“首先你需要一台运行win10的笔记本”,看到这里就没继续看了,哪位有兴趣的可以自己根据官方博客来实战游戏

https://www.raspberrypi.org/blog/windows-10-for-iot/

https://dev.windows.com/zh-cn/iot

对了,树莓派2B支持DSI显示接口和CSI相机接口,从而可以直接高速视频输入和屏幕输出
这个有什么用呢?理论上来说,你可以拿树莓派做一个平板电脑

树莓派的简单介绍到这里,接下来介绍烧录系统,更新内核,跑opencv做人脸识别

C语言编码规范

0 头文件注释

原则
用于说明本文件的用途,作者,协议等信息

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//******************************************************************************************
//!
//! \file FIFO.h
//! \brief Genernal FIFO Model Interface.
//! You can use uniform FIFO Model to manager Any type of data element.
//! \author cedar
//! \date 2013-12-16
//! \email xuesong5825718@gmail.com
//!
//! \license
//!
//! Copyright (c) 2013 Cedar MIT License
//!
//! Permission is hereby granted, free of charge, to any person obtaining a copy
//! of this software and associated documentation files (the "Software"), to deal
//! in the Software without restriction, including without limitation the rights to
//! use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
//! the Software, and to permit persons to whom the Software is furnished to do so,
//! subject to the following conditions:
//!
//! The above copyright notice and this permission notice shall be included in all
//! copies or substantial portions of the Software.
//!
//! THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//! IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//! FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//! AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//! LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//! OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
//! IN THE SOFTWARE.
///
//******************************************************************************************

1 头文件防冲突宏

原则
用于防止头文件被多次包含,从而导致编译,链接错误

IAR Warming 25 Problem

出现问题

IAR版本之间不兼容是臭名昭著的问题,在IAR7.0版本完全正常的代码,放到IAR7.10版本中编译,会出现下面的警告

Warning[25]: Label 'MemManage_Handler' is defined pubweak in a section implicitly declared root

解决方案

在对应的SECTION声明中,添加NOROOT修饰信息,如下所示

        PUBWEAK MemManage_Handler
        SECTION .text:CODE:REORDER(1)
MemManage_Handler
        B MemManage_Handler

改为

        PUBWEAK MemManage_Handler
        SECTION .text:CODE:REORDER:NOROOT(1)
MemManage_Handler
        B MemManage_Handler

QT5 VS2013 中文乱码问题

问题

QT4中的中文乱码问题,可以通过在实例前增加下面代码来解决

QTextCodec::setCodecForTr(QTextCodec::codecForLocale());

但QT5中,取消了这个函数,又该如何解决呢

解决方案

经测试,只要是源代码文件采用UTF8编码(不带签名)保存,不需要添加任何代码,就可以显示中文

VS2013需要设置如下

FILE->Advanced Save Option->Encoding-> UTF8 without signature - Codepage 65001

IAR中保留未用代码段

现有问题

在嵌入式软件中,经常会用数组保存一些备用信息,也许会存在Flash里面,在Application中用偏移地址来访问这些数据,那么问题就来了,当提高优化级别的时候,编译器会将无用的符号(变量/函数/数组)优化掉,这不是我们所希望看到的结果。

该如何解决这个问题呢?

解决方案

在IAR中,有4个解决方法

1:keep

在链接器里面手工添加需要保留的符号

2: root

示例代码
1
__root int UnusedData[10];

3: required

示例代码
1
2
int UnusedData[10];
#pragma required=UnusedData

4 : 禁用编译器Remove优化

可以在链接器配置extra options页中,通过输入下面的选项来禁用编译器remove优化

--no_remove
--no_fragments

如图所示

注意事项

1:本文仅适用于IAR,如果您适用MDK,请参考编译器手册
2:如果您希望测试是否生效,请将编译器优化级别提高到最高(O3),然后在调试模式下,查看变量,如果不存在,则被编译器优化掉;反之,则符号存在。
3:如果您有任何疑问,欢迎交流

全文完,希望本文对您有帮助^_^

用SWD调试接口测量代码运行时间

关于时间测量的种种问题

在嵌入式中,我们经常需要测量某段代码的执行时间或测量事件触发的时间,常规的思路是:

1:在测量起始点,反转电平
2:在测量结束点,再次反转电平

然后通过示波器或者逻辑分析仪来测量反转间隔,也就是代码时间

这种方法,在测量两个或多个时间信号同步的时候,非常有用,实际上,这也是唯一的方法。

但是如果在测量中,其它代码也会控制这个管脚电平或者周期性动作,这时便需要在<动作1>之前
增加前导码,从而便于在繁杂的波形中,一眼识别出需要特定的波形

同时,如果测量的时间值非常小,那么用示波器即便可以识别,但不容易捕获

SWD解决方案

在ARM Cortex-M 芯片中,用SWD调试接口取代了传统的JTAG调试接口,从而占用MCU更少的管脚,同时提高了调试性能。

SWD由四根线组成,SWO,SWDIO,SWCLK,GND;SWDIO和SWCLK组成了基本的串行调试接口,SWO则提供一个信息输出通道,
可以输出很多信息,比如指令的执行时间或者ISR触发事件,所以我们可以通过SWD接口配合IDE来获取代码执行时间,从而在某种程度上取代示波器

C语言获取循环数

在很多时候,我们需要循环序列,比如循环读取数组的8个元素,便需要索引指针(index)从0-7-0变化,
常规而言,会写出下面的代码

if 语句
1
2
3
4
if (++index >= 8)
{
index = 0;
}

或者

?表达式
1
index = (++index >= 8)? 0:index;

观察到这是连续循环操作,所以我们可以用%的方式,来省掉一个判断语句,如下所示

取余语句
1
index = (++index)%8;

因为++优先级高于%,所以进而简化为

正确写法
1
index = ++index%8;

特别注意: 这里是前置递加操作,不要写成后置,如下所示

错误写法
1
index = index++%8;

如果写成后置的,会出现什么情况呢?

分别将二者反汇编(ARM反汇编),如下所示

错误写法 index = index++%8
1
2
3
4
5
MOVS      R1, #8
MOVS R0, R4
UDIV R4, R0, R1
MLS R4, R4, R1, R0
ADDS R4, R4, #1
正确写法 index = ++index%8
1
2
3
4
5
ADDS      R4, R4, #1
MOVS R0, #8
UDIV R1, R4, R0
MLS R1, R1, R0, R4
MOVS R4, R1

翻译成C语言如下

错误
1
2
index = index%8;
index = index + 1;
正确
1
2
index = index + 1;
index = index%8;

编译器不支持取余运算,所以需要数学计算,取余等于

A%B = A - (A/B)*B

对此,不做过多解释,重点关注ADD那句的位置,正确的表达式会先计算index的值,然后再取余;
而错误的,则先取余,再递增;

所以,正确的语句index = ++index%8会输出0 - 1 - 2 ... 7 - 0序列,错误的会输出1 - 2 ... 7 - 8 - 1序列

示波器探头知识--衰减率

今天在使用示波器XY通道的时候,发现两个信道不同步,衰减比例不一样,导致信号误差

特此写个博客记录1X/10X衰减率的应用场合,以免下次误用

  • 1X
    信号未经衰减直接经过探头传输至示波器,其耐压能力不及其它无源探头,但它具备测试小信号的优势。由于不像10:1衰减比探头那样信号需要示波器再放大10倍显示,所以示波器内部噪声未放大,测量噪声更小,此类更适用于测试小信号或电源纹波噪声

  • 10X
    具备高阻抗10MΩ,因此它对待测电路的负载效应很小,能覆盖一般低频频段(500MHz以内),耐压能力强(300V-400Vrms),价格便宜,通用性好,所以得到广泛使用

更高衰减率的探头归类为无源高压探头, 适合测量高压,超高压电信号

参考资料

嵌入式软件裸机框架

嵌入式平台和PC平台的很大区别是定制化,可以不用操作系统来执行代码,这就带来了一个问题:软件中,需要延时时,死等会让MCU空转,其它任务无法执行,因此,很多人着手解决这个问题。

大致的思路是:将长时间延时分解为小段,然后设置标志位和记录状态,不断查询,在需要延时等待的时候,主动放弃MCU;让其它任务得以执行;不同模块间用消息来传递
专业术语叫做:状态机+消息分发

这是一个引子,后面会详细来写文章分析各类框架的利弊,以助大家在实际项目中,合理使用

定时备份Blog源文件到github

前言

hexo框架是一款非常好用的blog生成工具,可以方便的将markdown转换成HTML网页,并传到github.io网站。
但是hexo在push的时候,只会推送public目录下的文件到远程master分支,而不会保存源文件和网站主题,
这样会导致风险,万一哪天我们的markdown文件挂掉,就仅仅剩github的网页文件了,所以定时将源文件备份到github是个好习惯

1:创建本地仓库

cd进blog所在目录,输入下面命令将文件纳入git管理系统

git init
git add .
git commit -m "first commit"    

2: 删除远程source分支

如果您是从octopress转过来的,那远程仓库中,默认会存在一个source分支;而hexo不会自动push到source,所以
这个分支是很久以前的文件,这里我们将删掉

git push <远程仓库地址> :source

比如我的地址是https://github.com/cedar-renjun/cedar-renjun.github.io.git,则上述命令是

git push https://github.com/cedar-renjun/cedar-renjun.github.io.git :source

注意 :之前有一个空格

上面的命令太长了,不好输入,我们可以用remote来简化输入

git remote add blog https://github.com/cedar-renjun/cedar-renjun.github.io.git

这样,blog就是远程的仓库地址,我们可以用下面命令来检测是否生效

git remote -v

3:创建本地分支

git branch -b source

这个命令,创建了一个souce分支,并切换到source分支了

4:推送到远程分支

git push blog source:source

前一个source表示本地分支名字,后一个表示远程仓库名字,名字可以变,但位置不能变

至此,我们已经将source文件推送到远程分支,可以高枕无忧了 ^_^

Mbed IoT Device Platform


Mark:ARM推出了Mbed平台,试图统一IOT平台,原来看过Mbed的源码,写的很赞,用C++做封装,事件调度机制,非常适合小型系统,最近又看到它们支持各种协议栈,和Thread一样,借助大企业平台的优势,Mbed以后会发展的很好,特此转发ARM文章


About Mbed

The Internet of Things (IoT) is about devices and services delivering end-to-end solutions. The ARM® mbed™ IoT Device Platform is the fastest way to create commercial and interoperable connected IoT devices based on ARM microcontrollers. Interoperability between nodes and cloud services across market segments will unleash the full potential of the IoT. Although the IoT market is made up of many vertical segments, most applications that can make use of Internet connected devices have a common foundation. For example - smart cities, basic wearables and smart home devices require basic OS functionality like drivers, device security and provisioning support. In addition, network connectivity varies from application to application, in general however, the IP networking, security, application layer and device management needs are all common.

The ARM mbed IoT Device Platform provides all the key ingredients to build secure and efficient IoT applications through ARM’s mbed OS, mbed Device Server and mbed Community Ecosystem.

Z-Stack协议栈分析-LED模块

前言

TI的Zigbee协议(Z-Stack)是典型的事件驱动系统,整个系统分为多个任务,各自任务内部采用状态机非阻塞似的完成任务,
完成后,主动释放MCU控制权;下层的任务或异步事件产生的事件,将其封装成事件消息+数据,然后发送到事件处理函数,
在事件处理函数中,也是采用状态机的形式分发消息并处理。

这就是所谓的协作式调度器,它的好处,是避免了传统RTOS的重型线程调度和资源保护机制,从而可以做到无锁资源保护机制
和极度轻量化,节省RAM/ROM

关于这点,后面会详细的讨论,这里重点讨论HAL层的LED机制

注:对于HAL层的实现机制,会另有专门的文章来讨论这个话题

谈谈协程和C语言的协程

注: 本文转自 http://www.yeolar.com/note/2013/02/17/coroutines/

晚上在整理我的 $HOME 的时候,发现了一段有趣的代码,它被保存为了a.c并存在了差不多半年之久。种种迹象表明,它很重要。其实我记得它,当初在网上看到,觉得它包含了一个巧妙的技巧,就让它长住在我的硬盘上了,今天我决定把它搬到这篇文章中。好吧,我是打算谈一谈协程的概念。

一个例子

先给大家看一下这段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>

typedef struct
{
int i;
int num;
int state;
} task;

#define crBegin(state) \
switch (state) { case 0:


#define crReturn(state, ret) \
(state) = __LINE__; return (ret); case __LINE__:


#define crEnd() \
}


int cb(task *t)
{

crBegin(t->state);
for (;;) {
t->num = 1;
for (t->i = 0; t->i < 20; t->i++) {
crReturn(t->state, t->num);
t->num += 1;
}
}
crEnd();
}

int main()
{

task t;
int i;

t.state = 0;

for (i = 0; i < 100; i++) {
printf("%d ", cb(&t));
}
return 0;
}

在状态机中管理时间资源

写在前面的话

在嵌入式系统中,经常会使用到延时(Delay)函数,延时有长,有短;500us以下的延时,可以完全用软件来做;较长的延时,可以用硬件Timer或者调用RTOS的时间管理函数。

在简单的MCU中,由于资源限制,无法使用常规的RTOS,这时就需要自己写相应的协调式调度算法,常见的有协程和时间片轮询机制等,万变不离其宗,它们其中的核心是状态机,在状态机中一个核心原则是:函数不能长时间阻塞MCU,否则就会导致整个系统调度失效。也就是说:无法使用纯软件延时

例如,在系统中严禁出现下面代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

void delay_s(uint8_t tick_s)
{

...
}


...


// Code Snippet 1

delay_s(2);

// Code Snippet 2

那些人,珍重便好

“人生有时候,总是很讽刺。一转身可能就是一世。说好永远的,不知怎么就散了。最后自己想来想去竟然也搞不清当初是什么原因分开彼此的。然后,你忽然醒悟,感情原来是这么脆弱的。经得起风雨,却经不起平凡;风雨同船,天晴便各自散了。也许只是赌气,也许只是因为小小的事。幻想着和好的甜蜜,或重逢时的拥抱,那个时候会是边流泪边捶打对方,还傻笑着。该是多美的画面。没想到的是,一别竟是一辈子了。”

张爱玲 《有些人我们一直在错过》
有些人,渐行渐远
有些人,来去如风
有些人,或许不会再见
有些人,珍重便好

某年回家,在车上偶遇多年未见的同学,一路上聊起来,我问他是怎么认出我来的,他说:“这些年你都没有怎么变”,我笑笑说:“还是跟以前一样傻逼吧”,他也笑笑。他说:“你现在在哪工作”,“武汉读书”,忽然他就提高了音调,“还在读书呀,读大学吧,你看你都读老了,不要读成书呆子”,接着自顾自地说了一堆,“我们打工的那个厂里面一堆大学生,你看现在,什么都缺,就是不缺大学生,读书有什么用,你读出来还不是跟我一样去打工……”听着他唠叨了一大堆,我就只有颔首而笑的份,我明白,我只有用笑容来表示我对他的尊重。下车前,我们互留了电话号码,告别以留下“常联系”这句话后的背影作为结束。号码也只是藏在电话本里的某个角落,只有在过年的时候才会互道一声问候,虽然想打电话联系,但是不知道说什么好,怕尴尬,怕那种只能挤出牙缝的陌生,索性在某次清理通讯录的时候,我把他从我的通讯录里删除了。

这让我想起了我一位高中同学,很长一段时间,我和他坐同桌。他平时就是打篮球,上网和睡觉,篮球打得很棒,各方面也不错,但是有一点,就是不喜欢学习,考试都是比较糟糕。曾想过帮他,但是后来发现这是一件很难的事情,人各有志,命里无时莫强求,也许学习这条路对于每个人并不是都是合适的,每个人都有适合自己的事做,最后高考考完他就消失了,填志愿的时候他也没来,还没来得及道别,后来QQ上也没见他上过线。常言道“天下没有不散的宴席”,但有时却是,宴席还没有摆上,还没来得及陪君醉笑三千场,不诉离殇,就有人抽身而去,连一个身影都没有留下。后来有一次,辗转了解到毕业后他就回家了,之后喜当爹了,现在孩子应该可以打酱油了吧,也不知道他现在在做什么,希望应该比学习有趣吧。

打开邮箱,看到同学发来的这样一份邮件,“毕业的,没毕业的,上班的,没上班的,我们都开始忙碌了;好像越来越少有时间,去问候和想念;会不会有天,我们真的都忘记了彼此,遗忘了那些最美丽的回忆?我们曾在某个时间相遇,曾在某个时段某个时候,在一起。然后,因为这样那样的原因,我们不常联系。只是想轻轻地告诉你:我很好,希望你也很好。”看到这个心里觉得矫情,但我们终究会明白,每个人总会走上自己选择的路,不管怎样,还是希望听到他们的好消息。

在一个地方待得太久,就会渐渐的忘记时间,曾经以为这样的日子会长久,但终究在这样一个宁静的午后戛然而止。我们各自背上行囊,或许道一声珍重,或许相顾无言,各自奔走天涯。多年以后,你是否会记得那个喧嚣或者沉默的下午,那个远去的背影消失在遥远的尽头,那趟踏上远方的列车,我们各自转身,不再回头。可叹人世多错过,两人彼此遍寻不着,只存一份念想;淡淡的眷恋潜浮于眸,深深的情愫隐藏于心,在时间里慢慢发酵,酝酿出那一番醇香。王家卫导演在解释《一代宗师》张震的戏份太少时曾说过,有时候生命中遇见一些人,但之后就再也没见到过了,这是一部分的人生。

我们从久远走来,相濡以沫或者相忘于江湖,江南说:江湖是这么一个地方,你在这里生,也不介意在这里死去。可你想过没有,多年以后,或许江湖还是那个江湖,你已不是当年的那个你,曾经的那些美好都成为了过往,就算时光真的可以倒流,你会发现,一切早已经面目全非。所有的相遇,都是久别重逢,那么所有的重逢,都是时光之约,里面装满了风尘与岁月。

最后,这些东西都慢慢的幻化成回忆,这个世界有太多我们无能为力的东西,回不到的过去,无法预知的未来,以及那些那些再也没有见到过的人……

如果哪天那些人和你从此不会再见了,不是有一些新的人取而代之了,新的阶段出现了,就是遥远的我们都“懒”了。

曲终人会散,人走茶会凉,最后,收拾心情,背上行囊,继续上路。

文/阿飞 http://www.douban.com/note/295698799/

IAR环境下,Jlink调试报错,提示<无法读取CPUID>

问题描述

在IAR 6.3中,使用Jlink调试Cortex-M芯片的时候,无法正常调试,报错

Can not read CPUID

为CPU重新上电,则可以正常进入调试状态

出现原因

IAR Jlink DLL版本过低

解决方案

用最新版的JlinkARM.dll替换掉IAR安装目录下默认的JLinkARM.dll

附:我的jlinkarm.dll路径如下,不同电脑路径可能不一致,注意区分

1:Jlink软件JlinkARM.dll路径

C:\Program Files (x86)\SEGGER\JLinkARM_V474b

2:IAR安装目录JlinkARM.dll路径

C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.0\arm\bin

个人与平台

总结自己短暂却又不失跌宕的职业生活(没敢说生涯),尤其到了今年,所有重要抑或不重要的故事勾勒出一幅画面。随着自己的不断进步,却发现越来越多的无奈,不断坚持后,又随着事务的不断解决,越来越悟出一个道理:个人,要想进步,必须要有个适合你的平台。

注:原文转载自 <http://blog.sina.com.cn/s/blog_414bbec30100gepf.html> ,转载请注明原出处

有朋友EMAIL我说:“我现在在的公司里我能力最强(我笑),每天干的最多,老板是很倚重我,但又不肯给我想要的待遇。不想做了,跳一跳,到时候让老板知道没我了他会多后悔。”

我没正面回应他,因为我知道那种感觉不是几句话能够说动的。后来他告诉我说,他走了,去了另外一个公司,发现事情有些不按照自己想法前进。新的公司更加过分,原来的公司在自己走了后自己本来一个部门的竞争对手竟然升到了部门经理,待遇直接翻倍了。不胜后悔!

对于这种事情,我个人是有着切身体会的。在毕业后第一个公司时,每天我做的最多的事情就是感慨自己的“怀才不遇”,认为自己应该是理所应当的领导,为什么却要天天去做那些随便一个初中生都可以做的琐碎工作。于是消极抵抗,甚至无心工作,最后结果是一些小的事情都做不好,却让领导更加反感。最后选择离开!

公司的老总在我离职后也许嗅到了一些味道,两个同来的都迅速的升职,一个做项目经理一个做了技术部副经理,待遇也是随之上涨。当然我并不后悔,不过这也是后话了。当时还是有些小后悔的!

以上两个故事说明一个什么问题呢?那就是: 对于一个公司,你自己远远没有你想的那么重要!

如果有合作公司老板打电话给你要你过去,待遇要比现在高,你怎么办?我的直观反应会是:“你要知道你是凭借什么才有这种资格接到这种电话。当然,你的努力和能力很重要,但是如果没有公司这个大平台,你会有今天吗?没有今天,你怎么能让别人认可你。人要学会感恩。即使对方开出的价码实在让你无法拒绝,但是你还要考虑一个你过去后能够适应的问题。”

再就是在个体中表现最为强烈的一种“意识形态”了。对于成立时间并不长的公司,人才,尤其是合适的人才是非常重要的。不一定要求对方的能力强到世界第一,而是要合适。公司从成立到现在,发掘了很多“合适”的人才。他们在进公司后,凭借自身努力和公司提供的宽松环境,将自己的能力发挥的淋漓尽致,为公司成长立下了汗马功劳的同时,个人能力也不断进步。

新公司局限于资源和自身条件,很难去储备较多的管理人才。所以招来的每个人都是依据公司缺人的职位,不断甄选,最终找到符合该职位的人选,可谓“一个钉子一个铆”。这样造成的结果有正反方面两个,一是这个人越来越合适这个工作,工作手法越来越熟练,越来越得心应手,效率更高;另一方面,随着公司的更加倚重,他听到的夸赞越来越多。这种夸赞渐渐就让人内心深处出现了“骄傲”的情绪,滋长着“没我不行”的呐喊。
这时候对于双方,无论公司或者个人,都是比较危险的时刻。

对于个人,因为觉得自己的“不可或缺”,就会产生多种复杂思维。就好像一个得了“肥胖症”的患者,接下来就会诱发如高血压、高血脂、高血糖、糖尿病等各类并发症。他们会理所当然的认为自己既然如此重要,那么老板你要提高我的职位,你要给我更高的待遇,你要给我更大的管理权力,你要给予我更多的尊重;他们会在和同事相处时表现的更加咄咄逼人,更加的骄傲和难以接受;他们会在处理工作时表现的更加眼高手低,觉得自己应该做更高一层的职位。武断的自我抬高会让自己的虚荣心不断上升,处理事务更加的独断和难以接受,他们会尝试着插手别人的分内事务,从而引起同事的不满,继而是失误的增多和更多的人心向背。

对于公司,培养一个合适的人选不容易。看着自己辛苦培养出来的人如此的自我膨胀,却无计可施。因为你不可能答应他的条件,否则以后他会更加不可一世,别人看到后也会群起而仿效。但是看着他越滑越远,最难过的应该是公司一方。如果这个人走了,结果应该是“双输”。

但是个人请永远不能低估公司作为一个平台的强大造血功能和新陈代谢能力。新公司对于一个“合适”的人离去是可以接受的,因为所有“合适”的人在同时间离开可能性不是没有,但概率却是很小的。你走了,我需要做的也许只是去再招人。也许短时间内会有些贫血,但只要人找到了,再经过培养,依然可用,造血只是个迟早的过程。而平台其他血细胞,在这种关键时刻也是完全可以到达失血位置支援的。

这个时候我们返回来去思索一下,作为一个个体,应该如何正确处理自己作为一个和公司这个平台的关系。总结自己的个人经验,提出如下几点:

一、打倒自己心中的鬼,让自己变得一文不值

记住,不管到哪里,什么时候,自己永远没有自己想的那么重要。没有那个地方没你不行,没你地球照转,太阳天天东升西落。千万不要让自己觉得自己可以扭转地球自转的规律。平台是个大机器,而且随着不断进步,内部机械运转更加趋于合理,强大的机制才是真正的内核和发动机。个体只不过是这个巨大机器上的一颗螺丝钉,螺丝钉之于发动机,相差了N个数量级样的光年。平台和个人同时发展,大家各司其职,发动机性能更加优越,螺丝钉越来越牢固,机器运转才会越来越稳定。你有没有想起雷锋叔叔?

二、做好自己分内的事,先把平台推上去

一个人的价值体现是随着平台的不断进步而不断提高的。试想现在你是一个一文不名的小公司项目经理,没人知道你,你说出去别人会说:“你们能按月发工资吗?”若干年后,你的公司成了万科级别的公司,别人看你那叫高山仰止。要想自己站得高,首先要先努力把平台推上去。做好自己分内的工作,同时尽量站在自己上一级领导的位置去思考,你能取得平台和个人同步提升。

三、平台有多高,你就能看多远

也就是常说的“屁股决定脑袋”。如果你仅仅是个小职员,你认识的人就很难有项目经理或者部门主管。如果你是项目经理,你也很难接触到其他公司的高管或者老总。但是如果把你放在高官的位置,你处理事务时,思路就会比站在项目经理或者普通职员位置上更加开阔。这时,你就能理解,为什么有时候接到上边的指令之初会觉得难以执行,但做着做着就渐渐的开始佩服。当然,给你这个平台,前提是你要有相当的能力。给一个科员水平的人去坐处长的位子,那叫勉为其难,那不是在提拔人,是在糟践人。

四、永远不要骄傲

一个人成功的程度,取决于其控制性格中不好方面的能力。

骄傲,是所有人都有的性格。但是就像自负和自信一样,稍不留意,你就会骄傲的让自己摸不到头脑。骄傲,会让你失去细心,严谨,脚踏实地等一系列的优秀性格,你会觉得自己不可一世。

也许你还没有到觉得“没你不行”的地步,但是你自己想想自己是否有以下表现中的一种或者几种:

  • 你是不是越来越不想听你上级的指令了,越来越觉得他是错的
  • 你是不是越来越懈怠,可以玩物丧志,可以不重视公司的纪律
  • 你是不是越来越听不进别人的话了,对上级的指令感觉越来越刺耳
  • 你是不是越来越开始游离于公司管理制度的灰色地带
  • 你是不是开始对同级或者下属在生活中开始更多“命令式”的说话

自控和自我反省能力是一个人要做好事情的基本前提。尤其对于“塑形期”的年轻人。尤其现代社会,压力大,人会变得越来越浮躁,没有方向感和归属感。所以要多看书,多学习,多做有意义的事情,切忌不要沉迷于某种不好的事物或者情绪中。

世界因你而动,follow your heart,多倾听自己内心的声音,让自己变得更加的强大后,你才会有更多维和正确的选择观。

让我们一起努力吧!

SublimeText 插件 -- DoxyDoc

简介

DoxyDoc是一款C++语言的Doxygen插件,有了它,你可以在SublimeText中快速插入注释,极大的提高效率

其它同类的插件有 PhpDocDocBlockr

安装

  1. Ctrl+Shift+P 调出命令栏
  2. 输入Install Package执行包安装命令
  3. 输入DoxyDoc,然后点击确定,等待安装结束

用法

DoxyDoc会自动判断上下文环境,添加不同的注释格式,具体来说,包括两种

  1. 注释处没有函数或变量,则自动创建空白注释

  1. 注释处有函数或变量,则根据函数信息自动填充对应的注释部分
    其中函数信息包括:函数名,传入参数,返回值




更多信息

请参考:https://sublime.wbond.net/packages/DoxyDoc

在Sublime Text中设置Tab-Space

1: 概述

缩进设置决定了tab符缩进的大小,控制tab键是插入tab符号还是空格。除了自动检测之外,它们可以自定义为全局,某种文件类型,或者某个文件。

2: 设置

|---------------------------|--------------------------------------------------------------------------------------------------------------|
|tab_size                   | 数字。插入的空格数                                                                                           |
|translate_tabs_to_spaces   | Boolean, 如果为true,按tab键将会输入空格替代,而不是tab字符                                                  |
|detect_indentation         | Boolean, 默认为true, tab_size和translate_tabs_to_spaces将会在文件载入是自动计算                              |
|use_tab_stops              | Boolean, 如果translate_tabs_to_spaces为true, use_tab_stops将会使tab和backspace在下一个tab停止时insert/delete |

3: 配置文件

配置文件将会按下面这个顺序应用:

  1. Packages/Default/Preferences.sublime-settings
  2. Packages/Default/Preferences ().sublime-settings
  3. Packages/User/Preferences.sublime-settings
  4. Packages//.sublime-settings
  5. Packages/User/.sublime-settings

通常情况下,你应该把你的配置放在Packages/User/Preferences.sublime-settings里。如果你要给特定的文件类型指定配置,比如,Python, 应该放在Packages/User/Python.sublime-settings文件中

4: 配置文件示例

试着把这些保存为Packages/User/Preferences.sublime-settings

1
2
3
4
{
"tab_size": 4,
"translate_tabs_to_spaces": false
}

5: 单独语法配置

可以在基础配置之上指定单独的语法配置。在Preferences/Settings - More/Syntax Specific - User菜单下

6: 缩进的检测

当一个文件载入时,它的内容会被检查,tab_sizetranslate_tabs_to_spaces设置将会应用到该文件。状态栏将会报告发了什么。尽管编辑器会处理的很好,如果想要把它禁用的话,可以通过detect_indentation来设置

缩进检测可以手动执行,通过View/Indentation/Guess Settings From Buffer菜单执行detect_indentation命令

7: Tab和空格之间转换

View/Indentation菜单里有命令可以将当前文件中的空白在tab符和空格符之间转换。这几个菜单项执行的是expand_tabsunexpand_tabs命令

8: 自动缩进

自动缩进猜测会在换行时给每一行添加一定数量空白符。由下面这个配置控制:

|-------------------------------|-----------------------------------------------------------------------------------------------------------|
| auto_indent                   | Boolean, 默认是开启                                                                                       |
| smart_indent                  | Boolean, 默认是开启。具有一点小聪明的自动缩进,比如,在一个if语法片段的下一行进行缩进                     |
| trim_automatic_white_space    | Boolean, 默认开启。当断行时由auto_indent去除行头尾的空白                                                  |
| indent_to_bracket             | Boolean, 默认禁用。缩进时根据第一个前括号来空白数。像下面这样:use_indent_to_bracket(to_indent,like_this) |

9:注意事项

修改配置文件后,需要关闭所有打开的文件,然后重启Sublime Text