This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TRAP #16 UCOS



不知道有大神用过micrium官方的ucos移植没,给28335的。里面任务级切换和中断级切换使用同一个函数是几个意思?中断级切换并不需要陷阱啊!!!

  • 如果是F28335的ucos程序的话,你看看OS_TASK_SW的定义

    #define OS_TASK_SW() asm(" TRAP #16")

    在这里用TRAP 指令来初始化中断,它跳转到PieVectTable 中断向量表中的第16个中断DATALOG的地址,你的代码中找到这句PieVectTable.DATALOG= &OSCtxSw;也就是OSCtxSw() 的入口地址,从而实现了任务切换。

    OSIntCtxSw()的定义也是如此.

    现在我的问题的是,一般都是使用Userx 的来实现任务切换的,为何选择DATALOG?

    PINT USER1; // User Defined trap 1   第21个中断向量
    PINT USER2; // User Defined trap 2
    PINT USER3; // User Defined trap 3
    PINT USER4; // User Defined trap 4
    PINT USER5; // User Defined trap 5
    PINT USER6; // User Defined trap 6
    PINT USER7; // User Defined trap 7
    PINT USER8; // User Defined trap 8
    PINT USER9; // User Defined trap 9
    PINT USER10; // User Defined trap 10
    PINT USER11; // User Defined trap 11
    PINT USER12; // User Defined trap 12  第32个中断向量

  • 如果是F28335的ucos程序的话,你看看OS_TASK_SW的定义

    #define OS_TASK_SW() asm(" TRAP #16")

    在这里用TRAP 指令来初始化中断,它跳转到PieVectTable 中断向量表中的第16个中断DATALOG的地址,你的代码中找到这句PieVectTable.DATALOG= &OSCtxSw;也就是OSCtxSw() 的入口地址,从而实现了任务切换。

    OSIntCtxSw()的定义也是如此.

    现在我的问题的是,一般都是使用Userx 的来实现任务切换的,为何选择DATALOG?

    PINT USER1; // User Defined trap 1   第21个中断向量
    PINT USER2; // User Defined trap 2
    PINT USER3; // User Defined trap 3
    PINT USER4; // User Defined trap 4
    PINT USER5; // User Defined trap 5
    PINT USER6; // User Defined trap 6
    PINT USER7; // User Defined trap 7
    PINT USER8; // User Defined trap 8
    PINT USER9; // User Defined trap 9
    PINT USER10; // User Defined trap 10
    PINT USER11; // User Defined trap 11
    PINT USER12; // User Defined trap 12  第32个中断向量

  • 1.首先,OS_TASK_SW() asm("TRAP #16)完全没有问题,它就是这么用的。

    但是,OSIntCtxSw是中断级任务切换,在中断服务程序中调用,完全没有必要也不能以中断的方式进入,那样会导致重复压栈。特别是竟然和任务级的切换指令完全相同,这本身就不合逻辑。

    2.其次,asm(“TRAP #16)是RTOSINT并不是DLGINT。见下图:

  • 确实是RTOSINT,我对照工程代码,我是从1开始数,不是从0开始数.
    OSIntCtxSw是中断级任务切换,目前ucos做控制设计都不会在中断服务程序中进行任务切换,程序只是保留了这个功能
  • 那就是说中断中也不能发送信号量之类的了?因为发送信号量的话很可能会进行高优先级任务切换。

  • 是的,这样设计就是中断都是实时的,不会被打断

  • 汗,中断本来就是实时的好吗。问题是这样,任务还是实时的吗?

  • 我的说法有误,函数OSIntCtxSw()会在中断服务函数执行完成之后执行,实现任务的切换,中断都是实时的

    我看到控制系统ucos的都是使用OSCtxSw(),

  • 嗯,谢谢,我再仔细研究研究。