47670|176

4998

帖子

19

TA的资源

裸片初长成(初级)

《时间片轮询tpOS v2.00》全网首发(绝对震撼)2016-02-03更新 [复制链接]

 
本帖最后由 zhaojun_xf 于 2016-2-3 15:32 编辑

       概述


     之前在论坛发表了自己的一些关于应用程序架构的话题,并以此为中心编写了本人的第二本书《ARM嵌入式应用程序架构设计实例精讲--基于LPC1700》。时隔一年多本人的第二版时间片轮询系统--tpOS V2.00正式面世。

        看过我的帖子或者看过我的书的网友应该都对第一版有些影响,第一版虽然能够实现程序编写,但并不完善,而且没有正式的版本及完整架构,见过很长时间的构思,本人重新编写了这个类系统,并以全新的名字tpOS闪亮登场。

       由于tpOS涉及的内容比较多,想很快说清楚不是一件容易的事情,本人将根据网友的反应逐步描述和讲述tpOS是构成好发展,期待有这方面爱好的网友和我一起完善这个不是操作系统的系统。

       命名:

      要想完善一个东西,名字是必不可少的,为此本人想了很久,最终把这个《时间片轮询》架构,正式命名为tpOS,相比网友应该知道这个名字的来历,t-time slice,p-Polling ,OS - Operating system。

      对于时间片轮询,很多网友都一直没有弄清楚,其实对于这个名词的解释,确实很难说清楚,不同的书籍有不同的描述,其中比较常见的有:

1. 每个任务划分一定的运行时间,运行时间结束后切换的其他任务。

2. 每个任务划分一定的轮询时间,而运行时间是无法预知的。

对此,您是怎样看的?

     需要特别说明的是:本人说是时间片将是以第二个描述为思想,为每个任务划分的时间片将是任务的轮询时间片。所以,tpOS将以两个核心构成:一是轮询,二是时间片。而任务的运行时间,则是理论上为0,即任务的运行时间是不能影响到任务的轮询切换的,这一点技术我们编程人员使用tpOS的唯一要求和终极目标。

源代码:
tpOS.zip (353.58 KB, 下载次数: 202, 售价: 10 分芯积分)
此帖出自stm32/stm8论坛

最新回复

好厉害   详情 回复 发表于 2024-6-25 11:56

赞赏

11

查看全部赞赏

个人签名我的博客

回复
举报

4

帖子

0

TA的资源

一粒金砂(中级)

我这边用iar for arm无法编译通过呢?
此帖出自stm32/stm8论坛

点评

我用的是IAR 5.4,其他版本没有试过。  详情 回复 发表于 2014-12-17 09:46

回复

4998

帖子

19

TA的资源

裸片初长成(初级)

本帖最后由 zhaojun_xf 于 2014-12-9 08:07 编辑

三 数据类型os_cpu.h



os_cpu.h用于对tpOS中应用到的数据类型进行定义:

  1. /**************************************************************************************
  2. *
  3. *                                    Address
  4. *  
  5. *                    (c) Copyright 20xx, Company Name, City, State
  6. *                               All Rights Reserved
  7. *
  8. *
  9. * FileName       : os_cpu.h
  10. * Version        : V2.00
  11. * Programmer(s)  : zhaojun_xf
  12. * Parameters     :
  13. * DebugTools     :
  14. * Description    :
  15. *                                   Time-chip processing cores
  16. *
  17. **************************************************************************************/

  18. #ifndef  __OS_CPU_H
  19. #define  __OS_CPU_H

  20. /**************************************************************************************
  21. * macro definition                                       
  22. **************************************************************************************/
  23. typedef enum {OS_ERROR   = 0, OS_SUCCESS = !OS_ERROR   } OS_ERR;        
  24. typedef enum {OS_FALS    = 0, OS_TRUE    = !OS_FALS    } OS_BOOL;        
  25. typedef enum {OS_RESET   = 0, OS_SET     = !OS_RESET   } OS_FLG;
  26. typedef enum {OS_CLOSE   = 0, OS_OPEN    = !OS_CLOSE   } OS_SWT;
  27. typedef enum {OS_DISABLE = 0, OS_ENABLE  = !OS_DISABLE } OS_FCT;

  28. typedef enum {OS_OK      = 0, OS_NOT     = -1          } OS_STT;

  29. /**************************************************************************************
  30. * data type                                               
  31. **************************************************************************************/                                    
  32. typedef signed   long                 S32;                                         //
  33. typedef signed   short                S16;                                         //
  34. typedef signed   char                 S8;                                        //

  35. typedef signed   int const            SC32;                                          //
  36. typedef signed   short const          SC16;                                         //
  37. typedef signed   char const           SC8;                                        //
  38.   
  39. typedef volatile signed int           VS32;                                         //
  40. typedef volatile signed short         VS16;                                         //
  41. typedef volatile signed char          VS8;                                        //

  42. typedef volatile signed int const     VSC32;                                        //
  43. typedef volatile signed short const   VSC16;                                         //
  44. typedef volatile signed char const    VSC8;                                        //
  45.   
  46. typedef unsigned long                 U32;                                         //
  47. typedef unsigned short                U16;                                         //
  48. typedef unsigned char                 U8;                                         //

  49. typedef unsigned int const            UC32;                                          //
  50. typedef unsigned short const          UC16;                                         //
  51. typedef unsigned char const           UC8;                                        //

  52. typedef volatile unsigned int         VU32;                                         //
  53. typedef volatile unsigned short       VU16;                                         //
  54. typedef volatile unsigned char        VU8;                                        //

  55. typedef volatile unsigned int   const VUC32;                                        //
  56. typedef volatile unsigned short const VUC16;                                         //
  57. typedef volatile unsigned char  const VUC8;                                        //

  58. typedef float                         FP32;                                     //     
  59. typedef double                        FP64;                                        //

  60. /**************************************************************************************
  61. *                                               
  62. **************************************************************************************/                              

  63. /*************************************************************************************/
  64. #endif

  65. /**************************************************************************************
  66. * end of file         
  67. **************************************************************************************/
复制代码


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

回复

4998

帖子

19

TA的资源

裸片初长成(初级)

本帖最后由 zhaojun_xf 于 2014-12-9 08:04 编辑

简介



由于时间的关系,以后将尽量每天更新部分内容,感兴趣的网友,希望不要太着急。。。。。


第一版以LPC1700为应用基础,这一版将以STM32为应用基础进行描述,大致设计的内容包括:

1. 内核;
2. 软定时器;
3. 通信即可;

4. PWM;
5. 按键处理;
6. 任务统计;
7. RTC
8. 运算库


第一版,只涉及到前面3部分内容,这一版尽量把平时单片机的应该抽象出来,写入内核,减少应用程序的编写,后期还将进一步增加。。。。

1.jpg


文件说明


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

回复

4998

帖子

19

TA的资源

裸片初长成(初级)

本帖最后由 zhaojun_xf 于 2014-12-9 08:05 编辑



一 tpOS.h

tpOS.h文件,用于对tpOS的文件管理,具体内容:

  1. /**************************************************************************************
  2. *
  3. *                                    Address
  4. *  
  5. *                    (c) Copyright 20xx, Company Name, City, State
  6. *                               All Rights Reserved
  7. *
  8. *
  9. * FileName       : tpos.h
  10. * Version        : V2.00
  11. * Programmer(s)  : zhaojun_xf
  12. * Parameters     :
  13. * DebugTools     :
  14. * Description    :
  15. *                                   Time-chip processing cores
  16. *
  17. **************************************************************************************/

  18. #ifndef  __TPOS_H
  19. #define  __TPOS_H

  20. /**************************************************************************************
  21. * MISCELLANEOUS                                             
  22. **************************************************************************************/        
  23. #ifdef   OS_GLOBALS
  24.     #define  OS_EXT
  25. #else
  26.     #define  OS_EXT  extern
  27. #endif

  28. /**************************************************************************************
  29. * Version Information                                             
  30. **************************************************************************************/
  31. #define  OS_VERSION                 200u                                        // Version of ptsOS (Vx.yy mult. by 100)

  32. /**************************************************************************************
  33. * Include file                                             
  34. **************************************************************************************/
  35. <font color="#2e8b57">#include "../tpOS/Inc/os_cfg.h"                                                 // 系统配置
  36. #include "../tpOS/Inc/os_cpu.h"                                                 // 数据类型

  37. #include "../tpOS/Inc/os_tim.h"                                                 // 时间
  38. #include "../tpOS/Inc/os_mth.h"                                                 // 数学运算
  39. #include "../tpOS/Inc/os_dbg.h"                                                 // 调试
  40. #include "../tpOS/Inc/os_cmm.h"                                                 // 通信
  41. #include "../tpOS/Inc/os_sft.h"                                                 // 软定时器
  42. #include "../tpOS/Inc/os_key.h"                                                 // 按键处理                                                //
  43. #include "../tpOS/Inc/os_pwm.h"                                                 // PWM输出

  44. #include "../tpOS/Inc/os_core.h"                                                // 内核 </font>

  45. /*************************************************************************************/
  46. #endif

  47. /**************************************************************************************
  48. * end of file      
  49. **************************************************************************************/
复制代码


添加其他代码时,可以在这里添加文件保护等信息,同样使用一个c文件对于一个h文件的方法。
此帖出自stm32/stm8论坛
个人签名我的博客

回复

4998

帖子

19

TA的资源

裸片初长成(初级)

本帖最后由 zhaojun_xf 于 2014-12-9 08:07 编辑

二 配置文件os_cfg.h



配置文件用于对tpOS的裁剪,对于这系统而言,完全可以根据用户需要进行各种裁剪,甚至完全裁剪掉。

  1. /**************************************************************************************
  2. *                                   tpOS源代码
  3. *                                    Address
  4. *  
  5. *                    (c) Copyright 20xx, Company Name, City, State
  6. *                               All Rights Reserved
  7. *
  8. *
  9. * FileName       : os_cfg.h
  10. * Version        : V2.00
  11. * Programmer(s)  : zhaojun_xf
  12. * Parameters     :
  13. * DebugTools     :
  14. * Description    :
  15. *                                   Time-chip processing cores
  16. *
  17. **************************************************************************************/

  18. #ifndef  __OS_CFG_H
  19. #define  __OS_CFG_H

  20. /**************************************************************************************
  21. * System Configuration         
  22. **************************************************************************************/

  23. //================================ 系统节拍相关 =======================================

  24. #define OS_TICKS_TIM              (1)                                           // 节拍时间[1~100ms]           
  25. #define OS_TICKS_PER_SEC          (1000 / OS_TICKS_TIM)                         // 设置每秒时钟节拍个数

  26. //================================ 功能配置相关 =======================================

  27. #define OS_TSK_MAX                (5)                                           // 任务个数 [0~255]
  28. #define OS_SFT_MAX                (1)                                           // 软定时器 [0~255]
  29. #define OS_CMM_MAX                (1)                                           // 通信个数 [0~255]

  30. #define OS_PWM_MAX                (4)                                           // PWM输出数[0~255]
  31. #define OS_KEY_MAX                (1)                                           // 按键个数 [0~255]

  32. //================================ 附加功能相关 =======================================

  33. #define OS_TASK_STAT_EN           (1)                                           // 统计任务使能
  34. #define OS_SFT_EXT_EN             (1)                                           // 软定时器扩展功能
  35. #define OS_CMM_FRM_EN             (1)                                           // 通讯接收数据帧处理
  36. #define OS_DBG_EN                 (1)                                           // 调试
  37. #define OS_MTH_EN                 (1)                                           // 数学运算库函数
  38. #define OS_TIM_EN                (1)                                            // RTC时钟

  39. //=====================================================================================

  40. /*************************************************************************************/
  41. #endif

  42. /**************************************************************************************
  43. * end of file         
  44. **************************************************************************************/
复制代码


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

回复

659

帖子

2

TA的资源

纯净的硅(初级)

支持楼主做强,有没有希望做出真正属于中国的os
此帖出自stm32/stm8论坛

点评

不想做真正的os,做好这个就够用了。。。。。。。。  详情 回复 发表于 2014-12-8 09:29

回复

97

帖子

0

TA的资源

一粒金砂(初级)

没有继续更新了?
此帖出自stm32/stm8论坛

回复

4998

帖子

19

TA的资源

裸片初长成(初级)

dwwzl 发表于 2014-12-8 09:09
支持楼主做强,有没有希望做出真正属于中国的os
不想做真正的os,做好这个就够用了。。。。。。。。
此帖出自stm32/stm8论坛
个人签名我的博客

回复

1万

帖子

24

TA的资源

版主

支持。
此帖出自stm32/stm8论坛

回复

4998

帖子

19

TA的资源

裸片初长成(初级)

本帖最后由 zhaojun_xf 于 2014-12-9 08:08 编辑

四 tpOS内核


1. 系统错误类型:

用于对系统中创建或运行时产生的错误进行记录
  1. /**************************************************************************************
  2. * Macro Definition                                                
  3. **************************************************************************************/
  4. typedef enum
  5. {
  6.     OS_ERR_NUL = 0x00,                                                          // 无错误
  7.     OS_ERR_TCF = 0x01,                                                          // 任务创建失败
  8.     OS_ERR_SCF = 0x02,                                                          // 软定时器
  9.     OS_ERR_CCF = 0x04,                                                          // 通信创建失败
  10.     OS_ERR_PCF = 0x08,                                                          // pwm创建失败
  11.     OS_ERR_KCF = 0x10,                                                          // 按键创建失败
  12.    
  13. } OS_ERR_ENM;
复制代码


2.  任务结构体

标记任务状态、记录任务运行节拍等,相比第一版,添加了单个任务的运行时间记录和CPU的统计,这部分代码和变量可以同统计任务相关的宏进行裁剪。

  1. /**************************************************************************************
  2. * Variable definition                                               
  3. **************************************************************************************/        
  4. #if (OS_TSK_MAX > 0)                             
  5. typedef struct
  6. {
  7.     OS_BOOL Flg;                                                                // 程序运行标记:0-不运行,1运行
  8.     U16     Cnt;                                                                 // 节拍计数
  9.     U16     Val;                                                                // 计数值暂存
  10.    
  11. #if (OS_TASK_STAT_EN > 0)
  12.     U32     Tim;                                                                // 任务运行时间
  13.     U16     Usg;                                                                // CPU利用率[放大100倍的百分百]
  14. #endif
  15.    
  16.     void    (*Fun)(void);                                                        // 要运行的任务函数
  17.    
  18. } OS_TSK_STR;                                                                        // 任务定义

  19. OS_EXT OS_TSK_STR OSTsk[OS_TSK_MAX];                                            // 任务存放
  20. #endif  
复制代码


3. 系统变量

包含系统节拍接收器,系统错误记录和总的CPU利用率统计等。系统节拍计数器可以为软定时器、统计任务等其他系统提供参考和计算值。

  1. //=====================================================================================
  2. typedef struct
  3. {
  4.     VU32 Tck;                                                                        // 系统节拍计数
  5.     U32  Err;                                                                   // 错误
  6.    
  7. #if (OS_TASK_STAT_EN > 0)
  8.     U16  Usg;                                                                   // 总的CPU利用率
  9. #endif
  10.    
  11. } OS_SYS_STR;                                                                        // 系统参数

  12. OS_EXT OS_SYS_STR OSSys;                                                        //
复制代码


4. 初始化内核

    用于对任务内存,系统参数,统计任务、软定时器、通信模块、按键处理以及PWM等模块的内存初始化
  1. /**************************************************************************************
  2. * FunctionName   : OSInit()
  3. * Description    : 初始化任务
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_TSK_MAX > 0)
  8. void OSInit(void)
  9. {
  10.     for (U8 i=0; i<OS_TSK_MAX; i++)                                                // 逐个任务初始化
  11.     {
  12.         OSTsk[i].Flg = OS_FALS;                                                        // 程序运行标记:0-不运行,1运行
  13.         OSTsk[i].Cnt = 0;                                                         // 节拍计数
  14.         OSTsk[i].Val = 0;                                                        // 计数值暂存
  15.         
  16.     #if (OS_TASK_STAT_EN > 0)
  17.         OSTsk[i].Tim = 0;                                                       // 任务运行时间
  18.         OSTsk[i].Usg = 0;                                                       // 任务统计
  19.     #endif
  20.         
  21.         OSTsk[i].Fun = NULL;                                                        // 要运行的任务函数
  22.     }

  23. #if (OS_TASK_STAT_EN > 0)
  24.     OSSys.Usg = 0;
  25. #endif
  26.    
  27.     OSSys.Tck = 0;
  28.     OSSys.Err = OS_ERR_NUL;                                                     // 系统参数

  29. #if (OS_SFT_MAX > 0)   
  30.     OSSftInit();                                                                // 初始化软定时器
  31. #endif
  32.    
  33. #if (OS_CMM_MAX > 0)   
  34.     OSCmmInit();                                                                // 初始化通信
  35. #endif
  36.    
  37. #if (OS_KEY_MAX > 0)   
  38.     OSKeyInit();                                                                // 初始化按键
  39. #endif
  40.    
  41. #if (OS_PWM_MAX > 0)   
  42.     OSPwmInit();                                                                // 初始化PWM
  43. #endif
  44. }
  45. #endif
复制代码


5. 时间片处理

用于对每个任务的时间片进行计数和任务运行标记的处理,在定时器中断中调用,可以设置定时器中断为1ms-200ms等值,一般我们设置为1ms或10ms的比较多。所以与定时器中断相关的代码都可以放在这个函数中,次函数为本系统的核心代码这一。

  1. /**************************************************************************************
  2. * FunctionName   : OSTimeSlice()
  3. * Description    : 时间片处理 - 定时器中断中调用
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_TSK_MAX > 0)
  8. void OSTimeSlice(void)
  9. {
  10.     OSSys.Tck++;                                                                // 系统节拍计数器
  11.     for (U8 i=0; i<OS_TSK_MAX; i++)                                                // 逐个任务时间处理
  12.     {
  13.         if (++OSTsk[i].Cnt >= OSTsk[i].Val)                                        // 时间到
  14.         {
  15.             OSTsk[i].Cnt = 0;                                                   // 清零,重新开始
  16.             OSTsk[i].Flg = OS_TRUE;                                                // 任务可以运行
  17.         }
  18.     }
  19.    
  20. #if (OS_SFT_MAX > 0)
  21.     OSSftPro();                                                                 // 软定时器处理
  22. #endif
  23.    
  24. #if (OS_KEY_MAX > 0)   
  25.     OSKeyPro();                                                                 // 按键处理
  26. #endif
  27.    
  28. #if (OS_PWM_MAX > 0)   
  29.     OSPwmPro();                                                                 // PWM处理
  30. #endif
  31.    
  32.     if ((OSSys.Tck % OS_TICKS_PER_SEC) == 0)                                    // 每秒计算一次
  33.     {
  34. #if (OS_TIM_EN > 0)
  35.         OSTimGetClock();                                                        // 时钟
  36. #endif

  37. #if (OS_TASK_STAT_EN > 0)
  38.         OSTaskStat();                                                           // 统计
  39.     }
  40. #endif
  41. }
  42. #endif
复制代码


6. 任务轮询

任务轮询,为本系统的另外一个核心代码部分,用于对任务运行的轮询处理,一般在main函数中循环处理。对于第一版来说,本函数添加了单个任务运行节拍的统计。任务节拍运行公式如下:误差为最多1个节拍。

任务运行节拍 = 运行后的节拍 - 运行前的节拍


  1. /**************************************************************************************
  2. * FunctionName   : OSPollingTask()
  3. * Description    : 任务轮询 -- main函数中调用
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_TSK_MAX > 0)
  8. void OSPollingTask(void)
  9. {
  10. #if (OS_TASK_STAT_EN > 0)   
  11.     U32 tmpTick;
  12. #endif   

  13.     for (U8 i=0; i<OS_TSK_MAX; i++)                                                // 逐个任务时间处理
  14.     {
  15.         if (OSTsk[i].Flg == OS_TRUE)                                                // 时间不为TRUE
  16.         {
  17.         #if (OS_TASK_STAT_EN > 0)
  18.             tmpTick = OSSys.Tck;                                                // 运行前的节拍数暂存
  19.         #endif
  20.             
  21.             OSTsk[i].Fun();                                                        // 运行任务
  22.             OSTsk[i].Flg = OS_FALS;                                                // 标志清0
  23.             
  24.         #if (OS_TASK_STAT_EN > 0)
  25.             OSTsk[i].Tim += OSSys.Tck - tmpTick;                                // 任务运行节拍 = 运行后的节拍 - 运行前的节拍
  26.         #endif  
  27.         }
  28.     }
  29. }        
  30. #endif
复制代码


7. 任务创建

用于创建用户任务函数,把创建中出现的错误进行记录,第一版中没有这个函数,而是在定压的任务数组中进行任务的编写。

  1. /**************************************************************************************
  2. * FunctionName   : OSTaskCreate()
  3. * Description    : 任务创建
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_TSK_MAX > 0)
  8. OS_BOOL OSTskCreate(U8 num, U32 tickVal, void (*pTsk)(void))
  9. {
  10.     if (num >= OS_TSK_MAX)
  11.     {
  12.         OSSys.Err |= OS_ERR_TCF;                                                // 任务创建错误
  13.         return OS_FALS;
  14.     }
  15.   
  16.     OSTsk[num].Flg = OS_FALS;                                                   // 运行标志
  17.     OSTsk[num].Val = tickVal;                                                   // 任务时间片暂存
  18.     OSTsk[num].Cnt = 0;                                                         // 初始化任务时间片
  19.    
  20. #if (OS_TASK_STAT_EN > 0)
  21.     OSTsk[num].Tim = 0;                                                         // 任务运行时间
  22.     OSTsk[num].Usg = 0;                                                         // 统计
  23. #endif
  24.    
  25.     OSTsk[num].Fun = pTsk;                                                      // 任务函数
  26.     return OS_TRUE;
  27. }
  28. #endif
复制代码


8. 任务时间片获取

有时候,我们需要在任务中进行某些事件的定时或周期性处理,为了减小软定时器的负担,我们可以用记录任务运行次数的方式实现软定时的作用,这时我们就需要知道我们运行的任务的时间片是多少,次函数可以解决这个问题。

  1. /**************************************************************************************
  2. * FunctionName   : OSGetTimeSlice()
  3. * Description    : 获取任务时间片
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_TSK_MAX > 0)
  8. S32 OSGetTimeSlice(U8 num)
  9. {
  10.     return ((num >= OS_TSK_MAX) ? OS_NOT : OSTsk[num].Val);
  11. }
  12. #endif
复制代码


9. CPU利用率统计

为了对CPU利用有个直观的了解,也便于编写出高效合理的任务,我们增加了对CPU利用率的统计。可以随时知道项目中CPU的利用率,由于我们这个架构的特殊性,这里的统计误差相对比较大,我们是同计算1s内所有任务对CPU的利用时间的总和计算出来的,而每个任务最多每次有1个时钟节拍的误差,从而导致了误差的累积。

  1. /**************************************************************************************
  2. * FunctionName   : OSTaskStat()
  3. * Description    : 统计任务
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if ((OS_TSK_MAX > 0) && (OS_TASK_STAT_EN > 0))
  8. void OSTaskStat(void)
  9. {
  10.     U32 runTim = 0;
  11.    
  12.     for (U8 i=0; i<OS_TSK_MAX; i++)
  13.     {
  14.         runTim      += OSTsk[i].Tim;                                            // 求运行时间和
  15.         OSTsk[i].Usg = OSTsk[i].Tim * 1000 / OS_TICKS_PER_SEC;                  // 单个任务的百分百
  16.         OSTsk[i].Tim = 0;
  17.     }
  18.    
  19.     OSSys.Usg = (runTim * 1000 / OS_TICKS_PER_SEC);                             // 百分百放大1000倍
  20. }
  21. #endif
复制代码


10. 每个任务的CPU利用率

  1. /**************************************************************************************
  2. * FunctionName   : OSTaskStatSingle()
  3. * Description    : 单个任务的统计
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if ((OS_TSK_MAX > 0) && (OS_TASK_STAT_EN > 0))
  8. S32 OSTaskStatSingle(U8 num)
  9. {
  10.     return ((num >= OS_TSK_MAX) ? OS_NOT : OSTsk[num].Usg);                     // 百分百放大1000倍                                                   
  11. }
  12. #endif
复制代码


11. 系统版本信息

  1. /**************************************************************************************
  2. * FunctionName   : OSVersion()
  3. * Description    : 获取版本信息
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_TSK_MAX > 0)
  8. U16 OSVersion(void)
  9. {
  10.     return (OS_VERSION);                                                        // 放大100倍                                                   
  11. }
  12. #endif
复制代码












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

回复

7274

帖子

18

TA的资源

五彩晶圆(中级)

本帖最后由 freebsder 于 2014-12-8 14:13 编辑

其他中断的处理是task自己polling吗?
另外,比如OSPwmPro()是在时钟中断里做什么处理呢?这个处理和OSTsk.Fun(); 这个处理有什么联系或者区别?
此帖出自stm32/stm8论坛

点评

其他中断跟系统没有关系,本系统只有一个定时器中断,PWM的这个后面讲PWM的时候会讲到。  详情 回复 发表于 2014-12-8 14:56
个人签名

默认摸鱼,再摸鱼。2022、9、28


回复

4998

帖子

19

TA的资源

裸片初长成(初级)

freebsder 发表于 2014-12-8 14:10
其他中断的处理是task自己polling吗?
另外,比如OSPwmPro()是在时钟中断里做什么处理呢?这个处理和OSTsk.Fun(); 这个处理有什么联系或者区别?
其他中断跟系统没有关系,本系统只有一个定时器中断,PWM的这个后面讲PWM的时候会讲到。
此帖出自stm32/stm8论坛
个人签名我的博客

回复

2887

帖子

0

TA的资源

五彩晶圆(初级)

感谢分享
此帖出自stm32/stm8论坛
个人签名昵称:灰小子

回复

232

帖子

0

TA的资源

一粒金砂(高级)

怎么看起来跟基于时间触发嵌入系统 那个有点类似
此帖出自stm32/stm8论坛

点评

你说的那本书我知道,但没有读过,只知道它用多种视角讲述时间片。  详情 回复 发表于 2014-12-9 07:55

回复

4998

帖子

19

TA的资源

裸片初长成(初级)

foxpro2005 发表于 2014-12-8 21:56
怎么看起来跟基于时间触发嵌入系统 那个有点类似
你说的那本书我知道,但没有读过,只知道它用多种视角讲述时间片。
此帖出自stm32/stm8论坛
个人签名我的博客

回复

4998

帖子

19

TA的资源

裸片初长成(初级)

五 软定时器



        可以说对单片机的操作其实就是对单片机存储资源和时间资源的分配,不管是采用普通架构编写代码还是采取操作系统,其实质上也是帮助单片机管理器内存资源和时间资源。所以,作为类操作系统,我们的核心也是对这两大资源进行有效的管理。

       软定时器的应用非常广泛,在单片机的很多应用中都需要延时处理,如果使用死循环,既浪费单片机资源,又效率低下。为此,软定时器就能够很好的解决这个问。

1. 结构体

参数不多,一个是状态,一个是软定时器计数,一个是时间完成后的函数调用。
  1. /**************************************************************************************
  2. * Variable definition                                               
  3. **************************************************************************************/       
  4. #if (OS_SFT_MAX > 0)
  5. typedef        struct
  6. {
  7.     OS_SWT  Sta;                                                                // 状态       
  8.     U32     Cnt;                                                                // 计数值
  9.     void    (*Fun)(void);                                                        // 定时器溢出执行函数   

  10. } OS_SFT_STR;                                                                   // 软件定时器

  11. OS_EXT OS_SFT_STR OSSft[OS_SFT_MAX];                                            // 软定时器
  12. #endif  
复制代码


2. 扩展

很多时候采用上面的结构体还不能满足我们的需求,为此,特地扩展了,以下结构体。在第一版中,只有扩展部分。

  1. //=====================================================================================
  2. #if (OS_SFT_EXT_EN > 0)
  3. typedef        struct
  4. {
  5.     OS_SWT  Sta;                                                                // 状态
  6.     U32     Tim;                                                                // 定时器值
  7.     U32     Cnt;                                                                // 计数值
  8.    
  9.     U8      Rst;                                                                // 返回结果
  10.     U8      *Tsm;                                                               // 传输变量[用于传输返回结果]
  11.     void    (*Fun)(void);                                                        // 定时器溢出执行函数   

  12. } OS_STE_STR;                                                                   // 软件定时器扩展功能
  13. #endif
复制代码


3.  初始化

对定时器进行初始化,本函数在内核初始化中调用
  1. /**************************************************************************************
  2. * FunctionName   : OSSftInit()
  3. * Description    : 初始化函数
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_SFT_MAX > 0)
  8. void OSSftInit(void)
  9. {
  10.     for (U8 i=0; i<OS_SFT_MAX; i++)
  11.     {
  12.         OSSft[i].Sta = OS_CLOSE;                                                        // 状态       
  13.         OSSft[i].Cnt = 0;                                                       // 计数值
  14.         OSSft[i].Fun = NULL;                                                        // 定时器溢出执行函数
  15.     }
  16. }
  17. #endif
复制代码


4. 软定时器处理

定时处理,在时间片处理函数中调用。逐个判断,定时时间到后调用相应函数。
  1. /**************************************************************************************
  2. * FunctionName   : OSSftPro()
  3. * Description    : 软定时器中断服务函数(定时器中断用)
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_SFT_MAX > 0)
  8. void OSSftPro(void)
  9. {
  10.     for (U8 i=0; i<OS_SFT_MAX; i++)                                                // 逐个任务时间处理
  11.     {
  12.         if (OSSft[i].Sta == OS_OPEN)                                            // 定时器是否打开
  13.         {
  14.             if (OSSys.Tck >= OSSft[i].Cnt)                                      // 定时判断
  15.             {
  16.                 OSSft[i].Sta = OS_CLOSE;
  17.                 OSSft[i].Fun();                                                 // 函数运行
  18.             }
  19.         }
  20.     }
  21. }
  22. #endif
复制代码


5. 设置并启动定时器

设置定时器定时时间,并创建定时器
  1. /**************************************************************************************
  2. * FunctionName   : OSSftStart()
  3. * Description    : 启动定时器函数
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_SFT_MAX > 0)
  8. OS_BOOL OSSftStart(U8 num, U32 tim, void (*pFun)(void))
  9. {
  10.     if (num >= OS_SFT_MAX)
  11.     {
  12.         OSSys.Err |= OS_ERR_SCF;                                                // 创建错误
  13.         return OS_FALS;
  14.     }
  15.    
  16.     OSSft[num].Sta = OS_OPEN;                                                        // 状态       
  17.     OSSft[num].Cnt = OSSys.Tck + tim;                                           // 计数值
  18.     OSSft[num].Fun = pFun;                                                        // 定时器溢出执行函数
  19.    
  20.     return OS_TRUE;
  21. }
  22. #endif
复制代码


6. 停止定时器

  1. /**************************************************************************************
  2. * FunctionName   : OSSftStop()
  3. * Description    : 停止定时器
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_SFT_MAX > 0)
  8. OS_BOOL OSSftStop(U8 num)
  9. {
  10.     if (num >= OS_SFT_MAX)
  11.     {
  12.         return OS_FALS;
  13.     }
  14.    
  15.     OSSft[num].Sta = OS_CLOSE;                                                        // 状态       
  16.     OSSft[num].Cnt = 0;                                                         // 计数值
  17.     OSSft[num].Fun = NULL;                                                        // 定时器溢出执行函数
  18.     return OS_TRUE;
  19. }
  20. #endif
复制代码


在很多时候,以上定时器已经够用,特别在编写应用层代码时,一般都使用以上定时器就可以了。但低于底层驱动中如果也使用这个定时器,你会发现,它的缺点也非常明显,即可移植性并不太好。原因是,这个定时器在os_cfg.h中配置,定时器的序号分配后,再移植又得更改序号,非常不方便,为此,必须为每个外设或者底层驱动新建一个独立的软定时器,这就是扩展部分出现的原因。





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

回复

4998

帖子

19

TA的资源

裸片初长成(初级)

发了这么多,好像没几个人感兴趣?。。。再发点看看情况吧

1. 软定时器扩展函数

扩展处理,内核中没有调用,应用这根据需要自己放入定时器中断中,而且需要注意的是,定时器的数组是没有定义的,需要用户自己定义,并通过参数形式传递进来。
  1. /**************************************************************************************
  2. * Expand Function   
  3. **************************************************************************************/

  4. /**************************************************************************************
  5. * FunctionName   : OSSftExtPro()
  6. * Description    : 软定时器中断服务函数(定时器中断用)
  7. * EntryParameter : pStr - 定时器变量,max - 定时器个数
  8. * ReturnValue    : None
  9. **************************************************************************************/
  10. #if (OS_SFT_EXT_EN > 0)
  11. void OSSftExtPro(OS_STE_STR *pStr, U8 max)
  12. {
  13.     for (U8 i=0; i<max; i++)                                                        // 逐个任务时间处理
  14.     {
  15.         if (pStr[i].Sta == OS_OPEN)                                             // 定时器是否打开
  16.         {
  17.             if (pStr[i].Cnt++ >= pStr[i].Tim)                                   // 定时判断
  18.             {
  19.                 pStr[i].Cnt = 0;
  20.                 pStr[i].Sta = OS_CLOSE;                                         // 关闭定时器
  21.                 pStr[i].Tsm = &pStr[i].Rst;                                        // 多种赋值,根据需求使用
  22.                 pStr[i].Fun();                                                  // 函数运行
  23.             }
  24.         }
  25.     }
  26. }
  27. #endif
复制代码


2. 定时器启动

定时器的启动后面一共有多种形式,完全为了在不同场合的应用需求,应用这需要根据需要去调用。

  1. /**************************************************************************************
  2. * FunctionName   : OSSftExtStart()
  3. * Description    : 启动定时器函数
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_SFT_EXT_EN > 0)
  8. OS_BOOL OSSftExtStart(OS_STE_STR *pStr, U8 num, U32 tim)
  9. {
  10.     if (num >= OS_SFT_MAX)
  11.     {
  12.         OSSys.Err |= OS_ERR_SCF;                                                // 创建错误
  13.         return OS_FALS;
  14.     }
  15.    
  16.     pStr[num].Sta = OS_OPEN;                                                        // 状态       
  17.     pStr[num].Tim = tim;                                                        // 计数值
  18.     pStr[num].Cnt = 0;                                                          // 清零
  19.     pStr[num].Rst = 0;
  20.     pStr[num].Tsm = NULL;
  21.     pStr[num].Fun = NULL;                                                        //  
  22.    
  23.     return OS_TRUE;
  24. }
  25. #endif
复制代码

  1. /**************************************************************************************
  2. * FunctionName   : OSSftExtStart()
  3. * Description    : 启动定时器函数
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_SFT_EXT_EN > 0)
  8. OS_BOOL OSSftExtStartFun(OS_STE_STR *pStr, U8 num, U32 tim, void (*pFun)(void))
  9. {
  10.     if (num >= OS_SFT_MAX)
  11.     {
  12.         OSSys.Err |= OS_ERR_SCF;                                                // 创建错误
  13.         return OS_FALS;
  14.     }
  15.    
  16.     pStr[num].Sta = OS_OPEN;                                                        // 状态       
  17.     pStr[num].Tim = tim;                                                        // 计数值
  18.     pStr[num].Cnt = 0;                                                          // 清零
  19.     pStr[num].Rst = 0;
  20.     pStr[num].Tsm = NULL;
  21.     pStr[num].Fun = pFun;                                                        //  
  22.    
  23.     return OS_TRUE;
  24. }
  25. #endif
复制代码

  1. /**************************************************************************************
  2. * FunctionName   : OSSftExtStartSet()
  3. * Description    : 启动定时器函数
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_SFT_EXT_EN > 0)
  8. OS_BOOL OSSftExtStartSet(OS_STE_STR *pStr, U8 num, U32 tim, U8 *pVal)
  9. {
  10.     if (num >= OS_SFT_MAX)
  11.     {
  12.         OSSys.Err |= OS_ERR_SCF;                                                // 创建错误
  13.         return OS_FALS;
  14.     }
  15.    
  16.     pStr[num].Sta = OS_OPEN;                                                        // 状态       
  17.     pStr[num].Tim = tim;                                                        // 计数值
  18.     pStr[num].Cnt = 0;                                                          // 清零
  19.     pStr[num].Rst = 0x01;
  20.     pStr[num].Tsm = pVal;
  21.     pStr[num].Fun = NULL;                                                        //  
  22.    
  23.     return OS_TRUE;
  24. }
  25. #endif
复制代码

  1. /**************************************************************************************
  2. * FunctionName   : OSSftExtStartClr()
  3. * Description    : 启动定时器函数
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_SFT_EXT_EN > 0)
  8. OS_BOOL OSSftExtStartClr(OS_STE_STR *pStr, U8 num, U32 tim, U8 *pVal)
  9. {
  10.     if (num >= OS_SFT_MAX)
  11.     {
  12.         OSSys.Err |= OS_ERR_SCF;                                                // 创建错误
  13.         return OS_FALS;
  14.     }
  15.    
  16.     pStr[num].Sta = OS_OPEN;                                                        // 状态       
  17.     pStr[num].Tim = tim;                                                        // 计数值
  18.     pStr[num].Cnt = 0;                                                          // 清零
  19.     pStr[num].Rst = 0x00;
  20.     pStr[num].Tsm = pVal;
  21.     pStr[num].Fun = NULL;                                                        //  
  22.    
  23.     return OS_TRUE;
  24. }
  25. #endif
复制代码

  1. /**************************************************************************************
  2. * FunctionName   : OSSftExtStartVal()
  3. * Description    : 启动定时器函数
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_SFT_EXT_EN > 0)
  8. OS_BOOL OSSftExtStartVal(OS_STE_STR *pStr, U8 num, U32 tim, U8 *pVal, U8 val)
  9. {
  10.     if (num >= OS_SFT_MAX)
  11.     {
  12.         OSSys.Err |= OS_ERR_SCF;                                                // 创建错误
  13.         return OS_FALS;
  14.     }
  15.    
  16.     pStr[num].Sta = OS_OPEN;                                                        // 状态       
  17.     pStr[num].Tim = tim;                                                        // 计数值
  18.     pStr[num].Cnt = 0;                                                          // 清零
  19.     pStr[num].Rst = val;
  20.     pStr[num].Tsm = pVal;
  21.     pStr[num].Fun = NULL;                                                        //  
  22.    
  23.     return OS_TRUE;
  24. }
  25. #endif
复制代码

  1. /**************************************************************************************
  2. * FunctionName   : OSSftExtStartFul()
  3. * Description    : 启动定时器函数
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_SFT_EXT_EN > 0)
  8. OS_BOOL OSSftExtStartFul(OS_STE_STR *pStr, U8 num, U32 tim, void(*pFun)(void), U8 *pVal, U8 val)
  9. {
  10.     if (num >= OS_SFT_MAX)
  11.     {
  12.         OSSys.Err |= OS_ERR_SCF;                                                // 创建错误
  13.         return OS_FALS;
  14.     }
  15.    
  16.     pStr[num].Sta = OS_OPEN;                                                        // 状态       
  17.     pStr[num].Tim = tim;                                                        // 计数值
  18.     pStr[num].Cnt = 0;                                                          // 清零
  19.     pStr[num].Rst = val;
  20.     pStr[num].Tsm = pVal;
  21.     pStr[num].Fun = pFun;                                                        //  
  22.    
  23.     return OS_TRUE;
  24. }
  25. #endif
复制代码


3. 定时器停止

停止定时器,可以很以上各种启动定时器搭配使用。

  1. /**************************************************************************************
  2. * FunctionName   : OSSftExtStop()
  3. * Description    : 停止定时器
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. #if (OS_SFT_MAX > 0)
  8. OS_BOOL OSSftExtStop(OS_STE_STR *pStr, U8 num)
  9. {
  10.     if (num >= OS_SFT_MAX)
  11.     {
  12.         return OS_FALS;
  13.     }
  14.    
  15.     pStr[num].Sta = OS_CLOSE;                                                        // 状态       
  16.     pStr[num].Tim = 0;                                                          // 计数值
  17.     pStr[num].Cnt = 0;                                                          // 清零
  18.     pStr[num].Rst = 0;
  19.     pStr[num].Tsm = NULL;
  20.     pStr[num].Fun = NULL;                                                        //
  21.    
  22.     return OS_TRUE;
  23. }
  24. #endif
复制代码


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

回复

157

帖子

5

TA的资源

一粒金砂(中级)

支持楼主,其它不说。软定时器这段对我很有用
此帖出自stm32/stm8论坛

回复

3414

帖子

0

TA的资源

纯净的硅(高级)

楼主牛人
不过,貌似看到μCOS的影子了
准备自己写一个全新的OS么?
此帖出自stm32/stm8论坛

点评

参照了ucos的命名规则了,没准备些OS,我这用的很爽,没有必要上OS.  详情 回复 发表于 2014-12-10 17:07
个人签名

So TM what......?


回复

4998

帖子

19

TA的资源

裸片初长成(初级)

ljj3166 发表于 2014-12-10 16:13
楼主牛人
不过,貌似看到μCOS的影子了
准备自己写一个全新的OS么?
参照了ucos的命名规则了,没准备些OS,我这用的很爽,没有必要上OS.
此帖出自stm32/stm8论坛
个人签名我的博客

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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