2991|10

7815

帖子

57

TA的资源

裸片初长成(中级)

楼主
 

只为uC而生,uS成长历程 10 [复制链接]

今晚不讲废话,快速进入主题。

在我们开始 在具体mcu上实现之前,我们还要把用到的 那些 公共函数 弄好。

公共函数,是一组不涉及任何具体硬件操作(说到底就是 底层寄存器),而只是一些逻辑功能或者通用操作。
所以,它们是 真正的 独立于 单片机。

只需要实现一次,就可以永久使用。
因此,它们是最适合封装成 二进制文件 的部分。
此帖出自编程基础论坛

最新回复

先顶一下下 太常用的函数是不是可以用汇编写呢  详情 回复 发表于 2013-8-9 12:19
点赞 关注
 

回复
举报

9183

帖子

6

TA的资源

管理员

沙发
 
来坐个沙发
此帖出自编程基础论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

板凳
 
具体到每个人而言,使用到的公共函数到底都有什么,会受到他从事的领域影响。
因此,这里,我只能发我个人使用的公用函数库。

为了吸收更多人的公用函数库,我将在简单介绍我的 函数库的基本情况后,将对此做一些简单要求。

对于一个库而言,一般来说,只需要看它的头文件就足以知道它是干什么用的。
——而很多时候,只提供二进制可执行文件的第三方库来说,你也只能看到头文件。

所以,下面我是贴上头文件——别担心,完整源码我随后附件附上,这里只是节省篇幅。
  1. #include "typedef.h"

  2. void Dec_2_String(U32 Value,U8 *buffer);
  3. void Clear_Buffer(U8 *buffer,U8 length,U8 Fill);

  4. U16 Combine_2_byte(U8 High,U8 Low);
复制代码
  1. #include "typedef.h"

  2. U16 Liner_PositiveFunc(U16 Base,U16 rate,U16 Index);
  3. U16 Liner_NegativeFunc(U16 Base,U16 rate,U16 Index);
复制代码
  1. #ifndef _ASYN_DELAY_
  2. #define _ASYN_DELAY_

  3. #include "typedef.h"
  4. #include "LogicDef.h"

  5.     void Nopdelay(U32 delay);
  6.     void Delay(U32 delay);
  7.    
  8.     //=======================================================
  9.     typedef struct
  10.     {
  11.         U32 MaxDelay;
  12.         U32 Delay;
  13.     }DelayStruct;
  14.    
  15.     // operation on DelayStruct ================================
  16.     void Initial_DelayStruct(DelayStruct *Str,U32 MaxDelay);
  17.     void Clear_DelayStruct(DelayStruct *Str);
  18.     U8 IsDelayUp(DelayStruct *Str);
  19.     void IncreaseDelay(DelayStruct *Str);
  20.    
  21.     //=======================================================
  22.     void SystemTimer_Increase(void);
  23.     U32 getSystemTimer(void);
  24.    
  25.     void get_SystemTime_Stamp(U32 *Stamp);
  26.     U8 IsStampDue(U32 Stamp,U32 DueTime);

  27. #endif
复制代码
上面是我较早一个在家里自己用stm8s时使用的一个库
下面是我做cc2530的项目时,用到的公共库
  1. #ifndef _UTILITY_
  2. #define _UTILITY_

  3. #include "typedef.h"

  4. int Create_SimpleVerify(U8 *buffer,U8 VerifyLen,U8 *Verify);
  5. int Check_SimpleVerify(U8 *buffer,U8 VerifyLen,U8 Verify);
  6. int SimpleVerify_Test(void);

  7. int String_Copy(U8 *dest,U8 *source,U8 length);
  8. int String_Clear(U8 *buffer,U8 length);
  9. int String_Joint(U8 *dest,U8 *source,U16 start,U8 length);

  10. #endif
复制代码
  1. #ifndef _RECV_TIMEOUT_
  2. #define _RECV_TIMEOUT_

  3. #include "typedef.h"

  4. typedef struct
  5. {
  6.     U32 Timer;
  7.     U8  RecvLen;
  8.     U8  CurrentLen;
  9.     U8  RecvBuff[250];   
  10. }TimeoutStr;

  11. void runTimer(U32 *Timer);
  12. void resetTimer(U32 *Timer);

  13. //==============================================================================

  14. int recvBuffer(TimeoutStr *Str,U8 *buffer,U8 len);
  15. int recvByte(TimeoutStr *Str,U8 Data);

  16. int IsTimeout(TimeoutStr *Str,U32 nTimeoutMs)  ;

  17. //==============================================================================
  18. void TimeoutStr_Initial(TimeoutStr *Str);

  19. int recvTimeoutData(TimeoutStr *Str,U8 *Buf,U32 Timeout);

  20. #endif
复制代码
  1. #include "typedef.h"

  2. void Nopdelay(U32 Nop);
  3. void Delay(U32 delay);
复制代码

[ 本帖最后由 辛昕 于 2013-8-8 23:15 编辑 ]
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

4
 
从上面的函数声明,我们看到了函数名。

我们可以看出,这些公共函数主要分为三大类

1.一系列 缓冲区的操作函数
   比如连接,清空,复制;
2.延迟函数;
3.特定功能,比如说 超时缓冲机制;

尽管因为没有做好同步工作,因此,这两组接口略有不同
——我们第一步要做的事情就是,从现在开始,封装一个统一的 公共库。

这不是一个大问题。
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

5
 

公共函数库 封装的简单原则 1

作为程序员,特别是不是为同一个公司,同一个组织工作的散布于各地,甚至是各国的程序员来说。
要规定条条框框是非常不现实的,我对此深有感受。
程序员天生有一个优点或者也是要命的缺点
就是基本上都是坚持,或者说顽固。

他们疯狂地相信自己的某些观点,不管是否真的合适甚至对错。
当然我自己也是如此。

Pete Goodllife甚至说,很遗憾,越优秀的程序员越固执。

因此,我们采取的思路是
尽可能减少规则。
事实上,对于我自己也是,只有规则简单,明了,大家才更容易遵守
而且我们渐渐会发现,其实,真正重要的原则真的不多。
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

6
 

公共函数库 的简单封装原则2

首先,作为一个非常重要的地方——目前也是我唯一觉得很遗憾的一个细节。

那就是数据类型的封装。
我们知道,在不同字长的机器上,几种常见的数据类型的字长是不完全一致的。

比如在我接触过的两种8位机上 51 和 stm8s上
int 都是16位;
在我接触的一款stm32机器上,int自然是32位。

而char一般都是8位,而long或者 long  long有时都是64位,而在一些机器上我发现甚至定义不了64位数据类型。

诸如此类。我们必须小心。
因为对数据类型的错误假设是导致初级程序bug的一大原因。

这个问题我们先提出来,怎么解决,过后再说;

2.函数绝对不能随便,擅自,滥用 死循环结构。
   这是因为这部分代码是应用者看不到也无法修改的。如果到处混合着死循环结构,可能对调用引发不确定的影响,影响错误定位;
   当然,说的是不能随便滥用,但不是绝对不能用;
   在某些特定问题,是不可不用,但是,使用了的话,一定要通过某些状态让应用者了解。
   或者改变实现策略,尽量避免 死循环结构的存在;

3.一套统一的简单而确定的状态返回值;
   一般而言,但出现参数错误(比如传入地址是NULL等)都返回-1,属于该函数调用出现错误;
    此外,函数的功能正确完成,这里有两种方式,有一种是返回0,而我个人选择返回1;
    这是因为我有时会使用到一些 异步调用的函数,我需要区分 正常执行(但未完成要求动作) 和 已经完成动作。 我用0表示前者,1表示后者;

恩,就这些,没别的了。

[ 本帖最后由 辛昕 于 2013-8-8 23:34 编辑 ]
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

7
 
我检查了一下我电脑里的所有项目,以前的,最近的。
发现我用的共同函数的的确确就这两个版本。

还好比较简单
然而,它们出入确实比较大。
于是,我决定,选择一个比较正式的,然后把另一个里面所独有的函数增加到前者进去,从而形成一个完整的库。

从此我只使用它,不管是什么单片机。
乃至是PC程序。

在这里,我选择我用在cc2530上的作为主体,而把stm8s上的新功能增加过去。

       首先,在stm8s里有两组 16位,32位数据 拆分成8位数据的功能,以及反之组合起来的函数。这个函数很有用,必须增加近来。
       但是我们也看到,在stm8s的项目里,我的这些函数是胡乱组合在一个源模块里的,不能随便破坏cc2530这个整理好的样子,因此我们考虑把它放到一个新模块里,起名为 DataConvert.c

2.接着是一个数学函数功能
   那两个函数是 一次函数,一个是正斜率,一个负斜率,但我个人认为,这个函数封装的不够好,而且,并不那么常用,因此我们暂时不管他。

3.接着是一个我此前的和超时机制中 超时定时器 很类似的一个实现方案。
   显然它有所重复,其次,我现在觉得我当时得封装非常不好。
   而且我记得我应该已经没有再使用这组函数了。
   所以,我也不把它加进来。

那么,说起来,我只需要 把 第一部分 加进来。

但这个时候,我忽然想起,在我当前做的一个stm8s的项目里,似乎还有很多其他功能,看来我还是使用了不一样的公共函数?
   所以我还要回去好好检查,并找出来。
一并加进来,以便我可以把 我用在cc2530上的公共函数一并替换我做的stm8s项目中的公共函数库。
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

8
 

公共函数库的补充

的确,我发现了漏了一部分
还好不是太多

但是我发现了一个小麻烦,它和我在实现 超时接受机制里的一部分略有重合部分。
就是那个 超时定时器。
所以,这里看来还得考虑组合起来。
  1. #ifndef _ASYN_TIMER_
  2. #define _ASYN_TIMER_

  3. #include "typedef.h"
  4. #include "CommonMacro.h"

  5. void ClearTimer(U32 *AsynTimer);
  6. void RunTimer(U32 *AsynTimer);
  7. U8 IsTimeout(U32 AsynTimer,U32 MaxTimeout);

  8. U8 IsMaxTimeout(U32 *Timer,U32 MaxTime);
  9. U8 IsTrueTimeout(U8 LogicFlag,U32 *Timer,U32 MaxTime);

  10. #endif
复制代码
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

9
 

今晚到此为止

今晚略有点过意不去
因为我还在折腾那个超声波测距模块

结果没意识到已经那么晚了。
到了11点才开始。
所以今晚没干成什么实际的代码封装。

只能押后了。

晚安!
此帖出自编程基础论坛
 
 
 

回复

954

帖子

0

TA的资源

纯净的硅(初级)

10
 
先顶一下下
太常用的函数是不是可以用汇编写呢
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

11
 

回复 10楼247153481 的帖子

我个人是不喜欢用汇编的。
因为汇编依赖机器
此帖出自编程基础论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表