程序的模块化的一些见解5-移植性-实例说明

我一直以来认为技术性的文档很重要,但事实上我做得不好,主要是我想做,但我做得不够仔细,不够清晰,不够完整。不过,我一直在改善着,希望各位多多指点。

今天我想表达的是一个关于程序模块化的移植性,通过一个实例来描述。说得好,大家顶一下,说得不好,大家顶两下,嘻嘻。

函数功能很简单:扫描LED  LED的显示有不亮、闪烁、常亮 3种方式,其中闪烁次数是有规定的,我的是3次(具体是 闪烁3次,周期是0.5秒,即亮0.25秒 灭0.25秒)

F_FlsLock = 1;//启动时闪烁3次

F_FlsLock =0; F_LockEn =0;//LED不亮

F_FlsLock = 0; F_LockEn =1;//LED常亮

这是我第一次写的程序,5毫秒扫描一次。

void LedLock(void)
{
	static uint8 TimeFlash = 0;//闪烁时间
	static uint8 FlashTimes = 0;//闪烁次数

	if(F_FlsLock)
	{
	  if(++TimeFlash <= 50)
	  {
	  	 P_LED = 1;
	  }
	  else if(++TimeFlash <= (100-1))
	  {
	  	  P_LED = 0;
	  }
	  else
	  {
	  	TimeFlash = 0;

		if(++FlashTimes >= 3)
		{
		  FlashTimes = 0;
		  F_FlsLock = 0;
		}

	  }
	}
	else
	{ 

	   if(F_LockEn)
	   {
		P_LED = 1;
	   }
	   else
	   {
	       P_LED = 0;
	   }
	}
}

这是我第二次写的程序,5毫秒扫描一次。

void LedLock(void)
{
	static uint8 TimeFlash = 0;//闪烁时间
	static uint8 FlashTimes = 0;//闪烁次数

	if(F_FlsLock)
	{//需要闪烁
	  if(++TimeFlash <= 50)
	  {
	  	 F_LedLockEn = 0;
	  }
	  else if(++TimeFlash <= (100-1))
	  {
	  	 F_LedLockEn = 1;
	  }
	  else
	  {
	  	TimeFlash = 0;

		if(++FlashTimes >= 3)
		{
		  FlashTimes = 0;
		  F_FlsLock = 0;
		}

	  }
	}
	else
	{
	   F_LedLockEn = F_LockEn;
	}
}
//
	if(F_LedLockEn)
	{
	  	P_LED = 1;
	}
	else
	{
		P_LED = 0;
	}

表面可以看出,第2次的程序比第一次多了I个标志位F_LedLockEn 。

更深一点:如果这两个程序的移植性是那个好呢?这就是我今天主要说的,如果

这两个程序都用在一个相同的驱动电路,即VDD-LED-电阻-GND,那么

就没有什么区别。但如果用在复用,即按键和LED共用一个IO或者LED共

用COM,这时功能相同,LED驱动更改肯定要的,但判断是否显示和闪烁是

时间和次数可以不改,对此,如果抑制第一个程序,那得大改了,哈哈,

那又得浪费时间了,但第二个程序,只需要更改LED驱动方式,再通过

F_LedLockEn来确定是否亮与不亮即可。

总的来说,这里就是将判断LED是否亮的模块和LED驱动模块完全区分开,

这样,两个模块就可以单独移植和修改却不相互影响。

此篇见解至此已完,说得不好,欢迎扔砖。

点点滴滴的努力着!!!

程序的模块化的一些见解5-移植性-实例说明

时间: 2024-07-30 10:17:46

程序的模块化的一些见解5-移植性-实例说明的相关文章

程序的模块化的一些见解6-读牛人代码之感

今天看来一位牛人的程序,说是牛人,一点不夸张,在行业做了10年多,平时做的 项目快问题少,因为他有自己的成熟模块,自己也很熟悉,而且还是用汇编写的程 序,在控制方面很多客户见了之后,经常毫不犹豫选择他的程序控制.虽然我入行 也有3.4年,但就是很难看懂他的程序,个人觉得原因:1:没有注释2:缺少沟通 3:自己理解能力有限4:分格不一样. 因此,我觉得,为让自己可以被别人当为真正的牛人,写出来的代码可以让别 人看懂是一个必要的前提,当然,我也做得不好,我也一直向这方面靠近. 程序的模块化的一些见解

程序的模块化的一些见解2

在敲代码的时候,常常会遇到添加或者改动程序,此时,假设程序的逻辑 在没有全然理清时或者真有必要时,我们或许总喜欢添加一个标志位来达到改动程 序的目的.然而,这往往就会存在BUG.也许会是致命的隐形BUG,所以,按我的经验 来说,我建议专门写这样一个函数,我叫他ClearFlag,在这个函数,每次我添加一 个标志位如F_ONOFF,我都在函数ClearFlag中写入(F_ONOFF = 0;) ,这样,每次在 按键或者其它操作要启动工作时候,我都运行一次ClearFlag,避免由于某一位标志 位没

程序的模块化的一些见解3

现在的产品,往往不能一次性完成程序,客户体验后一般都会增加 或者修改程序.对于新增加的程序,我会常常增加多一个标志位或者 几个标志位来完成,因为这样比较直观容易理解,但逻辑性往往没有 那么好,致命的是,由于标志位没有及时清除,可能后果不堪设想, 当然,有经验的程序员往往会想到这个问题,就是增加时候,也考虑 了清除标志位. 因此,对于功能性比较重要的,还是建议完全理解 好程序,再进行规划,最后增加一个模块化(即一个新的函数)的程 序来完成新要求,同时新增加模块尽量用static变量,这样也不影响

程序的模块化的一些见解4

写好一个好的程序不容易,修改好一个好程序更难. 调试程序中,往往会遇到这样的情况,需要增加修改一个程序,这时程序员聪聪明明的更改了程序,好,测试也OK,就这样,把程序给封存了.这里,很多人都会犯了一个错误,就是注释的问题,因为我们发现,再过10天半个月,又来更改程序了,我们的第一感觉就是反感.但如果你之前已经完全有注释和提示功能更改的方向,就会增加自己的信心,也许也不会第一时间反感.为此,我认为,注释也是程序的重要部分,并且可能花的时间要比修改程序的时间还要长,自己有时间最后,没有时间要挤出时间

ffmpeg+sdl教程----编写一个简单的播放器4(让程序更模块化)

来源:http://blog.csdn.net/mu399/article/details/5815444 音频和视频之间的同步,再那之前需要先做一些准备工作. 为了让程序更模块化,便于扩展,需要把原来main函数中的各个功能模块代码分离出来放在相应的函数中.该教程和上个教程相比代码量和难度都增加很多,比上个教程使用了更多的线程,一定要理解清楚各个函数和数据结构之间的关联以及线程之间如何协同工作. [c-sharp] view plaincopy // ffmpegExe.cpp: 主项目文件.

通用,移植性非常好的验证码

原文:通用,移植性非常好的验证码 源代码下载地址:http://www.zuidaima.com/share/1550463570676736.htm 源代码截图:

C#控制台程序中处理2个关闭事件的代码实例

应用场景 我们开发的控制台应用,在运行阶段很有可能被用户Ctrl+C终止或是被用户直接关闭.如果我们不希望用户通过Ctrl+C终止我们的程序,就需要对Ctrl+C或关闭事件作处理. 处理方法 在.net平台下Console类有个CancelKeyPress事件可以处理Ctrl+C,不过对于直接关闭控制台应用,这种处理就无能为力了. 不过Windows API中有个SetConsoleCtrlHandler函数可以处理这两种关闭事件. C#处理代码如下: 代码如下: static class Pr

simotion ST编程,变量和程序的模块化

通过这几年的实践,对simotion的程序结构规划有了一些新的理解.工程师在面对项目时,经常有几个问题比较困惑. 目前面对的问题 1)如何理解其他人编写的程序 2)如何从程序中找到可以移植的部分 传统的程序结构 --- d_HMI_VAR --- d_Global_VAR (global variable of different module) --- d_IO_VAR --- p_module01 --- p_module02 优点:便于区分变量是否需要连接HMI 问题:不利于module的

微信小程序组件 模块化错和叹号

wxml 页面 <import src="/pages/lianxi/lianxi.wxml" />  //引入文件 <view style='position:fixed;left:0;top:0;'> <template is="showToastMyTan"> <text>haha</text> </template> </view> //模板 <template nam