个人笔记
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
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;
参考连接:https://blog.csdn.net/Sandeldeng/article/details/52954781
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 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)来响应.