TriCore 基础知识-个人笔记

个人笔记

一、目前使用的指令集

1、MOVH.A
功能:将值 const16 移动到地址寄存器 A[c] 的最高有效半字并设置最低有效 16 位为零。
Eg:MOVH.A a2,0x8028
作用:设置地址寄存器A2高16b it设置为0x8028内容,低16bit为全0
疑问:根据UDE反汇编结果,这里是按照MOVH.A a2,#0x8028 去实施,不确定是反汇编显示问题还是其他情况
movh.a a3, #526 (立即寻址)
设置地址寄存器A2高16bit设置为526,低16bit为全0

2、LD.BU
在这里插入图片描述

EA = a[b] + sign_ext(off10)
A[b]内地址作为基地址,加上off10的偏移地址
D[a] = zero_ext(M(EA.byte))
含义:将EA地址指向的数据(1byte)放到D[a]的低8位,高24bit补0

Eg1:
//需要与Map文件一起看	 

void AppNet_Route_vReceiveMainFunction_Adapt(void)
{
	if(Tlib_CanStackTst_Com_Switch_C == 0)                   //Tlib_CanStackTst_Com_Switch_C map中对应地址为0x8028035C
     0x8012EA80 91 80 02 28  MOVH.A    a2,0x8028             //复制基地址0x8028到a2的高16bit
     0x8012EA84 39 2F 1C D0  LD.BU     d15,[a2]0x35C         //d15 = a2 | 0x35C地址指向内存的内容,这里数据只有一个byte,放在D15的低8位,高24bit补0
     0x8012EA88 EE 0A        JNZ       d15,0x8012EA9C        //判断d15内容是否不等于0,若不等于0,则跳转到0x8012727C
	{
		AppNet_Route_vReceiveMainFunction_10ms();
     0x8012EA8A 6D FF FB E3  CALL      AppNet_Route_vReceiveMainFunction_10ms (0x8012B280)  

		if(Tlib_CanStackTst_Interface_Switch_C == 1)
     0x8012EA8E 91 80 02 28  MOVH.A    a2,0x8028
     0x8012EA92 39 2F 7A 40  LD.BU     d15,[a2]0x53A
     0x8012EA96 5E 15        JNE       d15,0x1,0x8012EAA0  
		{
			Tlib_CanStackTst_Interface_Rx_10ms();
     0x8012EA98 1D 00 E4 20  J         Tlib_CanStackTst_Interface_Rx_10ms (0x80132C60) //无条件跳转到 0x80132C60地址执行函数 为什么不适用CALL,这里不需要返回到这里执行吗?
     ...
		}
   > 0x8012EA98 1D 00 E4 20  J         Tlib_CanStackTst_Interface_Rx_10ms (0x80132C60)  
   > ...
	}
	else
	{
		Tlib_CanStackTst_Com_10ms();
     0x8012EA9C 1D 00 12 00  J         Tlib_CanStackTst_Com_10ms (0x8012EAC0)  
	}


}
     0x8012EAA0 00 90        RET 
Eg2:
uint8 * p;
uint8 au8DataTmp1;
uint16 au16DataTmp2;
uint16 au16DataTmp3;

Rte_Read_gANC_u8IgnitionState_Val(p);
 0x8014CD60 91 10 00 27  MOVH.A    a2,0x7001  
 0x8014CD64 39 2F 6C 99  LD.BU     d15,[a2]-0x6994    //d15 = a2基地址-0x6994地址块的值  LD.BU与LD.HU区别为:前者传1byte、后者传2byte
 0x8014CD68 91 10 00 37  MOVH.A    a3,0x7001
Rte_Read_gEXL_u16FrontAllowSleep_Val(&au16DataTmp2);
 0x8014CD6C B9 38 6E 49  LD.HU     d8,[a3]-0x6AD2
 0x8014CD70 91 10 00 57  MOVH.A    a5,0x7001
Rte_Read_gWIP_u16FrontWiperAllowSleep_Val(&au16DataTmp3);
 0x8014CD74 B9 59 70 49  LD.HU     d9,[a5]-0x6AD0
 0x8014CD78 25 0F 00 00  ST.B      0x0,d15     //将D15内容放到地址0内

Data[0]= au8DataTmp1;
 0x8014CD7C DA 00        MOV       d15,0x0     //D15数据寄存器值清0
 0x8014CD7E 2C 40        ST.B      [a4]0x0,d15   //将D15数据寄存器值放到地址寄存器a4+0x00的地址内
Data[1]= (uint8)(( au16DataTmp2 >> 8) & 0xFF);
 0x8014CD80 89 48 02 08  ST.B      [a4]0x2,d8
 0x8014CD84 82 02        MOV       d2,0x0
Data[2]= (uint8)( au16DataTmp2 & 0xFF) ;
 0x8014CD86 89 49 04 08  ST.B      [a4]0x4,d9
Data[3]= (uint8)(( au16DataTmp3 >> 8) & 0xFF);
 0x8014CD8A 8F 88 1F F0  SH        d15,d8,-0x8  //将d8数据左移8位
 0x8014CD8E 2C 41        ST.B      [a4]0x1,d15 
Data[4]= (uint8)( au16DataTmp3 & 0xFF) ;
 0x8014CD90 8F 89 1F F0  SH        d15,d9,-0x8

return RTE_E_OK;

二、ARM寄存器

参考连接:https://blog.csdn.net/Sandeldeng/article/details/52954781
在这里插入图片描述

三、ARM寻址方式

在这里插入图片描述
在这里插入图片描述

四、TriCore汇编指令集

https://www.infineon-autoeco.com/BBS/Detail/4765
1、逻辑运算指令集

AND 位与
AND.AND.T 与,与 混合运算.
AND.ANDN.T 与,与非 混合运算.
AND.EQ 与,相等 混合运算. 不理解
AND.GE 与,或 混合运算.
AND.GE.U 与,大于等于 混合运算.
AND.LT 与,小于 混合运算.
AND.LT.U 与,小于(无符号) 混合运算.
AND.NE 与,不相等 混合运算.
AND.NOR.T 与,或非 混合运算.
AND.OR.T 与,或 混合运算.
AND.T 逻辑与.
ANDN 位与非.
ANDN.T 逻辑与非.

https://www.infineon-autoeco.com/BBS/Detail/6144
2、跳转指令
J 无条件跳转
JA 绝对地址无条件跳转
JEQ 比较整数相等则跳转
JEQ.A 比较指针相等则跳转
JGE 比较整数大于等于则跳转
JGE.U 比较无符号整数大于等于则跳转
JGEZ (16-bit) 比较整数大于等于0则跳转
JGTZ (16-bit) 比较整数大于0则跳转
JI 间接跳转
JLEZ (16-bit) 比较整数小于等于0则跳转
JLT 比较整数小于则跳转
JLT.U 比较无符号整数小于则跳转
JLTZ (16-bit) 比较整数小于0则跳转
JNE 比较整数不相等则跳转
JNE.A 比较指针不相等则跳转
JNED 比较整数不相等则跳转,并且将操作数减一
JNEI 比较整数不相等则跳转,并且将操作数加一
JNED, JNEI用于实现循环, 如for(; ; ;)这样的结构
JNZ (16-bit) 比较整数不等于0则跳转
JZ (16-bit) 比较整数等于0则跳转
JZ.A 比较指针等于0则跳转
JNZ.A 比较指针不等于0则跳转
JZ.T\JNZ.T 整数某一位等于0/不等于0则跳转
JLI\JL\JLA 这三个是连接跳转指令

五、TriCore中断

Tricore 1.3的中断机制有几个特点:
• 1.256个向量,第一个也就是第0号的中断向量无效,仅用来占位置,所以一共有255个向量,但是要占用256个向量的位置
• 2.向量表以优先级别排序,数字越小优先级别越低,这个直接跟Cortex 系列内和做法相反
• 3.每个向量32 Byte,也就是8个word.如果中断Handler非常短,可以直接放在这32Byte的空间.一般是放跳转指令,跳转到真正的中断Handler.(Tricore 1.6的中断向量可以选择32还是8 Byte, Tricore 1.3不能选择,只能32 Byte).
• 4.如果中断Handler超过了32Byte也放在向量表,显然后面的向量会被覆盖,如果被覆盖的向量是空的无问题,如果非空出现问题由程序员负责,编译工具不检查这点!
• 5. 发生中断后硬件自动保存Upper CSA,如需保存Lower CSA,需由程序员自己写指令来保存与恢复.
• 6. 有4个中断向量留给软件,只能软件触发,方便RTOS设计,如上几篇贴子写的FreeRTOS就是利用了其中一个软件中断来实现延迟中断进行任务调度的效果.
• 7. 中断不一定由CPU来响应,对于TC1782,还可能是由PCP来响应,对于多核的器件,还可由其它核来响应.某些中断必须由某个特定的中断master(CPU或者PCP)来响应.

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值