ucos使用中断的问题

2019-07-20 22:34发布

不好意思,又来叨扰了,我基于ucos2写了一个程序,实现PC12中断输入,控制PC13灯亮一分钟,但是实际上并不好使,还请大家帮我分析一下,给我一点建议
#include "includes.h"
/************************优先级定义**************************************/
#define task_start_prio 4
/**********************堆栈大小定义**************************************/
#define task_start_stack_size 80
static  OS_STK    task_start_stack[task_start_stack_size];
/************************主函数******************************************/
int main(void)
{
    HAL_Init();
    gpio_init();
    BSP_Init();
    OSInit();
    OSTaskCreate(task_start,(void *)0,(OS_STK *)&task_start_stack[task_start_stack_size-1],task_start_prio);
    OSStart();
    return 0;
}
/***********************初始化外设**************************************/
void gpio_init(void)
      {
            __HAL_RCC_GPIOC_CLK_ENABLE();

            GPIO_InitTypeDef  GPIO_Initstruct_pc13;
            GPIO_Initstruct_pc13.Mode=GPIO_MODE_OUTPUT_PP;
            GPIO_Initstruct_pc13.Pin=GPIO_PIN_13;
            GPIO_Initstruct_pc13.Pull=GPIO_PULLUP;
            GPIO_Initstruct_pc13.Speed=GPIO_SPEED_FREQ_VERY_HIGH;
            HAL_GPIO_Init(GPIOC,&GPIO_Initstruct_pc13);
      }
void exti_init(void)
      {
            __HAL_RCC_SYSCFG_CLK_ENABLE();
            GPIO_InitTypeDef  GPIO_Initstruct_pc12;
            GPIO_Initstruct_pc12.Mode=GPIO_MODE_IT_RISING;
            GPIO_Initstruct_pc12.Pin=GPIO_PIN_12;
            GPIO_Initstruct_pc12.Pull=GPIO_PULLDOWN;
            GPIO_Initstruct_pc12.Speed=GPIO_SPEED_FREQ_VERY_HIGH;
            HAL_GPIO_Init(GPIOC,&GPIO_Initstruct_pc12);
      }
void nvic_init()
      {
            HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
            HAL_NVIC_SetPriority(EXTI15_10_IRQn,0,15);
            HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
      }
/************************建立任务***************************************/
void  task_start (void *p_arg)
{
    (void)p_arg;
          {
                while(1)
                      {
                            HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
                      }
          }
}
void EXTI15_10_IRQHandler(void)
      {
            HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
      }
void  HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
      {
            OSIntEnter();
            HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
            OSTimeDlyHMSM(0,1,0,0);
            OSIntExit();
      }
/**********************************************************************/





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
11条回答
zdfwyh
2019-07-22 02:01
本帖最后由 zdfwyh 于 2016-4-29 10:09 编辑

楼上是对的,有操作系统的情况下延时函数是会被强制打断去执行任务程序的.除非你在延时时关了中断,但这将严重破坏系统实时性,严重时会导致崩溃,在中断中加延时本身也是不允许的,必须要保证系统实时性,中断服务必须短小精悍,省时,做完就走.

void  HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
      {
            LED=1;
      }
void  task_start (void *p_arg)
{
    (void)p_arg;
          {
                while(1)
                      {
                           if(LED){ HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);LED=0;OSTimeDlyHMSM(0,1,0,0);}//点灯,延时1分钟
                          
                           HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);//灭灯
                      }
          }
}

一周热门 更多>