搜索
bottom↓
回复: 54

开源:类OS的调度器

  [复制链接]

出0入0汤圆

发表于 2014-11-15 22:46:52 | 显示全部楼层 |阅读模式
此调度器,结合本论坛各位高手的代码,及Protothreads,加上自己的理解,及实际在项目中的使用情况不断修改而成,
在这里要感谢各位坛友的代码;
本调度器共3个文件
schedule.h
schedule.c
sch_cfg.h

本调度器特点:
1,仿OS编程方式
2,代码优化等级不能过高
3,适用于前后台及OS的系统中
4,占用一个CPU一个定时器
5,支持信号量
6,支持邮箱

代码如下:
schedule.h
  1. #ifndef _SCH_H
  2. #define _SCH_H

  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif

  6. /**********************************************************************************************************
  7. *                                       schedule 版本号
  8. **********************************************************************************************************/

  9. #define  SCH_VERSION                 02100u              

  10. /**********************************************************************************************************
  11. *                                        包含头文件
  12. **********************************************************************************************************/

  13. #include <sch_cfg.h>
  14.    
  15. #ifndef  SCH_GLOBALS
  16. #define  SCH_EXT  extern
  17. #else
  18. #define  SCH_EXT
  19. #endif

  20. /**********************************************************************************************************
  21. *                                        数据结构定义
  22. **********************************************************************************************************/
  23. typedef struct {                                        //任务TCB数据类型定义
  24.         SCH_TICKS                TaskDly;
  25.         INT8U                        SpawnExitFlag;
  26. } SCH_TCB;

  27. typedef SCH_TICKS        SEM;                        //信号量数据类型定义
  28. typedef struct {                                        //邮箱数据类型定义
  29.         SCH_TICKS Dly;
  30.         void *pMbox;
  31. } MBOX;

  32. /**********************************************************************************************************
  33. *                                       全局变量定义
  34. **********************************************************************************************************/
  35. SCH_EXT SCH_TCB         TaskTcb[SCH_MAX_TASKS];                        //任务状态数据结构
  36. SCH_EXT INT8U                CurRunTaskId;                                        //当前运行任务的ID号


  37. /**********************************************************************************************************
  38. *                                       系统状态定义
  39. **********************************************************************************************************/
  40. #define SCH_ERR_NONE                     0u
  41. #define SCH_ERR_TIMEOUT                 10u

  42. /**************************************************************************************************************
  43. ************任务相关宏
  44. 【1】任务创建按实例创建:
  45. void Task_xxx(void)
  46. {
  47.         SCH_TaskBegin();
  48.         while(1) {
  49.                 //用户代码
  50.                 SCH_TimeDly(SCH_TICKS_PER_SEC/100);                //根据任务实际周期进行延时
  51.         }
  52.         SCH_TaskEnd();
  53. }
  54. 【注意】
  55.         1,任务必须是无限循环,不能返回;
  56.         2,任务中必须有延时函数或等待信号量,便于任务出让CPU使用权;
  57.         3,任务函数中使用的非静态局部变量会在任务出让CPU后,变量消失,因此要想某个变量不消失,则要使用静态变量

  58. 【2】任务调度,按以下实例
  59. SCH_TaskRun(Task_xxx,0);
  60. 【注意】
  61.         1,各任务的ID不能相同
  62. **************************************************************************************************************/


  63. //@任务开始宏,在任务函数的变量声明后引用
  64. #define SCH_TaskBegin()        static INT16U _lc=0u; switch(_lc){case 0:
  65.                                                
  66. //@任务结束宏,在任务尾引用
  67. #define SCH_TaskEnd() }                               

  68. //@任务调用宏,在主循环中调用
  69. //@ TaskName:任务名
  70. //@ TaskID:任务ID,最大值不能超过"SCH_MAX_TASKS"值,且每个任务的ID不能相同
  71. #define SCH_TaskRun(TaskName,TaskID) \
  72.     do { \
  73.                 CurRunTaskId = TaskID; \
  74.         if(TaskTcb[CurRunTaskId].TaskDly==0) { \
  75.             TaskName(); \
  76.         } \
  77.     } while(0);

  78.        
  79. /**************************************************************************************************************
  80. ************子任务相关宏
  81. 【1】子任务创建按实例创建:
  82. void SubTask_xxx(void)
  83. {
  84.         SCH_SubTaskBegin();
  85.         //用户代码
  86.         SCH_TimeDly(SCH_TICKS_PER_SEC/100);                //根据任务实际周期进行延时
  87.         SCH_SubTaskEnd();
  88. }
  89. 【注意】
  90.         1,子任务不可以是无限循环,否则子任务后面程序无法执行;
  91.         2,子任务可以带参数;
  92.         3,子任务中必须有延时函数或等待信号量,便于任务出让CPU使用权;
  93.         4,子任务函数中使用的非静态局部变量会在任务出让CPU后,变量消失,因此要想某个变量不消失,则要使用静态变量

  94. 【2】子任务调度,按以下实例
  95.         SCH_CallSubTask(SubTask_xxx());
  96. **************************************************************************************************************/

  97. //@子任务开始宏,在子任务函数的变量声明后引用
  98. #define SCH_SubTaskBegin() static INT16U _lc=0u;TaskTcb[CurRunTaskId].SpawnExitFlag=1u;switch(_lc){case 0u:
  99.        
  100. //@子任务结束宏,在子任务函数尾引用
  101. #define SCH_SubTaskEnd() }_lc=0;TaskTcb[CurRunTaskId].SpawnExitFlag=0u;return

  102. //@子任务调用宏,在任务中调用,允许多层嵌套
  103. //@ SubTaskName:子任务名
  104. //@ p_arg:子线程函数输入参数
  105. #define SCH_CallSubTask(SubTaskFun)        \
  106.         while(1) { \
  107.                 _lc=(__LINE__%65535);return;case(__LINE__%65535): { \
  108.                         SubTaskFun; \
  109.                 } \
  110.                 if(TaskTcb[CurRunTaskId].SpawnExitFlag==0u) { \
  111.                         break; \
  112.                 } \
  113.         }
  114.        



  115. /**************************************************************************************************************
  116. ************延时宏定义
  117. **************************************************************************************************************/

  118. //@延时宏,在任务开始宏和结束宏之间的任意位置引用;
  119. //@【注】由于此调度器运用了C语言的行号的宏代码,因此此宏定义最好放在一行代码中,不能拆分此宏定义,防止行号返回出错
  120. //@ ticks:延时时间
  121. #define SCH_TimeDly(ticks)         do{_lc=(__LINE__%65535);TaskTcb[CurRunTaskId].TaskDly=ticks;return;}while(0);case (__LINE__%65535):

  122. /**************************************************************************************************************
  123. ************信号量相关调用宏定义
  124. **************************************************************************************************************/
  125. //@信号量创建
  126. #define SCH_SemCreate(Sem) Sem = 1

  127. //@w信号量等待
  128. //@        sem--等待信号量;
  129. //@        timeout--等待超时时间,0--直到成功等待信号量;
  130. //@        err--等待信号状态,SCH_ERR_NONE-等待成功,SCH_ERR_TIMEOUT-等待超时
  131. #define SCH_SemPend(sem,timeout,err) \
  132.     do { \
  133.                 if(sem==0) { \
  134.                         sem = 1; \
  135.                         err = SCH_ERR_NONE; \
  136.                 } else { \
  137.                         sem = timeout + 1; \
  138.                         SCH_TimeDly(0); \
  139.                         if(timeout==0) { \
  140.                                 if(sem>0) { \
  141.                                         TaskTcb[CurRunTaskId].TaskDly = 0; \
  142.                                         return; \
  143.                                 } \
  144.                                 sem = 1; \
  145.                                 err = SCH_ERR_NONE; \
  146.                         } else { \
  147.                                 if(sem>1) { \
  148.                                         sem --; \
  149.                                         TaskTcb[CurRunTaskId].TaskDly = 1; \
  150.                                         return; \
  151.                                 } else if(sem==1) { \
  152.                                         err = SCH_ERR_TIMEOUT; \
  153.                                 } else { \
  154.                                         sem = 1; \
  155.                                         err = SCH_ERR_NONE; \
  156.                                 } \
  157.                         } \
  158.                 } \
  159.     } while(0)

  160. //@ 发出一个信号量
  161. #define SCH_SemPost(Sem) \
  162.     do { \
  163.         Sem = 0; \
  164.     } while(0)
  165.        
  166. /**************************************************************************************************************
  167. ************邮箱相关调用宏定义
  168. **************************************************************************************************************/
  169. #if SCH_MBOX_EN > 0u
  170.        
  171. //@创建邮箱
  172. #define SCH_MboxCreate(mbox) do{mbox.Dly = 1;mbox.pMbox = (void*)0;}while(0)

  173. //@ 邮箱等待
  174. //@        mbox--等待邮箱;
  175. //@ pmsg--等待成功后接收邮箱数据指针;
  176. //@        timeout--等待邮箱超时时间,0--直到成功等待邮箱;
  177. //@        err--等待邮箱状态,SCH_ERR_NONE-等待成功,SCH_ERR_TIMEOUT-等待超时
  178. #define SCH_MboxPend(mbox,pmsg,timeout,err) \
  179.     do { \
  180.                 if(mbox.pMbox!=(void*)0) { \
  181.                         pmsg = mbox.pMbox; \
  182.                         mbox.pMbox = (void*)0; \
  183.                         err = SCH_ERR_NONE; \
  184.                 } else { \
  185.                         mbox.Dly = timeout + 1; \
  186.                         SCH_TimeDly(0); \
  187.                         if(timeout==0) { \
  188.                                 if(mbox.pMbox==(void*)0) { \
  189.                                         TaskTcb[CurRunTaskId].TaskDly = 0; \
  190.                                         return; \
  191.                                 } \
  192.                                 pmsg = mbox.pMbox; \
  193.                                 mbox.pMbox = (void*)0; \
  194.                                 err = SCH_ERR_NONE; \
  195.                         } else { \
  196.                                 if(mbox.pMbox!=(void*)0) { \
  197.                                         pmsg = mbox.pMbox; \
  198.                                         mbox.pMbox = (void*)0; \
  199.                                         err = SCH_ERR_NONE; \
  200.                                 } else { \
  201.                                         if(mbox.Dly>1) { \
  202.                                                 mbox.Dly --; \
  203.                                                 TaskTcb[CurRunTaskId].TaskDly = 1; \
  204.                                                 return; \
  205.                                         } else if(mbox.Dly==1) { \
  206.                                                 pmsg = (void*)0; \
  207.                                                 mbox.pMbox = (void*)0; \
  208.                                                 err = SCH_ERR_TIMEOUT; \
  209.                                         } \
  210.                                 } \
  211.                         } \
  212.                 } \
  213.     } while(0)

  214. //@ 发出一个邮箱
  215. #define SCH_MobxPost(mbox,pmsg) \
  216.     do { \
  217.         mbox.Dly = 0; \
  218.                 mbox.pMbox = (void*)pmsg; \
  219.     } while(0)
  220.        
  221.        
  222. #endif
  223.        
  224.        
  225.        
  226. /*************************************
  227.                         函数申明
  228. *************************************/
  229. void SCH_Init(void);
  230. void SCH_TimeTick(void);



  231. #endif       
复制代码


schedule.c
  1. #define  SCH_GLOBALS
  2. #include  <schedule.h>


  3. /********************************************************************************************************
  4. ** 函数名:        SCH_Init
  5. ** 输  入:        无
  6. ** 输  出:        无
  7. ** 功能说明:调度器初始化函数,任务运行前调用
  8. *********************************************************************************************************/
  9. void SCH_Init(void)       
  10. {
  11.         INT8U i;
  12.        
  13.         CurRunTaskId = 0;
  14.         for(i=SCH_MAX_TASKS;i>0;i--) {
  15.                 TaskTcb[i-1].TaskDly = 0;
  16.                 TaskTcb[i-1].SpawnExitFlag = 0;
  17.         }
  18. }

  19. /********************************************************************************************************
  20. ** 函数名:        SCH_TimeTick
  21. ** 输  入:        无
  22. ** 输  出:        无
  23. ** 功能说明:调度器时钟节拍函数,在定时中断中调用
  24. *********************************************************************************************************/
  25. void SCH_TimeTick(void)       
  26. {
  27.         INT8U i;
  28.         for(i=SCH_MAX_TASKS;i>0;i--) {      
  29.         if(TaskTcb[i-1].TaskDly>0) {      //任务延时时间处理
  30.             TaskTcb[i-1].TaskDly --;
  31.         }
  32.         }
  33. }
  34.        
复制代码


sch_cfg.h
  1. #ifndef SCH_CFG_H
  2. #define SCH_CFG_H

  3. #define SCH_MAX_TASKS           10                  //最大任务数量,可以增加,最大255个
  4. #define SCH_MBOX_EN             1                            // Enable (1) or Disable (0) 邮箱


  5. #define SCH_TICKS_PER_SEC       1000                //1秒钟多少个系统时钟数




  6. /**********************************************************************************************************
  7. *                                              与编译器相关数据类型定义
  8. **********************************************************************************************************/
  9. typedef unsigned char  BOOLEAN;
  10. typedef unsigned char  INT8U;                    /* Unsigned  8 bit quantity                           */
  11. typedef signed   char  INT8S;                    /* Signed    8 bit quantity                           */
  12. typedef unsigned short INT16U;                   /* Unsigned 16 bit quantity                           */
  13. typedef signed   short INT16S;                   /* Signed   16 bit quantity                           */
  14. typedef unsigned int   INT32U;                   /* Unsigned 32 bit quantity                           */
  15. typedef signed   int   INT32S;                   /* Signed   32 bit quantity                           */
  16. typedef float          FP32;                     /* Single precision floating point                    */
  17. typedef double         FP64;                     /* Double precision floating point                    */

  18. typedef unsigned int   SCH_TICKS;                //定义延时时钟数据类型




  19. #endif
复制代码


测试代码
  1. #include "includes.h"
  2. #include "app_cfg.h"

  3. SEM Sem1,Sem2;                                        //
  4. MBOX mbox1,mbox2;

  5. /********************************************************************************************************
  6. ** 函数名:        App_FunSemCreate
  7. ** 输  入:
  8. ** 输  出:
  9. ** 功能说明:信号量创建函数
  10. *********************************************************************************************************/
  11. static void App_FunSemCreate (void)
  12. {
  13.         INT8U                os_err;
  14.        
  15.         SCH_SemCreate(Sem1);       
  16.         SCH_SemCreate(Sem2);
  17.         SCH_MboxCreate(mbox1);
  18.         SCH_MboxCreate(mbox2);
  19. }


  20. void Ledred(void)
  21. {
  22.         SCH_TaskBegin();
  23.         while(1) {
  24.                 LEDOn(RED_LED);
  25.                 SCH_TimeDly(SCH_TICKS_PER_SEC/2);
  26.                 LEDOff(RED_LED);
  27.                 SCH_TimeDly(SCH_TICKS_PER_SEC/2);
  28.         }
  29.         SCH_TaskEnd();
  30.        
  31. }

  32. void Ledgreen(void)
  33. {
  34.         SCH_TaskBegin();
  35.         while(1) {
  36.                 LEDOff(GREEN_LED);
  37.                 SCH_TimeDly(SCH_TICKS_PER_SEC/2);
  38.                 LEDOn(GREEN_LED);
  39.                 SCH_TimeDly(SCH_TICKS_PER_SEC/2);
  40.         }
  41.         SCH_TaskEnd();
  42. }

  43. void Delay(void)
  44. {
  45.         static uint8_t        i;
  46.        
  47.         SCH_TaskBegin();
  48.         while(1) {
  49.                 for(i=0;i<5;i++) {
  50.                         printf("Delay Cnt = %d\r\n",i);
  51.                         SCH_TimeDly(SCH_TICKS_PER_SEC/2);
  52.                 }
  53.                 printf("Delay exit\r\n");
  54.         }
  55.         SCH_TaskEnd();
  56. }

  57. void Task_Sem1Test(void)
  58. {
  59.         uint8_t        err;
  60.        
  61.         SCH_TaskBegin();
  62.         while(1) {
  63.                 printf("Sem1 等待置位...\r\n");
  64.                 SCH_SemPend(Sem1,0,err);
  65.                 printf("Sem1 等待成功...\r\n");
  66.         }
  67.         SCH_TaskEnd();
  68. }

  69. void Task_Sem2Test(void)
  70. {
  71.         uint8_t        err;
  72.        
  73.         SCH_TaskBegin();
  74.         while(1) {
  75.                 printf("Sem2 等待置位,1秒钟超时...\r\n");
  76.                 SCH_SemPend(Sem2,SCH_TICKS_PER_SEC*10,err);
  77.                 if(err==SCH_ERR_TIMEOUT) {
  78.                         printf("【Sem2】 等待超时...\r\n");
  79.                 } else {
  80.                         printf("Sem2 等待成功...\r\n");
  81.                 }
  82.         }
  83.         SCH_TaskEnd();
  84. }

  85. void Task_Mbox1Test(void)
  86. {
  87.         uint8_t        err;
  88.         char         *p;
  89.        
  90.         SCH_TaskBegin();
  91.         while(1) {
  92.                 printf("mbox1 等待置位,1秒超时...\r\n");
  93.                 SCH_MboxPend(mbox1,p,SCH_TICKS_PER_SEC*5,err);
  94.                 if(err==SCH_ERR_TIMEOUT) {
  95.                         printf("【mbox1】 等待超时...\r\n");
  96.                 } else {
  97.                         printf("mbox1 等待成功...\r\n");
  98.                         printf("mbox=[%s]\r\n",p);
  99.                 }
  100.         }
  101.         SCH_TaskEnd();
  102. }

  103. void Task_Swap(void *p_arg)
  104. {
  105.         static uint8_t         i;
  106.        
  107.         SCH_SubTaskBegin();

  108.         for(i=0;i<5;i++) {
  109.                 printf("swap cnt = %d\r\n",i);
  110.                 SCH_TimeDly(SCH_TICKS_PER_SEC*2);
  111.         }
  112.        
  113.         printf("Task_Swap Exit\r\n");
  114.         SCH_SubTaskEnd();
  115.        
  116. }

  117. void Task_Swap1(void *p_arg)
  118. {
  119.         static uint8_t         i;
  120.         uint8_t                xx;
  121.        
  122.         SCH_SubTaskBegin();
  123.        
  124.         //SCH_CallSubTask(Task_Swap(NULL));
  125.        
  126.         printf("swap exit \r\n");
  127.         for(i=0;i<5;i++) {
  128.                 printf("swap1 cnt = %d\r\n",i);
  129.                 SCH_TimeDly(SCH_TICKS_PER_SEC*2);
  130.         }
  131.        
  132.         printf("Task_Swap1 Exit\r\n");  
  133.         SCH_SubTaskEnd();
  134. }


  135. void Task_SwapTest(void)
  136. {
  137.         uint8_t        err;
  138.         void         *p;
  139.        
  140.         int                test;
  141.           
  142.         SCH_TaskBegin();  
  143.         while(1) {
  144.                 printf("子任务调用测试...\r\n");
  145.                 SCH_CallSubTask(Task_Swap1(NULL));
  146.                
  147.                 printf("子任务调用测试完成,延时2秒...\r\n");
  148.                 SCH_TimeDly(SCH_TICKS_PER_SEC*2);
  149.         }
  150.         SCH_TaskEnd();
  151. }

  152. /********************************************************************************************************
  153. ** 函数名:main
  154. ** 输  入:
  155. ** 输  出:
  156. ** 功能说明:main函数
  157. *********************************************************************************************************/
  158. int main (void)
  159. {       
  160.        
  161.         uint32_t        i = 0;
  162.         uint32_t        ConnectTime;
  163.        
  164.         uint8_t                AppDownload = FALSE;
  165.         uint8_t                buf[256];
  166.        
  167.         uint32_t        Test = 0,Test2 = 0;
  168.        
  169.         uint8_t                ConnectStatus = FALSE;
  170.         char            GetKey;
  171.        
  172.         /*=========初始化核心代码=========*/
  173.         SCH_Init();                                                                //调度器初始化
  174.        
  175.         //初始化全局应用变量
  176.         GlobalTime = 998;                                //计数器

  177.         App_FunSemCreate();
  178.        
  179.     BSP_GPIOConfiguration();                               //GPIO配置
  180.         BSP_CpuPeriphInit();                                         //CPU相关硬件初始化
  181.        
  182.         BSP_WDT_HardInit();                                                //看门狗初始化
  183.        
  184.         LEDOff(GREEN_LED);
  185.         LEDOff(RED_LED);
  186.        
  187.         BSP_WDTHardReset();               
  188.        
  189.         while(1) {
  190.                
  191.                 SCH_TaskRun(Ledred,0);               
  192.                 //SCH_TaskRun(Delay,1);
  193.                
  194.                 //SCH_TaskRun(Task_Sem1Test,2);
  195.                 //SCH_TaskRun(Task_Sem2Test,3);
  196.                 //SCH_TaskRun(Task_Mbox1Test,4);
  197.                 Task_Swap(NULL);
  198.                 SCH_TaskRun(Task_SwapTest,4);

  199.                 GetKey = _getkey();
  200.         if(GetKey!=-1) {
  201.                         if(GetKey=='x') {
  202.                                 printf("Test Sem1\r\n");
  203.                                 SCH_SemPost(Sem1);
  204.                         } else if(GetKey=='y') {
  205.                                 printf("Test Sem2\r\n");
  206.                                 SCH_SemPost(Sem2);
  207.                         } else if(GetKey=='m') {
  208.                                 printf("Test mobx1\r\n");
  209.                                 sprintf((char*)buf,"Test mobx1\r\n");
  210.                                 SCH_MobxPost(mbox1,buf);
  211.                         }
  212.         }
  213.         }
  214. }



  215. /**
  216.   * @brief  Reports the name of the source file and the source line number
  217.   *         where the assert_param error has occurred.
  218.   * @param  file: pointer to the source file name
  219.   * @param  line: assert_param error line source number
  220.   * @retval None
  221.   */
  222. #ifdef  USE_FULL_ASSERT
  223. void assert_failed(uint8_t* file, uint32_t line)
  224. {
  225.     static char str1[256];
  226.         static uint32_t temp;
  227.        
  228.         memcpy((void*)str1,(const void*)file,strlen((const char*)file));
  229.         temp = line;
  230.   /* User can add his own implementation to report the file name and line number,
  231.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  232.         //my_printf("Worng parameters value:file%s on line %d\r\n",file,line);
  233.        
  234.         /* Infinite loop */
  235.         while(1) {       
  236.         }
  237. }
  238. #endif
  239. /*************************************************end of file********************************************/
复制代码


使用说明:
1,定时器中调用函数:SCH_TimeTick()
2,main函数开关调用SCH_Init()

=========================分割线==========================================

错误不合理之处,望大家指正,修改,一起完善。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2014-11-15 22:47:44 | 显示全部楼层
占楼              

出0入0汤圆

发表于 2014-11-15 23:03:42 | 显示全部楼层
顶起,楼主能否解释下思路?

出0入0汤圆

发表于 2014-11-15 23:24:37 | 显示全部楼层
这个宏用的,飞起啊~~~

出0入0汤圆

发表于 2014-11-15 23:38:29 | 显示全部楼层
mark
好好拜读下

出130入129汤圆

发表于 2014-11-15 23:47:10 | 显示全部楼层
也不能使用 switch语句?

出10入0汤圆

发表于 2014-11-16 10:30:57 | 显示全部楼层
mark!!!楼主讲一讲思路嘛....

出0入0汤圆

发表于 2014-11-16 11:02:06 | 显示全部楼层
支持LZ不断改进,造福坛友.

出0入0汤圆

发表于 2014-11-16 12:34:04 | 显示全部楼层
不错
学习学习

出0入0汤圆

发表于 2014-11-16 20:00:46 | 显示全部楼层
支持一下,好像是Protothreads修改的。

出0入0汤圆

发表于 2014-11-17 08:20:43 | 显示全部楼层
解说一下呗,

出0入0汤圆

发表于 2014-11-17 09:33:50 | 显示全部楼层
能否提供完整的工程文件啊,谢谢了啊

出0入0汤圆

发表于 2014-11-17 16:23:30 | 显示全部楼层
太复杂了,看到这么多宏,头大了!

出0入0汤圆

发表于 2014-11-17 16:26:02 | 显示全部楼层
mark! 学习了。。

出0入0汤圆

发表于 2014-11-17 19:46:20 | 显示全部楼层
这个OS很适用,顶顶顶!

出0入0汤圆

发表于 2014-11-19 15:41:34 | 显示全部楼层
一个思路,学习了.............

出0入0汤圆

发表于 2015-2-5 22:25:51 | 显示全部楼层
很牛!!!试用一下看看

出0入0汤圆

发表于 2015-2-10 15:37:08 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2015-5-16 12:02:38 | 显示全部楼层
能否提供完整的工程文件啊,谢谢了啊

出0入0汤圆

 楼主| 发表于 2015-5-18 10:23:16 | 显示全部楼层
不知道,1楼的帖子怎么编辑,现将最新版本的程序给出



app.c为测试例子

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入76汤圆

发表于 2015-6-28 00:16:59 | 显示全部楼层
tabc_123 发表于 2015-5-18 10:23
不知道,1楼的帖子怎么编辑,现将最新版本的程序给出

LZ升级扩展得不错, 感谢分享, 有时间试试

出0入0汤圆

发表于 2015-6-28 11:22:17 | 显示全部楼层
好帖子,赞一个

出425入0汤圆

发表于 2015-7-3 10:18:35 | 显示全部楼层
研究一下调度器

出0入0汤圆

发表于 2015-7-4 05:56:21 | 显示全部楼层
谢谢楼主, 学习了.

出0入0汤圆

发表于 2015-7-6 23:00:22 | 显示全部楼层
mark'dddff

出0入0汤圆

发表于 2015-7-21 15:38:55 来自手机 | 显示全部楼层
请问一下,这个调度器是不是没有优先级了,哪位明白的,给说一下,谢谢。

出0入0汤圆

 楼主| 发表于 2015-7-21 20:23:55 | 显示全部楼层
zhuzi1441 发表于 2015-7-21 15:38
请问一下,这个调度器是不是没有优先级了,哪位明白的,给说一下,谢谢。 ...

还是有优先级的,而且任务的优先级不允许相同

出0入0汤圆

发表于 2015-7-21 20:47:36 来自手机 | 显示全部楼层
非常感谢楼主的回复,有穵试月子,感觉很不错。

出0入0汤圆

发表于 2015-7-21 20:56:26 | 显示全部楼层
mark,谢了

出0入0汤圆

发表于 2015-7-27 15:39:58 | 显示全部楼层
2015最新版  SCH_TimeDly(Ticks) MPLAB X + XC8  环境 编译报错:constant expression required

出0入0汤圆

 楼主| 发表于 2015-7-27 22:31:12 | 显示全部楼层
zd0305 发表于 2015-7-27 15:39
2015最新版  SCH_TimeDly(Ticks) MPLAB X + XC8  环境 编译报错:constant expression required

我这没有这种编译器,无法测试,你在仔细研究一下,如果问题解决,希望你说下解决方法

出0入0汤圆

发表于 2015-7-28 10:40:45 | 显示全部楼层
经测试:
#define SCH_TimeDly(ticks)         do{_lc=(__LINE__%65535);TaskTcb[CurRunTaskId].TaskDly=ticks;TaskTcb[CurRunTaskId].SubExitFlag=1u;return;}while(0);case (__LINE__%65535):
中的case (__LINE__%65535):  这一语句编译不过,错误提示:case 语句需要常量;
临时解决办法:
#define SCH_TimeDly(ticks)         do{_lc=(__LINE__);TaskTcb[CurRunTaskId].TaskDly=ticks;TaskTcb[CurRunTaskId].SubExitFlag=1u;return;}while(0);case (__LINE__):

出0入0汤圆

发表于 2015-8-2 09:51:13 | 显示全部楼层
楼主,这个调度器不支持高优先级抢占,这样高优先级的任务实时性不能保证吧~

出0入0汤圆

 楼主| 发表于 2015-8-2 16:30:49 | 显示全部楼层
zd0305 发表于 2015-7-28 10:40
经测试:
#define SCH_TimeDly(ticks)         do{_lc=(__LINE__%65535);TaskTcb[CurRunTaskId].TaskDly=ticks;Tas ...

可能是编译器不一样,应该这种表达示是在预编译时处理的,可能你的编译器是将此类表达示放在程序运行中处理的,这是我的理解

出0入0汤圆

 楼主| 发表于 2015-8-2 16:35:38 | 显示全部楼层
qiguibao 发表于 2015-8-2 09:51
楼主,这个调度器不支持高优先级抢占,这样高优先级的任务实时性不能保证吧~ ...

这种调度器与RTOS是有区别的,不能进行抢占,只能说任务编号越小,提前执行而已

出0入0汤圆

发表于 2015-8-13 08:14:49 | 显示全部楼层
这个调度器很好用。

出0入0汤圆

 楼主| 发表于 2015-8-13 09:16:05 | 显示全部楼层
eddia2012 发表于 2015-8-13 08:14
这个调度器很好用。

谢谢使用,使用过程中有任何问题,请指出

出0入0汤圆

发表于 2015-8-15 12:10:37 | 显示全部楼层
mark,又是一个关于timer定时器的

出0入0汤圆

发表于 2015-8-16 15:52:12 | 显示全部楼层
有时间了再来验证,谢谢分享~

出0入0汤圆

发表于 2015-8-16 16:07:19 | 显示全部楼层
已经经过修改用在小产品上了!谢谢楼主的开源!

出0入0汤圆

 楼主| 发表于 2015-8-16 16:44:08 | 显示全部楼层
luozhongchao123 发表于 2015-8-16 16:07
已经经过修改用在小产品上了!谢谢楼主的开源!

能否分开修改部分的代码,一起将此代码修改得更加完善。。。。。

出0入0汤圆

发表于 2015-8-30 22:54:55 | 显示全部楼层
楼主,求一个stm8完整工程。

出0入0汤圆

 楼主| 发表于 2015-8-30 23:39:00 | 显示全部楼层
wxlcj 发表于 2015-8-30 22:54
楼主,求一个stm8完整工程。

前面的例子,不用CPU的,直接可以使用

出0入13汤圆

发表于 2015-11-24 21:59:26 | 显示全部楼层
不错,学习

出0入0汤圆

发表于 2016-6-27 22:32:01 | 显示全部楼层
很好,支持

出0入0汤圆

发表于 2016-6-28 08:49:46 | 显示全部楼层
感谢分享,好东西

出0入0汤圆

发表于 2016-8-11 10:56:23 | 显示全部楼层
借用楼主的思想,已用在好多工程中了。

出0入0汤圆

发表于 2016-9-3 17:47:45 | 显示全部楼层
好好学习楼主的思想试试看

出0入8汤圆

发表于 2016-9-6 14:31:42 | 显示全部楼层
tabc_123 发表于 2015-5-18 10:23
不知道,1楼的帖子怎么编辑,现将最新版本的程序给出

能否将getkey()函数发上来,学习你是怎么写的。
我以前都是状态机方式。

出0入0汤圆

 楼主| 发表于 2016-9-7 09:03:44 | 显示全部楼层
本帖最后由 tabc_123 于 2016-9-7 09:14 编辑
rube 发表于 2016-9-6 14:31
能否将getkey()函数发上来,学习你是怎么写的。
我以前都是状态机方式。 ...


我理解错了,getkey()只是一个串口数据接收函数

出0入8汤圆

发表于 2016-9-7 11:32:57 | 显示全部楼层
tabc_123 发表于 2016-9-7 09:03
我理解错了,getkey()只是一个串口数据接收函数

哦,谢谢

出0入0汤圆

发表于 2016-10-21 13:32:22 | 显示全部楼层
学习一个,纯C的调度器太巧妙了,使用调度器管理可以极大地减少阻塞

出0入0汤圆

发表于 2016-10-24 20:29:24 | 显示全部楼层
支持创新

出0入0汤圆

发表于 2016-12-17 22:27:03 | 显示全部楼层
学习一下,谢谢!@!

出0入0汤圆

发表于 2017-1-5 11:02:46 | 显示全部楼层
,谢谢分享;学习了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 04:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表