找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4623|回复: 4
收起左侧

UCOSIII在外部中断中使用延时函数会不会引起任务调度

[复制链接]
回帖奖励 1 黑币 回复本帖可获得 1 黑币奖励! 每人限 1 次
ID:379586 发表于 2018-12-12 13:09 | 显示全部楼层 |阅读模式
本帖最后由 chao超 于 2018-12-12 13:46 编辑

//外部中断0服务程序
void EXTI0_IRQHandler(void)
{
                OS_ERR err;
          u8 i;
//    CPU_SR_ALLOC();
//          OS_CRITICAL_ENTER();        //进入临界区        
          OSIntEnter();            

        delay_ms(200);        //消抖
               OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s 个人认为应该不会任务切换觉得是中断优先级太高

                OSSemPend(&SYNC_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //请求信号量  还有就是中断尽量不要使用请求信号量会引起堵塞能不能解释一下
                  if(PF0==0)         
        {
                printf("1111");
                OSSemPost(&SYNC_SEM,OS_OPT_POST_1,&err);//发送信号量
        }
                EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位
//         OS_CRITICAL_EXIT();        //退出临界区

    OSIntExit();            //退出中断

希望有大神解决问题
回复

使用道具 举报

ID:328014 发表于 2018-12-14 04:07 | 显示全部楼层
搞定了吗?
回复

使用道具 举报

ID:155507 发表于 2018-12-14 08:31 | 显示全部楼层
通常在中断子程序中是不调用延时子程序的,这样会增加中断处理时间,如果有其它低级中断了,就会延误响应中断了。

所以,中断子程序中不要写调用延时子程序,中断子程序也不要写得过长,处理过多的任务,要尽快处理后及时返回,如果中断一次有很多任务需要执行完全,可以在中断子程序中设置一个标志位,在主程序中查这个标志位,当标志为1时,就在主程序中完成这些任务,这样就不会影响其它中断源的中断,也不会使中断产生混乱。
回复

使用道具 举报

ID:64236 发表于 2018-12-14 11:34 | 显示全部楼层
OSSemPend(&SYNC_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);因为一旦信号量暂时没有到,会等待,于是就会引起堵塞
回复

使用道具 举报

ID:379586 发表于 2018-12-14 19:39 | 显示全部楼层
angmall 发表于 2018-12-14 08:31
通常在中断子程序中是不调用延时子程序的,这样会增加中断处理时间,如果有其它低级中断了,就会延误响应中 ...

是这样的有时候用延时函数也无法避免比如按键中断吧它总得要延时,所以主要是想知道在这种情况下,它会不会有任务切换的可能,如果有的话就得要临界保护了
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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