编程
文章平均质量分 64
wzk456
擅长嵌入式软硬件,MCU,VB,C#,C++
展开
-
C语言十大滤波算法
1、限幅滤波法方法:根据经验判断,确定两次采样允许的最大偏差值(设为A),每次检测到新值时判断:如果本次值与上次值之差<=A,则本次值有效。如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值*函数名称:AmplitudeLimiterFilter()-限幅滤波法*优点:能有效克服因偶然因素引起的脉冲干扰*缺点:无法抑制那种周期性的干扰,且平滑度差*说明: 1、调用函数 GetAD(),该函数用来取得当前值 2、变量说明 Value:最近一次有效...转载 2022-03-15 07:26:10 · 3718 阅读 · 0 评论 -
嵌入式C高质量编程培训心得笔记
转自新浪博客随着设备类产品的硬件差异化越来越小,软件对于产品的价值贡献会愈见突出。公司一直致力于的电力二次设备及一二次融合的成套产品研发也不例外。由于二次设备产品是用于对一次设备的保护以及对电力系统的自动控制、调度,集电力专业知识和计算机技术、通讯技术、网络技术、系统集成等信息领域于一体,是电力输送的“软件”设备,高端产品具有明显的技术壁垒。所以,二次设备生产的技术含量较高。尤其是当量产到转载 2013-07-11 00:40:58 · 4513 阅读 · 0 评论 -
关于无符号与有符号的相关运算
1)比较大小2)移位1)比较大小:不能直接比较大小, 分别定义一个signed int型数据和unsigned int型数据,然后进行大小比较: unsigned int a=10; signed int b=-100; a>b?还是b>a?实验证明b>a,也就是说-100>10,为什么会出现这样的结果呢?这是因为在C语言操作中,如原创 2013-05-23 00:10:17 · 713 阅读 · 0 评论 -
BUG
英文单词,本意是臭虫、缺陷、损坏等意思。现在人们将在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题统称为bug(漏洞)。Bug一词的原意是“臭虫”或“虫子”;现在,在电脑系统或程序中隐藏着的一些未被发现的缺陷或问题,人们也叫它“bug”。原来,第一代的计算机是由许多庞大且昂贵的真空管组成,并利用大量的电力来使真空管发光。可能正是由于计算机运行产生的光和热,引得一只小虫子(Bug)钻进了一支转载 2013-07-17 19:06:21 · 501 阅读 · 0 评论 -
Jeff Atwood倾情推荐——程序员必读之书
英文版:《Code Complete 2》中文版:《代码大全(第二版)》作者:Steve McConnell译者:金戈 汤凌 陈硕 张菲出版社:电子工业出版社出版日期:2007 年8月Jeff Atwood的推荐:Steve McConnell的这本书是软件开发领域里的《烹饪的乐趣》。如果你对这本书感兴趣,说明你热爱你现在的工作,你对你正在做的事情是认真的,并且你想不转载 2013-08-13 00:56:11 · 655 阅读 · 0 评论 -
程序员不爱读书,但这很不明智——想看就看《高效能程序员的修炼》
英文原文:http://www.codinghorror.com/blog/2008/04/programmers-dont-read-books----but-you-should.html作者:Jeff AtwoodCoding Horror精华文章现已收入新书《高效能程序员的修炼》,各大书店有售!StackOverflow.com的主旋律之一,就是软件开发者不再照着书本学习编转载 2013-08-13 01:00:47 · 736 阅读 · 0 评论 -
自主”操作系统——为什么及如何
自主”操作系统——为什么及如何September 19, 2012 at 12:04 PM作者:魏永明(飞漫软件CEO)1 引言近一个月是个多事之秋(2012年9月),IT 和互联网领域也不平静。阿里云操作系统受到谷歌的打压,华为任正非提出要开发自己的操作系统,中兴也宣布今年第四季度将发布自己的操作系统。一时间,微博上有关自主知识产权操作系统的讨论如火如荼。转载 2013-10-29 09:20:06 · 1221 阅读 · 0 评论 -
开源软件及国内发展趋势
源是大势所趋随着计算机技术的发展,尤其是互联网技术和相关企业的兴起,开源软件在操作系统、编译工具链、数据库、WEB服务器、移动操作系统等各个方面已经成为主流。而且许多企业利用开源软件形成了独特的商业模式。比如谷歌的 Android 操作系统,从 2007 年开源发布第一个版本起,到今天已经发展到 4.1 版本,占据了智能手机操作系统一半以上的市场份额,谷歌也通过 Android 操作系统在转载 2013-10-29 09:13:38 · 1876 阅读 · 0 评论 -
code review
先说说我们公司现在的做法,一个团队被人为地分为两个阵营:Senior Developers和Junior Developers,比例差不多是1:1,Senior Developers就担负着对Junior Developers的代码进行Review的职责,每天Review一次,对有问题的代码写上comments,然后也check in到代码库中。这种comments有特殊格式(比如//\\Code转载 2014-04-17 22:19:44 · 566 阅读 · 0 评论 -
Code Review代码审查的思路
1.关于Code Review1.1 Code Review的目的Code Review主要用来在软件工程过程中改进代码质量,通过Code Review可以达到如下目的目的:(1)在项目早期就能够发现代码中的BUG(2)帮助初级开发人员学习高级开发人员的经验,达到知识共享(3)避免开发人员犯一些很常见,很普通的错误(4)保证项目组人员的良好沟通转载 2014-04-17 22:36:10 · 661 阅读 · 0 评论 -
google 如何进行代码审查
在上一篇文章中提到过,我已经不在Google工作了。我还没有想清楚应该去哪里—有两三个非常好的工作机会摆在我面前。因为在这段做决定时间里,我不再受雇于任何人,我想可以写一些专业性的东西,一些很有趣,但也会在同事和管理工作中导致关系紧张的东西。Google是一个非常优秀的公司。他们做出了很多令人称赞的东西—既是公司外部,人们可以看到的东西,也是公司内部。有一些在公司内部并不属于保密的事情,在转载 2014-04-17 22:54:24 · 566 阅读 · 0 评论 -
【Programming Style】新創公司不用做 Code Review?
如果你正處在一家軟體開發的新創公司,你如何定義你產品的 code 是「好的」?我常聽到大家說,只要產品 work,程式就是好的!如果事情這麼簡單,工作就容易多了。但事實其實相距甚遠。大多數的工程師都知道 code review 的重要性,至少,他們是這麼認為的;然而大多數的團隊卻沒有定期去執行 code review。如果我們都知道它有多重要,為什麼沒有更多團隊這麼做呢?原因是,大转载 2014-04-17 23:06:48 · 612 阅读 · 0 评论 -
敏捷开 发中Code Review的目的及内容
一些敏捷团队在实施敏捷开发中忙于编码、忙于Unit Test、忙于沟通、忙于Build等,虽然也有编码审核阶段,但大都浮于表面,流于形式,效果不佳。本文结合实践,介绍笔者对敏捷开发中CodeReview的理解和相关经验。文/陈序明 黄彦军敏捷开 发中Code Review的目的及内容做任何事情,首先要清晰为什么要做,才能有目标和动力把事情做得更好转载 2014-04-17 22:29:13 · 1362 阅读 · 0 评论 -
如何提高代码质量(管理篇):代码复查
也许你是一位项目经理,也许你是一位项目骨干成员,或者开发小组长。在我发表“如何提高代码质量”的这一系统文章后,有许多网友都向我抱怨,说他无法把握整个项目组成员的代码质量。我想,这也是所有项目组普遍存在的问题吧,它通常表现为以下几个问题:软件项目普遍存在的问题1)新手。任何项目组成员都不可避免地出现新手,他们往往是刚刚从大学毕业的学生。这些新手由于软件开发时间太短,往往技术不成熟,没转载 2014-04-17 22:59:45 · 476 阅读 · 0 评论 -
C++相关
1)MFC中工具栏情况:dialogbar2)MFC中工具栏提示3)MFC中自定义BUTTON4)MFC中自定义LIST5)消息映射的几种方式,范围?原创 2013-06-05 00:47:27 · 571 阅读 · 0 评论 -
strncpy,strcpy,memcpy的区别
strncpySummary#include char *strncpy ( char *dst, /* destination string */ char *src, /* source string */ int len); /* max characters to copy */DescriptionT原创 2014-04-21 17:03:59 · 860 阅读 · 0 评论 -
volatile用法
volatile的本意是“易变的” 由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。比如:static int i=0;int main(void){...while (1){if (i) dosomething();}}/* Interrupt service routine. */void ISR_转载 2014-04-13 07:42:28 · 421 阅读 · 0 评论 -
关于回车和换行
1 历史 回车”(Carriage Return)和“换行”(LineFeed)这两个概念的来历和区别。符号 ASCII码 意义n 10 换行 LFr 13 回车CR在计算机还没有出现之前,有一种叫做电传打字机(Teletype M翻译 2014-04-29 00:06:18 · 599 阅读 · 0 评论 -
嵌入式编程进化史
早期语言写程序的特点(看16楼图):1.几乎很少使用参数传递,所有子程序几乎全部依靠共有全局变量来传递数据。2.共享全局变量带来的交叉耦合让这个代码调试起来非常费劲,因为每个函数都不是独立的,它依赖自身使用的大量全局变量。在MCU上,因为中断函数带来的并发性,如果有全局变量在中断内外都用到,那就会带来很多麻烦。这样的代码如果在多任务环境中将会更糟糕。3.再看看可读性,大量全局变量和全局标志位让代码原创 2014-06-15 08:04:24 · 590 阅读 · 0 评论 -
《软件工程导论》第五版 张海藩 编著 总结
总结重点: v Unit1v 软件危机包含两方面的问题:一是如何开发软件,怎样满足人们对软件日益增长的需求?二是如何维护软件,使它们持久地满足人们的要求。v 软件工程学定义:把软件当作一种工业产品,采用工程学的原理来管理和组织软件的开发和维护,称为软件工程。v 软件是指程序、数据和文档三者共同构成的配置。v 包含与数据处理系统操作有关的程序、规程、规转载 2014-08-02 14:22:37 · 1090 阅读 · 0 评论 -
同步与异步的概念
异步:一种通讯方式,对设备需求简单。我们的PC机提供的标准通信接口都是异步的。异步双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,结束时有停止位。异步的另外一种含义是计算机多线程的异步处理。与同步处理相对,异步处理不用阻塞当前线程来等待处理完成,而是允许后续操作,直至其它线程将处理完成,并回调通知此线程。转载 2014-08-14 08:57:18 · 730 阅读 · 0 评论 -
首先为人编写程序,其次才是计算机
“首先是为人编写程序,其次才是计算机”,这是软件开发的基本要点,软件的生命周期贯穿于产品的开发、测试、生产、发布、用户使用、版本升级和后期维护等长期过程中,只有易读、易维护的软件代码才具有生命力。在实际的软件开发过程中,可能是由于工作很忙的原因,很多开发人员只注重实现程序的基本功能,而忘记了编程规范,因此写出来的代码只能让计算机看懂,人要看懂很不容易。更有甚者,有些项目组为了赶进度,明确要转载 2014-08-14 09:24:28 · 756 阅读 · 0 评论 -
大端小端以及51单片机,CORTEX M 32位单片机中的归属
1 定义: 大端模式,是指数据的高位保存在内存的低地址中,而数据的低位保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;小端模式,是指数据的高位保存在内存的高地址中,而数据的低位保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致原创 2014-11-11 22:58:15 · 4922 阅读 · 0 评论 -
结构对齐--__packed与#pragma pack
1 ANSI C规定 ANSI C规定一种结构类型的大小是它所有字段的大小以及字段之间或字段尾部的填充区大小之和。 填充区就是为了使结构体字段满足内存对齐要求而额外分配给结构体的空间。 那么结构体本身有对齐要求,ANSI C标准规定结构体类型的对齐要求不能比它所有字段中要求最严格的那个宽松,可以更严格。 2转载 2014-11-12 01:08:08 · 1504 阅读 · 0 评论 -
keil mdk optimization levels
Compiler optimization levels and the debug viewARM Compiler toolchain v5.02 for µVision Using the Compiler Home >Compiler Coding Practices > Compiler optimization l原创 2014-11-12 01:20:55 · 3604 阅读 · 0 评论 -
C语言的整形数据及keil mdk中类型的情况
1 分类 char占用一个字节;int代表原创 2014-11-11 22:35:09 · 1346 阅读 · 0 评论 -
关于字节对齐,和程序优化有关 值得一看
一.什么是字节对齐,为什么要对齐 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能转载 2014-11-12 01:10:49 · 1228 阅读 · 0 评论 -
多任务 任务的划分
对同一个外设的访问放在一个任务中”、“通过任务分割提高系统的实时性”和“软件工程中的‘解耦原则’用于任务的划分”。转载 2014-11-16 01:29:28 · 2066 阅读 · 0 评论 -
解耦的故事--权限设计
系统设计一个很重要的目的就是为了重用﹐而要做到重用﹐低耦合是最有效的手段。 本文将通过web应用系统中一个最常见的主题--权限设计﹐来说明解耦的应用。 要解耦﹐首先就要进行抽象﹐权限究竟能不能抽象? 我认为通常意义上的权限应该分为2类﹕一类是用户是否有权进行某项动作﹐如管理员可以删贴﹐人事考勤员可以修改考勤数据。这种权限就是最简单的有或无问题﹐毫无疑问﹐这是可以抽象出来转载 2014-11-17 00:30:41 · 564 阅读 · 0 评论 -
软件设计原则
以前本站向大家介绍过一些软件开发的原则,比如优质代码的十诫和Unix传奇(下篇)中所以说的UNIX的设计原则。相信大家从中能够从中学了解到一些设计原理方面的知识,正如我在《再谈“我是怎么招聘程序”》中所说的,一个好的程序员通常由其操作技能、知识水平,经验层力和能力四个方面组成。在这里想和大家说说设计中的一些原则,我认为这些东西属于长期经验总结出来的知识。这些原则,每一个程序员都应该了解。但是请不要转载 2014-11-16 19:16:59 · 550 阅读 · 0 评论 -
安装时总是显示“$(DllSelfRegisterEx)不能被注册” 的解决方法
VB50安装向导生成的安装程序,安装到最后时总是显示“文件c:\windows\system\$(DllSelfRegisterEx)不能被注册,由于它未找到。”的提示信息后安装失败,请问为何原因? ---------- Bug!这是VB5、6的一个Bug。 如果运行Visual Basic 5.0生成的安装盘,会产生下面的错误: The file '\$(DLL原创 2015-03-11 14:00:42 · 1405 阅读 · 0 评论 -
每个程序员都必须遵守的编程原则
我不要自我重复 ― 这也许是在编程开发这最最基本的一个信条,就是要告诉你不要出现重复的代码。我们很多的编程结构之所以存在,就是为了帮助我们消除重复(例如,循环语句,函数,类,等等)。一旦程序里开始有重复现象的出现(例如很长的表达式、一大堆的语句,但都是为了表达相同的概念),你就需要对代码进行一次新的提炼,抽象。 http://en.wikipedia.org/wiki/Don%27原创 2015-04-09 22:38:49 · 565 阅读 · 0 评论 -
关于回调函数的几个例子
例 1. 回调函数/* para_callback.h */#ifndef PARA_CALLBACK_H#define PARA_CALLBACK_Htypedef void (*callback_t)(void *);extern void repeat_three_times(callback_t, void *);#endif/* para_callback.c原创 2015-10-30 16:26:54 · 694 阅读 · 0 评论 -
如何写出优美的 C 代码
面向对象的语言更接近人的思维方式,而且在很大程度上降低了代码的复杂性,同时提高了代码的可读性和可维护性,传统的 C 代码同样可以设计出比较易读,易维护,复杂度较低的优美代码,本文将通过一个实际的例子来说明这一点。基础知识结构体除了提供基本数据类型外,C 语言还提供给用户自己定制数据类型的能力,那就是结构体,在 C 语言中,你可以用结构体来表示任何实体。结构体正是面向对象语言转载 2016-03-04 22:37:23 · 714 阅读 · 0 评论 -
面试中的排序算法总结
前言查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中。因为其实现代码较短,应用较常见。所以在面试中经常会问到排序算法及其相关的问题。但万变不离其宗,只要熟悉了思想,灵活运用也不是难事。一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码。对这两种排序的代码一定要信手拈来才行。还有插入排序、冒泡排序、堆排序、基数排序、桶排序等。面试官对于这原创 2016-04-26 23:25:10 · 4872 阅读 · 0 评论 -
C51 禁止使用绝对寄存器寻址方式访问函数选定
在 ISR 中调用其它函数,必须和中断使用相同的寄存器组。当没用 NOAREGS 命令做明确的声明,编译器将使用绝对寄存器寻址方式访问函数选定(即用 using 或 REGISTERBANK 指定)的寄存器组,当函数假定的和实际所选的寄存器组不同时,将产生不可预知的结果,从而可能出现参数传递错误,返回值可能会在错误的寄存器组中。 举一例子:当需要在中断内和中断外调用同一个函数,假定按照程序的流原创 2016-04-23 06:54:44 · 1690 阅读 · 0 评论 -
重构不是阳春白雪的高端玩意,而是码农编程利器
CSDN:请先介绍下自己以及所从事的工作范钢:我是70年代生的人,在IT行业也算是一个老兵了。我这些年一路走来,从最初做小弟,然后当需求分析员、设计师,再后来带着一帮小弟全国各地做项目。掐指一算去过的地方还真不少:2006年,我们跟美女在湖南的凤凰古城待着;2008年,在清晨静谧的云南抚仙湖里泡澡;2009年,沐浴在西安古城的暮鼓晨钟之中;2010年去了长白山天池;转载 2017-01-10 11:49:27 · 497 阅读 · 0 评论 -
增量式PID控制算法
增量式PID控制算法当执行机构需要的不是控制量的绝对值,而是控制量的增量(例如去驱动步进电动机)时,需要用PID的“增量算法”。 增量式PID控制算法可以通过(2-4)式推导出。由(2-4)可以得到控制器的第k-1个采样时刻的输出值为:(2-5)将(2-4)与(2-5)相减并整理,就可以得到增量式PID控制算法公式为: (2-6)其中原创 2017-07-14 16:37:39 · 2384 阅读 · 0 评论 -
STM32_IAP详解(有代码,有上位机)
Iap,全名为in applacation programming,即在应用编程,与之相对应的叫做isp,in system programming,在系统编程,两者的不同是isp需要依靠烧写器在单片机复位离线的情况下编程,需要人工的干预,而iap则是用户自己的程序在运行过程中对User Flash 的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级原创 2017-12-25 17:14:10 · 2980 阅读 · 3 评论 -
nRF24L01单片机通信的总结--看了就会用了
1周时间,我从一个没用过STC单片机,不知道什么叫SPI接口的“文盲”,把nRF24L01的整个通信过程弄到完全没有bug.。兴奋之余来小屁一下。给那些正在奋斗着这个牛逼的芯片的小牛们小炫一下。希望有所帮助。屁话少说。正题: 基本的东西我理解了,那就是:1.用5根线的SPI接口向2401发送数据或指令。2.芯片在每次上电的时候都需要进行一番配置。这些配置数据,就是所谓的指令了。3.配置完原创 2018-01-01 19:34:32 · 17750 阅读 · 4 评论