工具/软件:TI C/C++编译器
我有一个简单的代码,用于PRU读取PRU的循环计数器。 如果循环计数器达到0xFFFFFFFFFF,我希望将其设置为0并重新启用它。 (太糟糕了,它不会滚动...这会更有用)。
代码为C,如下所示:
uINT32_t易失性cn;
int main (void){
而(1){
cnt=PRU1_CTRL.cycle.cycle;
如果(cnt=0xFFFFFFFFFF){
PRU1_CTRL.CYCLE。CYCLE = 0;
PRU1_CTRL.CTRL.CTRL_Bit.counter_enable=1;
}
}
}
为前3行生成汇编列表:(使用编译器的版本2.1 .........5或2.2)
1.59亿 0000000万 00000024.8万E0 LDI r0,0x8000;[]$O$K3
16万 0000.0004万 0000002EFF8190零8190零&R16,4;[]$O$K8
1.61亿 000000800万 00000024万E1! LDI R1,||cnt||;[]$O$K4,cnt
似乎足够合理...r0有控制寄存器的地址,R1 有我的变量"cnt"的地址,并且R16的4字节被设置为零,作为一个值移动到循环计数器中,将其设置为0。
此问题与由零伪操作生成的代码有关 2 EFF8190。 它在调试器反汇编中显示为
Xin 255,&R16.bo,4.
我在十六进制操作代码上找到的唯一信息告诉我以下信息:
操作代码的十六进制表示格式2。
即,SUBOP是7,保留。
有关Xin的PRU装配说明的Wiki中的信息是:
在XIN上,从长度为IM(124)的寄存器REG开始的寄存器文件数据从具有IM(253)中指定的设备ID的硬件设备的并行XFR接口读取。
即,直接操作数255是非法的?
在任何情况下,此指令都会使PRU崩溃。
编译器上可能有一个标志来防止它生成非法指令?
任何帮助都是好的。
