目录
一、代码管理(文件组织)
二、程序设计思路
三、单片机程序
四、程序检查
五、遇到陌生程序表达解决思路以及办法
六、程序优化思路
往期系列文章:
1、裸机项目开发经验分享 - 完整开发流程介绍(项目规划与执行、器件选型、资料检索、产品测试思路等)
2、裸机项目代码设计与管理 - 项目程序的组织管理、设计优化思路等经验分享
3、裸机编程与调试 - 在项目中遇到的各类问题,解决经验分享(常见新手问题)
4、在实际开发项目中总结的硬件调试经验分享 - 调试目标、方法,以及常见调试问题解决
5、基于AltiumDesigner软件的PCB,原理图设计完整介绍,项目经验分享 [硬件开发设计]
6、硬件开发设计 - 焊接电路板,介绍焊接概念,焊接步骤,常见错误,难点等
7、电池供电应用中的电源设计:干电池特性了解、LDO与DC-DC选型设计、电流检测方案要点
项目的组织管理需要时刻进行,不管小型项目还是大型项目都必须有良好的管理手段和机制,这样项目才得以继承和扩展;
一、代码管理(文件组织)
代码管理的核心以及一般方式
1、参考一些系统的写法:按照模块来划分管理(这无疑会增加代码的复杂性);
2、对于逻辑紧密的模块,建议分工程方式进行管理,(虽然麻烦,但安全性较好);
3、善于利用宏定义复用代码;相关的几个语句 #if, #elseif,#else, #endif;
代码管理内容
1、函数的写法(代码的精简)
a、只有80%相同的代码才考虑合并;
b、函数的写法就是初级编程的精髓,测试函数的健壮性十分重要,尽可能多的数据和情况去测试;
2、文件的摆放:
a、模块化处理;
b、变量的管理(放在属于自己模块的文件中);
3、文件要集中;
4、耦合性低;
5、避免出现一对多的关系(不同的c、h文件相互纠缠);
6、驱动相关与应用相关充分剥离;
7、相应的全局变量、宏定义、全局数组应放置对应的.h文件中!
程序移植
1、框架的重整和拆解(保留核心);
2、底层驱动(如通讯接口定义、GPIO配置等)
3、缓冲区的设置、尽量少设置全局变量、将全局变量转化为局部变量(减少内存占用);
4、屏蔽无用的操作与变量定义;
5、注重优秀数据结构、数据流通的积累,用以替换;
二、程序设计思路
程序框架搭建(系统设计)与代码实现
1、参考优秀的系统设计:
a、代码重用设计(来源可以是开发板、自己积累的代码、网上开源项目);
b、开源操作系统、开源协议栈、开源设计模式等等;
c、善于学习模仿优秀的代码;
2、基于裸机
系统设计:
a、系统的设计必须有拓展性和兼容性,否则无意义;
b、系统设计实质就是建立门口(统一管理程序流程的进出),注意门口太多,十分不利于管理;
3、实现软件定时的两种方式:a、利用定时器进行查询判断超时;b、等待超时( do{ } while(); );
4、单片机延时:a、定时器延时;b、软件延时(空循环操作);
5、提高健壮性的常见途径:a、添加检测机制;b、等待超时; c、信号应答;d、编码校验;
6、裸机系统任务调度设计
a、两种形式:
1)延时等待任务;
2)判断执行条件,不符合则等待系统下一轮的到来;
b、额外的任务:
1)额外的任务,定时与中断;
7、带显示页面(OLED)的裸机系统设计思路:
a、外界接口不放置在主循环;实现单线程(同一时机限定一定的操作,这样的好处将大大提高裸机系统稳定性);
b、限定函数的输出输入,每一个函数包含一定的动作;依靠页面函数的互相跳转实现转移;
c、显示与执行相对独立(最大增加程序的灵活性);
d、利用指针函数;进行显示页面操作;
三、单片机程序
如何看懂单片机程序
1、先把硬件连接看懂;
2、硬件的相关文档的主要编码技术与注意看懂;
3、把主函数大概浏览一遍;
4、把各个调用函数理解清楚;
5、按照控制流程思路把程序走一遍;
6、必要时可以运行仿真帮助理解以及勘误;
7、仿真时可以借助串口打印要判断程序的BUG以及优化程序;
8、把握整个程序的流走方向:
a、永远的循环结构(只有中断与查询等待能让循环程序停下来);
b、中断总是定时或者不定时地插入;
c、注意有些语法表达式区别与不同的平台(VC/KEIL/IAR)以及语言标准(C99/C51),有不同的效果跟表达方式;
处理新项目程序
1、面对一项新项目程序,可以了解大概框架,简单的应用实现,熟悉内部操作原理;然后在应用工作时深化处理;
2、在没有真正实践工作时是不可能做到精通的,精通实际就是能够熟悉运用以及对内部的架构熟悉;
3、单片机程序并没有想象中复杂(结合实际应用): 硬件程序 = API + 操作流程控制;
4、软件就是一个集合体(简单): 将底层驱动加以流程进而集成(越高级就越多次集成);
5、程序的核心在于实现某一功能(非外设)的流控(低功耗与防干扰);
6、逆反思维地看待新程序,应该将其划分为不同的模块,模块再细分为子项,注意表达;在脑海中形成一套操作;
7、将开发板例程单步运行,摸索清楚如何控制,然后才能加以修改,但一般不需要深究底层;
8、程序可以快速积累,多读多写例程,以及优秀的框架;
学习编程程序
1、学习编程最好的方法之一就是阅读源代码;
2、看得懂的书,请仔细看;看不懂的书,请硬着头皮看;
3、别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍;
4、不要因为C和C++中有一些语法和关键字看上去相同,就认为它们的意义和作用完全一样;
5、请把书上的程序例子亲手输入到电脑上实践,即使配套光盘中有源代码;
6、不要漏掉书中任何一个练习题——请全部做完并记录下解题思路;
7、记录下在和别人交流时发现的自己忽视或不理解的知识点;
编写程序
1、新手采用流程图;熟练后采用伪代码;
2、掌握 融入 自顶向下,逐步细化过程;
3、遵守模块化设计,最后结构化代码;
4、注意子模块的封装性:耦合性越少愈好;
5、目标:运行效率高,占用内存少;
6、把实际逻辑弄清楚,动手前先设计好思路;
7、用自然语言简单描述,制成流程图;检查有无逻辑漏洞;
8、翻译成标准程序;
四、程序检查
1、规范类检查:
a、视乎项目组要求而定;
2、安全类检查:
a、数组下标是否溢出;
b、注意使用强制转换类型;
c、每个编译器都有自己运算规则:自右向左(通常为这种);自左向右;
五、遇到陌生程序表达解决思路以及办法
1、书籍查找法,清楚大概知识点,模糊查找相关板块(推荐);
2、百度引擎搜索相关问题时,必须精简问题的描述
a、软件/硬件平台+问题出处;
b、可以适当转换问题的描述;
c、浏览多几页;
3、各大论坛发帖,以及技术群聊求助;
4、请教别人;
六、程序优化思路
*注意在编写程序的时候:1)参考好的框架 2)优化是从编写时开始考虑的;
1、代码是否易于管理,文件分类明晰?
2、代码是否过于臃肿,占空间;
3、函数的封装性,传递的参数合理?函数之间的耦合性严重?尽量做到解耦。
4、表达怎样更精简?存在漏洞?
5、简洁清晰,尽量少的代码实现同一功能;提升运行速度;
6、循环分段优化;
7、同时声明多个变量优于单独声明变量;
8、位移优于除法;