This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/TMS320C6746:编译器生成导致PRU崩溃的指令

Guru**** 2614265 points
Other Parts Discussed in Thread: TMS320C6746

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/643038/compiler-tms320c6746-compiler-generates-instructions-which-cause-the-pru-to-crash

部件号:TMS320C6746

工具/软件: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崩溃。

编译器上可能有一个标志来防止它生成非法指令?  

任何帮助都是好的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很遗憾,我无法按照给定的方式构建您的代码。  请按照如何 提交编译器测试用例一文中的说明提交测试用例

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    PRU的编译器版本是2.1 .........5 (2.2 ........0的功能非常相似)。

    编译器选项包括:

    -O4 --opt_for speed=5 --include_path="C:\ti/ccsv61/ccsv6/tools/compiler/ti-CGT-PRU_Preproc_wide.5/include" 2.1 -g --preproc_with评论--preproc_wd_compile --display_error_number --diag_warning=225 off --diag_enwrap=little

    如果有帮助,链接程序命令文件:

    -cr

    堆栈0x40

    -堆 0x00

    /*--entry_point=_c_int00_noinit_noargs_noexit*/

    内存

     第0页:

       PMEM: org=0x0 len=0xF00

     第1页:

       DMEM: org=0x0 len=0x100

       SMEM: org=0x100 len=0x100

    }

    章节

     .bss :{}>DMEM,第1页

     数据:{}>DMEM,第1页,palign =2

     init_array:{}>DMEM,第1页,palign = 2

     .stack:{}>SMEM,第1页,palign = 2

     .boot: {}>PMEM,第0页

     .text:{}>PMEM,第0页

    }

    和预处理的源文件:

    typedef无符号int UINT32_t;

    typedef结构{

     volatile结构{

       uINT32_t rsvd1:3;

       UINT32_t counter_enable:1;

       uINT32_t rsvd2:28;

     } CTRL_BIT;

     UINT32_t逆电流器[2]; //0x04,0x08

     挥发性UINT32_t循环;//0x0C

    } pruCtrl;

    uINT32_t易失性cn;

    内部主(无效)

     而(1){

       cnt=(*((volatile pruCtrl*)0x8000)).cycle;

       如果(cnt=0xFFFFFFFFFF){

        (*(volatile pruCtrl*) 0x8000)。cycle=0;

        (*(volatile pruCtrl*) 0x8000).CTRL_bit.counter_enable=1;

       }

     }

    }

     

    e2e.ti.com/.../1538.main.pp.txte2e.ti.com/.../prurelease.cmd.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    事实证明,TMS320C6746上有较旧版本的PRU。  您需要将--silit_version=1添加到构建选项中。  这将防止使用无效的零指令。  对此造成的不便,我深表歉意。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢George。  刚刚注意到您的回复。  这确实解决了这个问题。

    在我看到这一点之前,我已经尝试在IDE中选择silit -v1作为完成项目的变通办法,但我们必须知道这是正确的解决方案。

    再次感谢。