401

帖子

4

TA的资源

版主

41
 
看着不错
此帖出自stm32/stm8论坛
 

回复

43

帖子

0

TA的资源

一粒金砂(中级)

42
 
好工具! 用在轻复杂度 资源有限的应用上大有好处. 关注...
此帖出自stm32/stm8论坛

点评

arm的m系列都没有问题,还有单片机之类。。。。。。  详情 回复 发表于 2014-12-15 08:16
 
 

回复

183

帖子

4

TA的资源

一粒金砂(高级)

43
 
值得学习,佩服楼主,能集成到一个文档中学习就好了
此帖出自stm32/stm8论坛

点评

提议不错,就是没有时间搞。。。  详情 回复 发表于 2014-12-15 08:16
 
 

回复

350

帖子

0

TA的资源

纯净的硅(中级)

44
 
我也弄了一个自己用,任务,任务优先级,任务响应级别,任务和定时任务,调试模块,事件处理,核心的消息机制,没有任务切换的一般就这些了。
此帖出自stm32/stm8论坛

点评

能否恭喜出来大家学习一下??????????  详情 回复 发表于 2014-12-15 08:17
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

45
 
moonyuan 发表于 2014-12-13 21:46
好工具! 用在轻复杂度 资源有限的应用上大有好处. 关注...
arm的m系列都没有问题,还有单片机之类。。。。。。
此帖出自stm32/stm8论坛
 
个人签名我的博客
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

46
 
lcdi 发表于 2014-12-14 15:27
值得学习,佩服楼主,能集成到一个文档中学习就好了
提议不错,就是没有时间搞。。。
此帖出自stm32/stm8论坛
 
个人签名我的博客
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

47
 
终极菜鸟 发表于 2014-12-14 19:37
我也弄了一个自己用,任务,任务优先级,任务响应级别,任务和定时任务,调试模块,事件处理,核心的消息机制,没有任务切换的一般就这些了。
能否恭喜出来大家学习一下??????????
此帖出自stm32/stm8论坛
 
个人签名我的博客
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

48
 
八 按键处理



在单片机中,常见的按键,不外乎短按、长按、连续按等3种模式,而这三种按键都是的通过按键时间的长短进行区分的,所以,只要在时间上进行处理既能实现这三种按键的处理。

1. 结构体

  1. #if (OS_KEY_MAX > 0)
  2. typedef struct
  3. {
  4.     U8         Fun;                                                             // 功能[每个按键可以实现的按键]
  5.     U16        Tim;                                                             // 时间值[长按或连续按的时间,单位:系统节拍]
  6.     U16        Cnt;                                                             // 计时时间[单位:系统节拍]
  7.    
  8.     OS_KEY_ENM Vlu;                                                             // 按键值
  9.     OS_BOOL    Sta;                                                             // 按键状态

  10.     OS_BOOL    (*Pin)(void);                                                        // 读管脚
  11.    
  12. } OS_KEY_STR;

  13. OS_EXT OS_KEY_STR OSKey[OS_KEY_MAX];
  14. #endif
复制代码


2. 初始化

  1. /**************************************************************************************
  2. * FunctionName   : OSKeyInit()
  3. * Description    : 初始化
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_KEY_MAX > 0)
  8. void OSKeyInit(void)
  9. {
  10.     for (U8 i=0; i<OS_KEY_MAX; i++)
  11.     {
  12.         OSKey[i].Fun = 0;
  13.         OSKey[i].Tim = 0;
  14.         OSKey[i].Cnt = 0;
  15.         
  16.         OSKey[i].Vlu = OS_KEY_NLL;
  17.         OSKey[i].Sta = OS_FALS;
  18.         OSKey[i].Pin = NULL;
  19.     }
  20. }
  21. #endif
复制代码


3. 创建

  1. /**************************************************************************************
  2. * FunctionName   : OSKeyCreate()
  3. * Description    : 创建Key
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_KEY_MAX > 0)
  8. OS_BOOL OSKeyCreate(U8 num, U8 fun, U16 tim, OS_BOOL (*pin)(void))
  9. {
  10.     if (num >= OS_PWM_MAX)
  11.     {
  12.         OSSys.Err |= OS_ERR_KCF;                                                // 创建错误
  13.         return OS_FALS;
  14.     }  
  15.   
  16.     OSKey[num].Fun = fun;
  17.     OSKey[num].Tim = tim;
  18.     OSKey[num].Cnt = 0;
  19.    
  20.     OSKey[num].Vlu = OS_KEY_NLL;
  21.     OSKey[num].Sta = OS_FALS;
  22.     OSKey[num].Pin = pin;
  23.     return OS_TRUE;
  24. }
  25. #endif
复制代码


4. 按键处理

按键处理在系统节拍处理函数中调用,如果读者觉得太浪费资源了,可以考虑建立个任务实现循环处理。
  1. /**************************************************************************************
  2. * FunctionName   : OSKeyPro()
  3. * Description    : 按键处理
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_KEY_MAX > 0)
  8. void OSKeyPro(void)
  9. {
  10.     for (U8 i=0; i<OS_KEY_MAX; i++)
  11.     {
  12.         if (OSKey[i].Vlu != OS_KEY_NLL) return ;
  13.         
  14.         if (OSKey[i].Pin() == OS_TRUE)                                          // 读按键
  15.         {
  16.             if (OSKey[i].Sta == OS_FALS)                                        // 可以处理按键
  17.             {
  18.                 if (++OSKey[i].Cnt >= OSKey[i].Tim)                             // 长按或连续按
  19.                 {
  20.                    OSKey[i].Cnt = OSKey[i].Tim;
  21.                    if (OSKey[i].Fun & OS_KEY_LNG)                               // 长按
  22.                    {
  23.                        OSKey[i].Vlu = OS_KEY_LNG;
  24.                        OSKey[i].Sta = OS_TRUE;                                  // 置按键标记
  25.                    }
  26.                    else if (OSKey[i].Fun & OS_KEY_CTN)                          // 连续按
  27.                    {
  28.                        OSKey[i].Vlu = OS_KEY_CTN;     
  29.                    }
  30.                 }
  31.                 else if (OSKey[i].Cnt == 1)                                     //
  32.                 {
  33.                     if (OSKey[i].Fun & OS_KEY_SNG)                              // 有单次按键功能
  34.                     {
  35.                         OSKey[i].Vlu = OS_KEY_SNG;
  36.                     }
  37.                 }
  38.             }
  39.         }
  40.         else
  41.         {
  42.             OSKey[i].Vlu = OS_KEY_NLL;
  43.             OSKey[i].Cnt = 0;
  44.             OSKey[i].Sta = OS_FALS;
  45.         }
  46.     }
  47. }
  48. #endif

  49. /**************************************************************************************
  50. * End Of File                  
  51. **************************************************************************************/
复制代码


此帖出自stm32/stm8论坛
 
个人签名我的博客
 
 

回复

138

帖子

0

TA的资源

一粒金砂(中级)

49
 
学习了
此帖出自stm32/stm8论坛
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

50
 
楼主放个LPC1768的keil工程出来试试啊。
此帖出自stm32/stm8论坛

点评

自从使用了IAR就再也不想用KEIL了,后面会放IAR的工程,可以自行移植。。  详情 回复 发表于 2014-12-15 12:11
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

51
 
zenith1032 发表于 2014-12-15 11:15
楼主放个LPC1768的keil工程出来试试啊。
自从使用了IAR就再也不想用KEIL了,后面会放IAR的工程,可以自行移植。。
此帖出自stm32/stm8论坛
 
个人签名我的博客
 
 

回复

96

帖子

0

TA的资源

一粒金砂(中级)

52
 
由于单片机处理能力有限,所以我觉得一个类操作系统(在普通MCU上运行)最主要的有两点:
1,尽量减少操作系统运行所占用的时间。
2,操作系统和驱动以及和应用程序接口的简化性。


此帖出自stm32/stm8论坛

点评

说得有道理。。。。。。。。。。  详情 回复 发表于 2014-12-15 13:38
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

53
 
flander_cx 发表于 2014-12-15 13:03
由于单片机处理能力有限,所以我觉得一个类操作系统(在普通MCU上运行)最主要的有两点:
1,尽量减少操作系统运行所占用的时间。
2,操作系统和驱动以及和应用程序接口的简化性。

说得有道理。。。。。。。。。。
此帖出自stm32/stm8论坛
 
个人签名我的博客
 
 

回复

86

帖子

1

TA的资源

一粒金砂(中级)

54
 
时间片么
此帖出自stm32/stm8论坛
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

55
 
九 PWM



在很多时候我们需要可以控制频率很占空比等的PWM波,而使用定时器产生即浪费定时器资源又不太好控制,特别是像控制蜂鸣器、LED闪烁等应用时。为此我们编写了一个可以随意调节的PWM输出控制模块。

1. 结构体

  1. /**************************************************************************************
  2. * Macro Definition                                                
  3. **************************************************************************************/
  4. typedef enum
  5. {
  6.     OS_PWM_PAY = 0,                                                             // 按次
  7.     OS_PWM_CYC = 10,                                                            // 周期性
  8.    
  9. } OS_PWM_ENM;
复制代码


  1. /**************************************************************************************
  2. * Variable definition                                               
  3. **************************************************************************************/       
  4. #if (OS_PWM_MAX > 0)
  5. typedef struct
  6. {
  7.     U8   Tim;                                                                   // 工作次数
  8.     U8   Dty;                                                                   // 占空比
  9.     U16  Cyc;                                                                   // 控制周期[单位:系统节拍]
  10.     U16  Opn;                                                                   // 打开时间
  11.     U16  Cls;                                                                   // 关闭时间
  12.    
  13.     void (*Out)(OS_SWT swt);                                                        // 输出
  14.   
  15. } OS_PWM;

  16. OS_EXT OS_PWM OSPwm[OS_PWM_MAX];
  17. #endif
复制代码


2. 初始化

  1. /**************************************************************************************
  2. * FunctionName   : OSPwmInit()
  3. * Description    : 初始化
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_PWM_MAX > 0)
  8. void OSPwmInit(void)
  9. {
  10.     for (U8 i=0; i<OS_PWM_MAX; i++)
  11.     {
  12.         OSPwm[i].Tim = 0;
  13.         OSPwm[i].Dty = 0;
  14.         OSPwm[i].Cyc = 0;
  15.         OSPwm[i].Opn = 0;
  16.         OSPwm[i].Cls = 0;  
  17.         OSPwm[i].Out = NULL;
  18.     }
  19. }
  20. #endif
复制代码


3. 创建

  1. /**************************************************************************************
  2. * FunctionName   : OSPwmCreate()
  3. * Description    : 创建PWM
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_PWM_MAX > 0)
  8. OS_BOOL OSPwmCreate(U8 num, U8 tim, U8 dty, U16 cyc, void (*pOut)(OS_SWT swt))
  9. {
  10.     if (num >= OS_PWM_MAX)
  11.     {
  12.         OSSys.Err |= OS_ERR_PCF;                                                // 创建错误
  13.         return OS_FALS;
  14.     }  
  15.   
  16.     OSPwm[num].Tim = tim;                                                       // 工作次数
  17.     OSPwm[num].Dty = dty;                                                       // 占空比
  18.     OSPwm[num].Cyc = cyc;                                                       // 控制周期[单位:系统节拍]
  19.     OSPwm[num].Opn = 0;                                                         // 打开时间
  20.     OSPwm[num].Cls = 0;                                                         // 关闭时间
  21.     OSPwm[num].Out = pOut;
  22.    
  23.     return OS_TRUE;
  24. }
  25. #endif
复制代码


4. 修改参数

  1. /**************************************************************************************
  2. * FunctionName   : OSPwmMdfPar()
  3. * Description    : 修改PWM的参数
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_PWM_MAX > 0)
  8. OS_BOOL OSPwmMdfPar(U8 num, U8 tim, U8 dty, U16 cyc)
  9. {
  10.     if (num >= OS_PWM_MAX)
  11.     {
  12.         return OS_FALS;
  13.     }  
  14.    
  15.     OSPwm[num].Tim = tim;                                                       // 工作次数
  16.     OSPwm[num].Dty = dty;                                                       // 占空比
  17.     OSPwm[num].Cyc = cyc;                                                       // 控制周期[单位:系统节拍]
  18.     OSPwm[num].Opn = 0;                                                         // 打开时间
  19.     OSPwm[num].Cls = 0;                                                         // 关闭时间
  20.    
  21.     return OS_TRUE;
  22. }
  23. #endif
复制代码


5. 单次控制

  1. /**************************************************************************************
  2. * FunctionName   : OS_PwmSngCtrl()
  3. * Description    : 单次控制
  4. * EntryParameter : None
  5. * ReturnValue    : 完成返回OK
  6. **************************************************************************************/
  7. #if (OS_PWM_MAX > 0)
  8. OS_STT OS_PwmSngCtrl(U8 num)
  9. {
  10.     if (OSPwm[num].Opn < (OSPwm[num].Cyc * OSPwm[num].Dty) / 100)
  11.     {
  12.         OSPwm[num].Opn++;
  13.         OSPwm[num].Out(OS_OPEN);                                                // 打开
  14.         return OS_NOT;
  15.     }
  16.     else if (OSPwm[num].Cls < (OSPwm[num].Cyc * (100-OSPwm[num].Dty)) / 100)   
  17.     {
  18.         OSPwm[num].Cls++;
  19.         OSPwm[num].Out(OS_CLOSE);                                               // 关闭
  20.         return OS_NOT;
  21.     }
  22.     else
  23.     {
  24.         OSPwm[num].Opn = 0;
  25.         OSPwm[num].Cls = 0;
  26.         return OS_OK;
  27.     }
  28. }
  29. #endif
复制代码


6. PWM输出

输出控制函数在时间片处理函数中调用,如果怕浪费太多中断时间,可以考虑改成一个任务中扫描。
  1. /**************************************************************************************
  2. * FunctionName   : OSPwmPro()
  3. * Description    : PWM输出处理
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_PWM_MAX > 0)
  8. void OSPwmPro(void)
  9. {
  10.     for (U8 i=0; i<OS_PWM_MAX; i++)
  11.     {
  12.         if (OSPwm[i].Tim >= OS_PWM_CYC)                                         // 周期性
  13.         {
  14.             OS_PwmSngCtrl(i);
  15.         }
  16.         else if (OSPwm[i].Tim > OS_PWM_PAY)                                     // 按次数
  17.         {
  18.             if (OS_PwmSngCtrl(i) == OS_OK)
  19.             {
  20.                 OSPwm[i].Tim--;                                                 // 完成一次
  21.             }
  22.         }
  23.     }
  24. }
  25. #endif
复制代码


此帖出自stm32/stm8论坛
 
个人签名我的博客
 
 

回复

128

帖子

0

TA的资源

一粒金砂(中级)

56
 
谢谢分享~ 应该好好向楼主学习
此帖出自stm32/stm8论坛
 
 
 

回复

26

帖子

0

TA的资源

一粒金砂(中级)

57
 
如果可以把代码托管一下就好了,,,这样就可以有更多的人来参于,,,
此帖出自stm32/stm8论坛

点评

如果大家需要可以把源码发上论坛。。。。。。  详情 回复 发表于 2014-12-16 11:02
 
 
 

回复

637

帖子

2

TA的资源

版主

58
 
可以看明白一点,主要以系统定时(包括软件定时)为主,作为OS基础平台,对于从无OS系统转到含OS系统的软件比较合适;
此OS系统的建壮性,可靠性要进行全面测试才能过到不错的效果;
而且,对实时性来说,还是差了一点(较触发式系统而言)。
不过,此OS较我轻量级,所以在人机界面、时间控制、简易数据收发、数据采集比较合适。
此帖出自stm32/stm8论坛

点评

说得不错,和有抢占的OS比较当然实时性要差一些。。。。。。。。  详情 回复 发表于 2014-12-16 10:59
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

59
 
建议楼主写一个PDF的说明文件或者是出一本书来讲解
此帖出自stm32/stm8论坛

点评

写文档倒是不错,但到现在为止还没有很满意,等完善后可以考虑些一个。。。  详情 回复 发表于 2014-12-16 11:01
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

60
 
dingzy_2002 发表于 2014-12-16 10:37
可以看明白一点,主要以系统定时(包括软件定时)为主,作为OS基础平台,对于从无OS系统转到含OS系统的软件比较合适;
此OS系统的建壮性,可靠性要进行全面测试才能过到不错的效果;
而且,对实时性来说,还是差了一点(较触发式系统而言)。
不过,此OS较我轻量级,所以在人机界面、时间控制、简易数据收发、数据采集比较合适。
说得不错,和有抢占的OS比较当然实时性要差一些。。。。。。。。
此帖出自stm32/stm8论坛
 
个人签名我的博客
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表