OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3326|回复: 0

freertos中为啥一直在外部中断里面,难道还要手动清除外部中断标志吗

[复制链接]

5

主题

5

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2019-1-15
在线时间
9 小时
发表于 2022-2-11 16:55:34 | 显示全部楼层 |阅读模式

刚开始运行时程序在led_task中,然后触发外部中断之后,程序进入到shell_task中之后,延时20ms后再次判断外部引脚状态,若此时外部中断引脚状态不为真,则程序就硬件错误了,难道还要手动清除外部中断标志吗,这是为啥阿,求大神解救
static void shell_on_task(void const * argument)
{
        UNUSED_PARAMETER(argument);
        uint32_t value = pdFALSE;
        
        while(1)
        {
                value = ulTaskNotifyTake(pdTRUE,portMAX_DELAY);
                if(value == pdTRUE)
                {
                        value = pdFALSE;
                        drv_beep->beep_high();
                        vTaskDelay(1000);
                        drv_beep->beep_low();
                        vTaskDelay(1000);
                }
                vTaskDelay(20);
        }
}

static void led_on_task(void const * argument)
{
        UNUSED_PARAMETER(argument);
        
        while(1)
        {
                drv_led->led_on();
                vTaskDelay(1000);
                drv_led->led_off();
                vTaskDelay(1000);
        }
}
static void shell_handle(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{
        BaseType_t xHigherPriorityTaskWoken;
        
        if(pin == SHELL_GPIO_PIN_NUM)
        {
                vTaskDelay(20);
                if(get_shell_status() == SHELL_ON)
               {
                      if(SHELL_TASK_Handle!=NULL)
                     {
                        vTaskNotifyGiveFromISR(SHELL_TASK_Handle,&xHigherPriorityTaskWoken);
                        portYIELD_FROM_ISR(xHigherPriorityTaskWoken);//如果需要的话进行一次任务切换
                     }
               }
        }
}

void main(void)
{
       shell_exit_init();
       led_init();

        if (pdPASS != xTaskCreate((TaskFunction_t)led_on_task, "LOGGER", 256, NULL, 1, &LED_TASK_Handle))
        {
                        APP_ERROR_HANDLER(NRF_ERROR_NO_MEM);
        }
        
        if (pdPASS != xTaskCreate((TaskFunction_t)shell_on_task, "LOGGER1", 256, NULL, 2, &SHELL_TASK_Handle))
        {
                        APP_ERROR_HANDLER(NRF_ERROR_NO_MEM);
        }

        NRF_LOG_INFO("HRS FreeRTOS example started.");
        // Start FreeRTOS scheduler.
        vTaskStartScheduler();

        for (;;)
        {
                APP_ERROR_HANDLER(NRF_ERROR_FORBIDDEN);
        }
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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