OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

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

查看: 56|回复: 4

求助: taskDISABLE_INTERRUPTS()关闭中断 后不能切换到其他任务吗?

[复制链接]

  离线 

3

主题

8

帖子

0

精华

新手上路

Rank: 1

积分
39
金钱
39
注册时间
2017-11-8
在线时间
6 小时
发表于 2017-11-10 11:09:35 | 显示全部楼层 |阅读模式
5金钱
在网上查不到相关明确说明  哪位高手可以指点一下 相关代码如下   调试输出打印 管擦 在关闭中断的期间   MyTask2  也没有得到执行   定时器1 中断级别为4   定时器6中断级别为6   
TaskHandle_t MyTaskHandle;
#define MYTASK_STACK_SIZE 128
#define MYTASK_PRY 3

TaskHandle_t MyTask2Handle;
#define MYTASK2_STACK_SIZE 128
#define MYTASK2_PRY 5


xTaskCreate(MyTask,
                                "MyTask",
                                MYTASK_STACK_SIZE,
                                NULL,
                                MYTASK_PRY,
                                MyTaskHandle);
    xTaskCreate(MyTask2,
                                "MyTask2",
                                MYTASK2_STACK_SIZE,
                                NULL,
                                MYTASK2_PRY,
                                MyTask2Handle);

void MyTask(void * pvParameters)
{
    //关闭中断
    char i=0;
    unsigned int j=0,x=0;
    while(1)
    {
        i++;
//        if(i>17)
//        {
//            i=0;
//            taskENTER_CRITICAL();
//            printf("enter critical \n");
//            x=560000000;
//            while(x)
//            {
//                x--;
//            }
//            taskEXIT_CRITICAL();
//            printf("exit critical \n");
//            
//        }
        //else
            if(i==5)
        {
            taskDISABLE_INTERRUPTS();
            printf("close interrupts \n");
             //portYIELD_FROM_ISR(MyTask2Handle);
            j=560000000;
            while(j)
            {
                j--;
            }
            taskENABLE_INTERRUPTS();
            printf("open interrupts \n");

        }



       vTaskDelay(1000);
    }
}
void MyTask2(void * pvParameters)
{


    while(1)
    {
       printf("it is task2\n");
       vTaskDelay(1000);
    }
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* USER CODE BEGIN Callback 0 */
    if(htim->Instance==htim1.Instance)
    {
        printf("time1\n");
        HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_6);
    }
    if(htim->Instance==htim6.Instance)
    {
         printf("time6\n");
        HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_7);
    }
/* USER CODE END Callback 0 */
  if (htim->Instance == TIM14) {
    HAL_IncTick();
  }
/* USER CODE BEGIN Callback 1 */

/* USER CODE END Callback 1 */
}


串口调试助手 输出结果 如下 :
time1
time6
it is task2
time1
time6
it is task2
time1
time6
it is task2
time1
time6
it is task2
close interrupts
time1
time1
time1
time1
time1
time1
time1
time1
time1
time1
time6
open interrupts
time1
time6
it is task2
time1
time6
it is task2
time1
time6
it is task2
time1
time6
it is task2



最佳答案

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

临界区和中断开关都关闭全局中断 包括系统滴答时钟和任务切换功能的 PendSV 中断, 所有的操作都需要成对出现 askDISABLE_INTERRUPTS(); 和 taskENABLE_INTERRUPTS(); taskENTER_CRITICAL(); 和 taskEXIT_CRITICAL(); 临界区源代码中实际上是调用 中断开关函数 在调用中断开关函数基础上增加了中断嵌套计数器 主要 是因为直接的开关中断方式不支持在开关中断之间的代码里再次执行开关中断的嵌套处理,假如当前我们 的 ...
回复

使用道具 举报

  离线 

3

主题

8

帖子

0

精华

新手上路

Rank: 1

积分
39
金钱
39
注册时间
2017-11-8
在线时间
6 小时
 楼主| 发表于 2017-11-10 11:09:36 | 显示全部楼层
临界区和中断开关都关闭全局中断 包括系统滴答时钟和任务切换功能的 PendSV 中断,
所有的操作都需要成对出现  
askDISABLE_INTERRUPTS(); 和 taskENABLE_INTERRUPTS();
taskENTER_CRITICAL(); 和 taskEXIT_CRITICAL();
临界区源代码中实际上是调用 中断开关函数 在调用中断开关函数基础上增加了中断嵌套计数器

主要
是因为直接的开关中断方式不支持在开关中断之间的代码里再次执行开关中断的嵌套处理,假如当前我们
的代码是关闭中断的,嵌套了一个含有开关中断的临界区代码后,退出时中断就成开的了,这样就出问题
了。 通过嵌套计数就有效地防止了用户嵌套调用函数 taskENTER_CRITICAL 和 taskEXIT_CRITICAL 时出错
回复

使用道具 举报

  离线 

50

主题

5843

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
11125
金钱
11125
注册时间
2013-11-13
在线时间
1181 小时
发表于 2017-11-10 11:53:43 | 显示全部楼层
关闭了全局中断肯定没法在进行任务切换了!!因为任务切换就需要PendSV中断!
回复

使用道具 举报

  离线 

3

主题

8

帖子

0

精华

新手上路

Rank: 1

积分
39
金钱
39
注册时间
2017-11-8
在线时间
6 小时
 楼主| 发表于 2017-11-10 11:58:38 | 显示全部楼层
zuozhongkai 发表于 2017-11-10 11:53
关闭了全局中断肯定没法在进行任务切换了!!因为任务切换就需要PendSV中断!

请问  如果我想关闭硬件中断 还不影响 任务之间的切换 是不是只能 通过 ST库中的方式或修改寄存器  关闭相应的中断使能呢?
回复

使用道具 举报

  离线 

3

主题

8

帖子

0

精华

新手上路

Rank: 1

积分
39
金钱
39
注册时间
2017-11-8
在线时间
6 小时
 楼主| 发表于 2017-11-10 12:02:11 | 显示全部楼层
40259574 发表于 2017-11-10 11:58
请问  如果我想关闭硬件中断 还不影响 任务之间的切换 是不是只能 通过 ST库中的方式或修改寄存器  关闭 ...

那 又出现另外一个问题了 既然 关闭中断函数 可以关闭任务切换 那么 是不是就可以替换taskENTER_CRITICAL() 了呢? 既然都可以关闭任务切换 那 taskENTER_CRITICAL() 相对于taskDISABLE_INTERRUPTS();  又有什么不同呢?
回复

使用道具 举报

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

本版积分规则




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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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