OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 76|回复: 1

FreeRTOS外部中断中能挂起任务吗?

[复制链接]

  离线 

3

主题

8

帖子

0

精华

新手上路

Rank: 1

积分
39
金钱
39
注册时间
2017-11-8
在线时间
6 小时
发表于 2017-11-9 13:48:04 | 显示全部楼层 |阅读模式
5金钱
外部中断 设置两个按键  一个是挂起任务 一个是恢复任务  恢复任务一切正常  但是挂起任务的时候 程序就死了   哪位高手能帮忙看下是什么原因?
TaskHandle_t  Led0_Handle;
#define LED0_STACK_SIZE 128
#define LED0_TASK_PRI   5

//LED01 浠诲姟
    xTaskCreate(Led1_Task,
                                "led1",
                LED1_STACK_SIZE,
                NULL,
                LED1_TASK_PRI,
                &Led1_Handle);        


void Led0_Task(void * pvParameters)
{
   unsigned char i=0;
    for(;;)
  {
      i++;
      printf("LED0task %d\n",i);
    HAL_GPIO_TogglePin(GPIOA, LED0_Pin);
    osDelay(500);
  }
}   

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin==key0_Pin)
    {
        //osDelay(5);
        if(HAL_GPIO_ReadPin(GPIOE, key0_Pin)==GPIO_PIN_SET)
        {
            printf("key0 is down\n");
            vTaskSuspend(Led0_Handle);
            //portYIELD_FROM_ISR(Led0_Handle);

        }

    }
    else if(GPIO_Pin==key1_Pin)
    {
        //osDelay(5);
        if(HAL_GPIO_ReadPin(GPIOE, key1_Pin)==GPIO_PIN_SET)
        {
            printf("key1 is down\n");
            xTaskResumeFromISR(Led0_Handle);
            portYIELD_FROM_ISR(Led0_Handle);
        }
    }
}

最佳答案

查看完整内容[请看2#楼]

已经知道 原因 默认配置文件中 #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 /* The highest interrupt priority that can be used by any interrupt service routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER PRIORITY THAN THIS! (higher priorities are lower numeric values. */ #define co ...
回复

使用道具 举报

  离线 

3

主题

8

帖子

0

精华

新手上路

Rank: 1

积分
39
金钱
39
注册时间
2017-11-8
在线时间
6 小时
 楼主| 发表于 2017-11-9 13:48:05 | 显示全部楼层
已经知道 原因  默认配置文件中
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY   15

/* The highest interrupt priority that can be used by any interrupt service
routine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL
INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
PRIORITY THAN THIS! (higher priorities are lower numeric values. */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5

/* Interrupt priorities used by the kernel port layer itself.  These are generic
to all Cortex-M ports, and do not rely on any particular library functions. */
#define configKERNEL_INTERRUPT_PRIORITY                 ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY         ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )


所以 中断优先级在0-4之间 不可调用 FReeRTOS API    5-15可以调用带FromISR结尾的API函数



也就是说  无论什么时候  中断函数里面都不能使用 vTaskSuspend() 函数
那是不是可以理解为  在中断中 不可以直接挂起 任务呢?
回复

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2017-11-23 04:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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