野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2584|回复: 5

[ucos] UCOS定时器捕获的中断问题

[复制链接]
发表于 2021-10-19 12:35:35 | 显示全部楼层 |阅读模式
本帖最后由 datou2020 于 2021-10-21 10:16 编辑

请教一下各位大神,小弟写了一个用定时器捕获编码器脉冲,但加入操作系统UCOSiii的时候,发现只要采集的频率高到一定的时候,就会出现卡死的情况。在主程序中只有两个任务,一个是LED亮灭的任务,另一个是定时器采集完的数据进行计算得任务,中断就只有定时器的中断,其他都没有。现在不知道为什么会导致卡死。代码如下:

  1. //app_cfg.h文件
  2. #define  APP_TASK_LED_PRIO                     3
  3. #define  APP_TASK_LED_PRIO                     3
  4. #define  APP_TASK_ENCODER_PRIO           6
  5. #define  APP_TASK_START_STK_SIZE         128
  6. #define  APP_TASK_LED_STK_SIZE             128
  7. #define  APP_TASK_ENCODER_STK_SIZE    258

  8. //os_cfg_app.h文件
  9. #define  OS_CFG_INT_Q_SIZE                     100u              
  10. #define  OS_CFG_INT_Q_TASK_STK_SIZE   200u

  11. //app.c文件
  12. #include <includes.h>
  13. /**********************全局变量-每个任务间数据通信用************************/
  14. CPU_INT32U        encoderValue = 0x0;
  15. /*
  16. *********************************************************************************************************
  17. *                                                 TCB
  18. *********************************************************************************************************
  19. */
  20. static OS_TCB AppTaskStartTCB;   
  21. static OS_TCB AppTaskLedTCB;      
  22. OS_TCB AppTaskEncoderTCB;                       
  23. /*
  24. *********************************************************************************************************
  25. *                                                STACKS
  26. *********************************************************************************************************
  27. */
  28. static  CPU_STK  AppTaskStartStk[APP_TASK_START_STK_SIZE];      
  29. static  CPU_STK  AppTaskLedStk[ APP_TASK_LED_STK_SIZE ];
  30. static  CPU_STK  AppTaskEncoderStk[ APP_TASK_ENCODER_STK_SIZE ];
  31. /*
  32. *********************************************************************************************************
  33. *                                         FUNCTION PROTOTYPES
  34. *********************************************************************************************************
  35. */
  36. static  void  AppTaskStart  (void *p_arg);              
  37. static  void  AppTaskLed  ( void * p_arg );
  38. static  void  AppTaskEncoder    ( void * p_arg );
  39. int  main (void)
  40. {
  41.     OS_ERR  err;
  42.     OSInit(&err);                                                           
  43.          
  44.     OSTaskCreate((OS_TCB     *)&AppTaskStartTCB,                           
  45.                           (CPU_CHAR   *)"App Task Start",                           
  46.                           (OS_TASK_PTR ) AppTaskStart,                              
  47.                           (void       *) 0,                                         
  48.                           (OS_PRIO     ) APP_TASK_START_PRIO,                       
  49.                           (CPU_STK    *)&AppTaskStartStk[0],                        
  50.                           (CPU_STK_SIZE) APP_TASK_START_STK_SIZE / 10,              
  51.                           (CPU_STK_SIZE) APP_TASK_START_STK_SIZE,                    
  52.                           (OS_MSG_QTY  ) 5u,                                         
  53.                           (OS_TICK     ) 0u,                                         
  54.                           (void       *) 0,                                         
  55.                           (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
  56.                           (OS_ERR     *)&err);      

  57.    OSStart(&err);                                                         
  58. }   

  59. /*
  60. *********************************************************************************************************
  61. *                                         Start  TASK
  62. *********************************************************************************************************
  63. */
  64. static  void  AppTaskStart (void *p_arg)
  65. {
  66.     CPU_INT32U  cpu_clk_freq;
  67.     CPU_INT32U  cnts;
  68.     OS_ERR      err;
  69.     (void)p_arg;
  70.     BSP_Init();                                             
  71.     CPU_Init();                                                
  72.     cpu_clk_freq = BSP_CPU_ClkFreq();                           
  73.     cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz;        
  74.     OS_CPU_SysTickInit(cnts);                                   
  75.     Mem_Init();                                                
  76. #if OS_CFG_STAT_TASK_EN > 0u                                   
  77.     OSStatTaskCPUUsageInit(&err);                              
  78. #endif                                                         
  79.                                                                
  80.     CPU_IntDisMeasMaxCurReset();                              
  81.     /* 配置时间片轮转调度 */               
  82.     OSSchedRoundRobinCfg((CPU_BOOLEAN   )DEF_ENABLED,         
  83.                                            (OS_TICK       )0,                    
  84.                                            (OS_ERR       *)&err );            
  85.                                  
  86.     /* 创建 AppTaskLed任务 */
  87.     OSTaskCreate((OS_TCB     *)&AppTaskLedTCB,                           
  88.                            (CPU_CHAR   *)"App Task Led",                           
  89.                            (OS_TASK_PTR ) AppTaskLed,                              
  90.                            (void       *) 0,                                          
  91.                            (OS_PRIO     ) APP_TASK_LED_PRIO,                       
  92.                            (CPU_STK    *)&AppTaskLedStk[0],                        
  93.                            (CPU_STK_SIZE) APP_TASK_LED_STK_SIZE / 10,               
  94.                            (CPU_STK_SIZE) APP_TASK_LED_STK_SIZE,                  
  95.                            (OS_MSG_QTY  ) 5u,                                       
  96.                            (OS_TICK     ) 0u,                                       
  97.                            (void       *) 0,                                          
  98.                            (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
  99.                            (OS_ERR     *)&err);                                      
  100.                                          
  101.       /* 创建 AppTaskEncoderTCB 任务 */
  102.     OSTaskCreate((OS_TCB     *)&AppTaskEncoderTCB,                           
  103.                            (CPU_CHAR   *)"App Task Encoder",                             
  104.                            (OS_TASK_PTR ) AppTaskEncoder,                                
  105.                            (void       *) 0,                                          
  106.                            (OS_PRIO     ) APP_TASK_ENCODER_PRIO,                        
  107.                            (CPU_STK    *)&AppTaskEncoderStk[0],                          
  108.                            (CPU_STK_SIZE) APP_TASK_ENCODER_STK_SIZE / 10,               
  109.                            (CPU_STK_SIZE) APP_TASK_ENCODER_STK_SIZE,                     
  110.                            (OS_MSG_QTY  ) 100u,                                       
  111.                            (OS_TICK     ) 0u,                                          
  112.                            (void       *) 0,                                          
  113.                            (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),  
  114.                            (OS_ERR     *)&err);                                       
  115.                                          
  116.      OSTaskDel ( 0, & err );                     
  117. }

  118. /*
  119. *********************************************************************************************************
  120. *                                          LED TASK
  121. *********************************************************************************************************
  122. */
  123. static  void  AppTaskLed( void * p_arg )
  124. {
  125.         OS_ERR err;
  126.         (void)p_arg;
  127.                  
  128.         while (DEF_TRUE) {   

  129.                 macLED1_TOGGLE();
  130.                 OSTimeDlyHMSM ( 0, 0, 0, 100, OS_OPT_TIME_HMSM_STRICT, & err );   
  131.         }
  132.         
  133. }

  134. /*
  135. *********************************************************************************************************
  136. *                                          Encoder TASK
  137. *********************************************************************************************************
  138. */

  139. static  void  AppTaskEncoder    ( void * p_arg )
  140. {
  141.         OS_ERR err;
  142.         CPU_TS         ts;
  143.         CPU_INT32U tim_PscClk;

  144.         (void)p_arg;
  145.         
  146.         tim_PscClk = 72000000 / (GENERAL_TIM_PSC + 1);
  147.                  
  148.         while (DEF_TRUE) {

  149.                 OSTaskSemPend((OS_TICK   )0,
  150.                                         (OS_OPT    )OS_OPT_PEND_BLOCKING,
  151.                                         (CPU_TS   *)&ts,
  152.                                         (OS_ERR   *)&err);
  153.                
  154.                 encoderValue =  tim_PscClk / (TIM_ICUserValueStructure.Capture_Period * (GENERAL_TIM_PERIOD + 1) +\
  155.                                                 (TIM_ICUserValueStructure.Capture_CcrValue + 1));        
  156.                
  157.         }

  158. }

  159. /*
  160. *********************************************************************************************************
  161. *                                         STM32的定时器用TIM3,计数器的时钟  72000000/(71+1) = 1000000Hz,即1us;
  162. *                                         定时器周期0xffff即65535.产生一次中断的时间是1us*65535 = 65.535ms
  163. *********************************************************************************************************
  164. */

  165. void GENERAL_TIM_INT_FUN(void)
  166. {
  167.         OS_ERR   err;
  168.         OSIntEnter();                                      
  169.                                                         
  170.         if(TIM_GetITStatus(GENERAL_TIM, TIM_IT_Update) != RESET)
  171.         {
  172.                 TIM_ICUserValueStructure.Capture_Period++;
  173.                 TIM_ClearITPendingBit(GENERAL_TIM, TIM_FLAG_Update);
  174.         }
  175.         
  176.         if(TIM_GetITStatus(GENERAL_TIM, GENERAL_TIM_IT_CCx) != RESET)
  177.         {
  178.                 if(TIM_ICUserValueStructure.Capture_StartFlag == 0)
  179.                 {
  180.                         TIM_SetCounter(GENERAL_TIM, 0);
  181.                         TIM_ICUserValueStructure.Capture_Period = 0;
  182.                         TIM_ICUserValueStructure.Capture_CcrValue = 0;
  183.                         TIM_ICUserValueStructure.Capture_StartFlag = 1;
  184.                 }
  185.                 else
  186.                 {
  187.                         TIM_ICUserValueStructure.Capture_CcrValue = GENERAL_TIM_GetCapturex_FUN(GENERAL_TIM);
  188.                         TIM_ICUserValueStructure.Capture_StartFlag = 0;
  189.                         OSTaskSemPost((OS_TCB  *)&AppTaskEncoderTCB,
  190.                                                  (OS_OPT   )OS_OPT_POST_NONE,
  191.                                                  (OS_ERR  *)&err);
  192.                 }
  193.                 TIM_ClearITPendingBit(GENERAL_TIM, GENERAL_TIM_IT_CCx);
  194.         }
  195.         OSIntExit();                                       //退出中断        
  196. }

复制代码
回复

使用道具 举报

发表于 2021-10-20 11:34:17 | 显示全部楼层
个人觉得有可能是中断函数出现问题,以前看大佬写代码用UCOS写都没有中断,你检查一下。个人意见有可能不对
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-21 09:36:53 | 显示全部楼层
Summer-Q1X3T5 发表于 2021-10-20 11:34
个人觉得有可能是中断函数出现问题,以前看大佬写代码用UCOS写都没有中断,你检查一下。个人意见有可能不对 ...

如果是没有中断,如何实时地捕捉编码器的脉冲呢?
回复 支持 反对

使用道具 举报

发表于 2021-10-21 17:19:43 | 显示全部楼层
可以用电机例程里面的编码器测速例程,那个里面就是固定时间间隔读取编码器脉冲个数
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-22 16:53:48 | 显示全部楼层
Summer-Q1X3T5 发表于 2021-10-21 17:19
可以用电机例程里面的编码器测速例程,那个里面就是固定时间间隔读取编码器脉冲个数 ...

好的,非常感谢!!
回复 支持 反对

使用道具 举报

发表于 2021-10-22 19:10:52 | 显示全部楼层
希望你可以做出来
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-25 09:15 , Processed in 0.030329 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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