关于多核ECU的中断向量表,热心网友问了一个很好的问题
今天研究了一下,先说结论: 每个core都有自己单独的memory去存储自己的中断向量表,而且每个core的中断优先级是相互独立的。也就是说,每个core都可以有自己的priority为20的中断
接下来是论证过程:【赶时间的同学可以直接拉到最后看杰伦】
1. 以Tasking编译器为例,安装目录下自带了关于 中断向量表的 linker 文件 【TC3XX 系列最多有6个core,所以为每个core都预留了一个linker文件】
2. 打开这些lsl文件,可以看见每个core的 中断向量表是以 INTTAB0, INTTAB1等为起始地址的
core0: 【红框中的001,002,003代表中断优先级】
core1:
而这个 INTTAB0,INTTAB1等 在 相应的TC3XX.lsl 里面定义,在
如果你花点时间去查 infineon的TC3xx的datasheet,每个CORE_n的中断向量表的起始地址是通过寄存器BTV_n定义的。Tasking在startup 函数里面把“0xa00f0000”赋值给了BIV,从而和上面linker 文件的定义匹配上了,说白了就是tasking的人帮我们都写好了,我们买编译器花的钱一部分就是买这个
3. 然后去查Tasking编译器的手册,它会告诉你在TC3xx 系列,写interrupt函数的时候要同时声明 core和中断优先级,这样编译器才能根据 2 里面提到的 lsl文件 将它放到正确的位置
https://www.tasking.com/support/tricore/ctc_user_guide_v6.2r2.pdf
总结:
1. 多核ECU,每个core都有自己的BIV寄存器,用来定义该核的中断向量表起始地址。 每个core的中断优先级相互独立,可以相同
2. 在main函数之前的startup函数里面会对BIV寄存器进行初始化,即自定义各核的中断向量表起始地址
3. 在编写c的interrupt函数时,编译器规定要同时声明core和priority
4. linker文件会根据声明的core和priority,将函数存放到正确的地址,从而中断发生时,PC指针会跳转到正确的位置
5. 因为BIV同时在linker和startup函数里面用到,所以如果用户需要修改,两处要匹配。目前我们用的linker和startup函数都是Tasking提供的,所以Tasking已经提前帮我们匹配好了