小学生
最后登录1970-1-1
在线时间 小时
注册时间2015-8-28
|
本帖最后由 datou2020 于 2021-10-21 10:16 编辑
请教一下各位大神,小弟写了一个用定时器捕获编码器脉冲,但加入操作系统UCOSiii的时候,发现只要采集的频率高到一定的时候,就会出现卡死的情况。在主程序中只有两个任务,一个是LED亮灭的任务,另一个是定时器采集完的数据进行计算得任务,中断就只有定时器的中断,其他都没有。现在不知道为什么会导致卡死。代码如下:
- //app_cfg.h文件
- #define APP_TASK_LED_PRIO 3
- #define APP_TASK_LED_PRIO 3
- #define APP_TASK_ENCODER_PRIO 6
- #define APP_TASK_START_STK_SIZE 128
- #define APP_TASK_LED_STK_SIZE 128
- #define APP_TASK_ENCODER_STK_SIZE 258
- //os_cfg_app.h文件
- #define OS_CFG_INT_Q_SIZE 100u
- #define OS_CFG_INT_Q_TASK_STK_SIZE 200u
- //app.c文件
- #include <includes.h>
- /**********************全局变量-每个任务间数据通信用************************/
- CPU_INT32U encoderValue = 0x0;
- /*
- *********************************************************************************************************
- * TCB
- *********************************************************************************************************
- */
- static OS_TCB AppTaskStartTCB;
- static OS_TCB AppTaskLedTCB;
- OS_TCB AppTaskEncoderTCB;
- /*
- *********************************************************************************************************
- * STACKS
- *********************************************************************************************************
- */
- static CPU_STK AppTaskStartStk[APP_TASK_START_STK_SIZE];
- static CPU_STK AppTaskLedStk[ APP_TASK_LED_STK_SIZE ];
- static CPU_STK AppTaskEncoderStk[ APP_TASK_ENCODER_STK_SIZE ];
- /*
- *********************************************************************************************************
- * FUNCTION PROTOTYPES
- *********************************************************************************************************
- */
- static void AppTaskStart (void *p_arg);
- static void AppTaskLed ( void * p_arg );
- static void AppTaskEncoder ( void * p_arg );
- int main (void)
- {
- OS_ERR err;
- OSInit(&err);
-
- OSTaskCreate((OS_TCB *)&AppTaskStartTCB,
- (CPU_CHAR *)"App Task Start",
- (OS_TASK_PTR ) AppTaskStart,
- (void *) 0,
- (OS_PRIO ) APP_TASK_START_PRIO,
- (CPU_STK *)&AppTaskStartStk[0],
- (CPU_STK_SIZE) APP_TASK_START_STK_SIZE / 10,
- (CPU_STK_SIZE) APP_TASK_START_STK_SIZE,
- (OS_MSG_QTY ) 5u,
- (OS_TICK ) 0u,
- (void *) 0,
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
- (OS_ERR *)&err);
- OSStart(&err);
- }
- /*
- *********************************************************************************************************
- * Start TASK
- *********************************************************************************************************
- */
- static void AppTaskStart (void *p_arg)
- {
- CPU_INT32U cpu_clk_freq;
- CPU_INT32U cnts;
- OS_ERR err;
- (void)p_arg;
- BSP_Init();
- CPU_Init();
- cpu_clk_freq = BSP_CPU_ClkFreq();
- cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz;
- OS_CPU_SysTickInit(cnts);
- Mem_Init();
- #if OS_CFG_STAT_TASK_EN > 0u
- OSStatTaskCPUUsageInit(&err);
- #endif
-
- CPU_IntDisMeasMaxCurReset();
- /* 配置时间片轮转调度 */
- OSSchedRoundRobinCfg((CPU_BOOLEAN )DEF_ENABLED,
- (OS_TICK )0,
- (OS_ERR *)&err );
-
- /* 创建 AppTaskLed任务 */
- OSTaskCreate((OS_TCB *)&AppTaskLedTCB,
- (CPU_CHAR *)"App Task Led",
- (OS_TASK_PTR ) AppTaskLed,
- (void *) 0,
- (OS_PRIO ) APP_TASK_LED_PRIO,
- (CPU_STK *)&AppTaskLedStk[0],
- (CPU_STK_SIZE) APP_TASK_LED_STK_SIZE / 10,
- (CPU_STK_SIZE) APP_TASK_LED_STK_SIZE,
- (OS_MSG_QTY ) 5u,
- (OS_TICK ) 0u,
- (void *) 0,
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
- (OS_ERR *)&err);
-
- /* 创建 AppTaskEncoderTCB 任务 */
- OSTaskCreate((OS_TCB *)&AppTaskEncoderTCB,
- (CPU_CHAR *)"App Task Encoder",
- (OS_TASK_PTR ) AppTaskEncoder,
- (void *) 0,
- (OS_PRIO ) APP_TASK_ENCODER_PRIO,
- (CPU_STK *)&AppTaskEncoderStk[0],
- (CPU_STK_SIZE) APP_TASK_ENCODER_STK_SIZE / 10,
- (CPU_STK_SIZE) APP_TASK_ENCODER_STK_SIZE,
- (OS_MSG_QTY ) 100u,
- (OS_TICK ) 0u,
- (void *) 0,
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
- (OS_ERR *)&err);
-
- OSTaskDel ( 0, & err );
- }
- /*
- *********************************************************************************************************
- * LED TASK
- *********************************************************************************************************
- */
- static void AppTaskLed( void * p_arg )
- {
- OS_ERR err;
- (void)p_arg;
-
- while (DEF_TRUE) {
- macLED1_TOGGLE();
- OSTimeDlyHMSM ( 0, 0, 0, 100, OS_OPT_TIME_HMSM_STRICT, & err );
- }
-
- }
- /*
- *********************************************************************************************************
- * Encoder TASK
- *********************************************************************************************************
- */
- static void AppTaskEncoder ( void * p_arg )
- {
- OS_ERR err;
- CPU_TS ts;
- CPU_INT32U tim_PscClk;
- (void)p_arg;
-
- tim_PscClk = 72000000 / (GENERAL_TIM_PSC + 1);
-
- while (DEF_TRUE) {
- OSTaskSemPend((OS_TICK )0,
- (OS_OPT )OS_OPT_PEND_BLOCKING,
- (CPU_TS *)&ts,
- (OS_ERR *)&err);
-
- encoderValue = tim_PscClk / (TIM_ICUserValueStructure.Capture_Period * (GENERAL_TIM_PERIOD + 1) +\
- (TIM_ICUserValueStructure.Capture_CcrValue + 1));
-
- }
- }
- /*
- *********************************************************************************************************
- * STM32的定时器用TIM3,计数器的时钟 72000000/(71+1) = 1000000Hz,即1us;
- * 定时器周期0xffff即65535.产生一次中断的时间是1us*65535 = 65.535ms
- *********************************************************************************************************
- */
- void GENERAL_TIM_INT_FUN(void)
- {
- OS_ERR err;
- OSIntEnter();
-
- if(TIM_GetITStatus(GENERAL_TIM, TIM_IT_Update) != RESET)
- {
- TIM_ICUserValueStructure.Capture_Period++;
- TIM_ClearITPendingBit(GENERAL_TIM, TIM_FLAG_Update);
- }
-
- if(TIM_GetITStatus(GENERAL_TIM, GENERAL_TIM_IT_CCx) != RESET)
- {
- if(TIM_ICUserValueStructure.Capture_StartFlag == 0)
- {
- TIM_SetCounter(GENERAL_TIM, 0);
- TIM_ICUserValueStructure.Capture_Period = 0;
- TIM_ICUserValueStructure.Capture_CcrValue = 0;
- TIM_ICUserValueStructure.Capture_StartFlag = 1;
- }
- else
- {
- TIM_ICUserValueStructure.Capture_CcrValue = GENERAL_TIM_GetCapturex_FUN(GENERAL_TIM);
- TIM_ICUserValueStructure.Capture_StartFlag = 0;
- OSTaskSemPost((OS_TCB *)&AppTaskEncoderTCB,
- (OS_OPT )OS_OPT_POST_NONE,
- (OS_ERR *)&err);
- }
- TIM_ClearITPendingBit(GENERAL_TIM, GENERAL_TIM_IT_CCx);
- }
- OSIntExit(); //退出中断
- }
-
复制代码 |
|