OSEck中odo_vect2pcb的作用

在基于OSEck RTOS的TI DSP中,中断可以作为一个进程存在,在OSEck系统中,进程分为两类:优先级进程,中断进程。当可屏蔽中断(INT4~15)发生后,就会执行相应的中断vector,在vector的代码中会找到注册在该中断号上的进程,然后由OSEck负责调度,进而切换到可屏蔽中断进程。该中断进程与优先级进程类似,同样有PCB(进程控制块),而在odo_vect2pcb数组中就存储了可屏蔽中断号(INT4~15)与中断进程PCB的映射(这就是vect2pcb的含义),odo_vect2pcb数组的索引作为中断号,索引对应的数组的值存储PCB指针。

例如,可以将TI DSP corePac的INTC模块中的eventCombiner的输出event0~3的中断服务程序创建为中断进程,如可以将event0绑定在INT5中断上,这样INT5中断发生后就会执行_vector5,然后通过下面的汇编代码odo_vect2pcb+vec_number*4找到event0对应的中断进程的PCB指针,OSEck就会切换到该进程执行,这里PCB结构中有个变量指示了进程的入口点,入口点就是event0的中断服务程序,每次中断发生后,切换到中断进程后,就会从该入口点处开始执行。

odo_vect2pcb[0~15] = {NULL,pcb1,...,pcb15};

INT0对应RESET,应该不需要设置中断进程。

 .sect	".vectors"
;RESET中断的vector。
__vector0:
     .nocmp
     BNOP    CheckFunc, 5
     .align 32

;vector1是用于NMI/Exception处理的。  
__vector1:
     .nocmp
     ;把栈指针B15的值写到GPLYB寄存器,注意,这里牺牲了GPLYB寄存器的值,来保存B15的值,B15中存储的是跳转到vector1之前的进程的栈指针,所以要保存起来。
      MVC     B15, GPLYB
     ;把事先准备好的exception的栈指针赋值给B15(栈指针,当运行某进程时,B15就指向进程的栈),这样在处理exception时,就会用特定的分配好的栈   exceptionErrorStackPtr。
      MVKL    exceptionErrorStackPtr, B15
     MVKH    exceptionErrorStackPtr, B15
     LDW     *B15[0], B15
     ;跳转到检查错误的函数执行,BNOP checkErrorFunc 5指令等同于B checkErrorFunc, NOP 5。
      BNOP    checkErrorFunc, 5

;默认的vector2~15的实现,用".macro"宏来实现。
vector_macro .macro vec_num
     .align 32
__vector:vec_num::
     STW	B11,*B15--   ;将B11的值保存在栈中(B15),
    ||MVKL	handlerFunc,B11 ;||表示本条指令与上一条指令是并行执行的,只占一个cycle的时间。
      MVKH	handlerFunc,B11
     ;跳转到handlerFunc函数,因为B指令有5个cycle的延迟,且本BNOP指令中已包含了1个NOP,所以用户可以在剩余的4个cycle中加四条指令执行,如下面的四条指令,这些指令执行完后,将真正切换到handlerFunc函数执行。
     BNOP B11,1      
     STW A11,*B15--
     STW A10,*B15--
     MVKL 	odo_vect2pcb+vec_number*4,A11  ;这样A11中保存了中断进程的pcb(进程控制块)指针
      MVKH	odo_vect2pcb+vec_number*4,A11
     .endm

vector_macro 2
vector_macro 3
vector_macro 4
vector_macro 5
vector_macro 6
vector_macro 7
vector_macro 8
vector_macro 9
vector_macro 10
vector_macro 11
vector_macro 12
vector_macro 13
vector_macro 14
vector_macro 15
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值