完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我正在研究一个项目,我们使用PIC32 MZ2048 EFM124处理器和XC32版本1.40编译器。与c32编译器相比,xc32编译器对NOP以外的指令使用分支延迟槽。这导致一些问题,因为分支延迟槽中的指令并不总是执行的。例如,考虑这个代码片段:void somefunc(int i){//do.}void otherfunc(void){int i;for(i=0;i<5;i++){somefunc(i);}}调用somefunc被转换为JALR和一个分支延迟槽,其中包含分配给锁的寄存器的递增指令al变量i.增量指令永远不会执行,导致程序永远留在循环中。一种解决方法是将变量i声明为volatile,但是考虑到上面是到处使用的常见结构,这是不实际的。除了NoP以外,他还使用分支延迟时隙吗?我一直在考虑-mcompact-.=.,但我不确定这是否会起作用,并将其添加到MPLAB属性中的xc32-gcc选项中,这让编译器抱怨有一个未知的选项。
|
|
相关推荐
3个回答
|
|
那不是真的。你能发布一个完整的、可重复的例子吗?
|
|
|
|
对不起,很抱歉,我弄错了。我同时在处理几个项目,其中一个是PIC32MZ和xc32编译器版本1.40,另一个是PIC32MX和c32编译器版本1.51。我确实遇到了c32编译器版本1.51的分支延迟槽问题。(如代码片段所示)但是到目前为止,这是一个过时的编译器版本,因此此信息可能是空白的。我确实通过使循环变量易失性来消除这个问题,从而强制它离开寄存器。触发我的是,当我每次在if语句之后输入代码时引入一个全局计数器时,代码突然开始工作。从反汇编中可以看出,在原始分支语句+相关联的分支延迟槽之后添加了另外三行:额外代码:LW V0、-32560(GP)ADDIU V0、V0、1SWV0、-32560(GP),然后是原始代码:ADDIU V0、ZERO、1等。在以下几行中,它们不应该影响前面的分支指令,但不知何故它们会影响它们,因为我在添加这个全局计数器之前和之后运行了许多测试,结果总是相同的。只在这三行中访问的全局变量使得输入条件代码成为可能。我不会进一步研究这个问题,而只是在别人遇到这种现象时做个笔记。所以,再次抱歉打扰您。
|
|
|
|
为了将来的参考,我相信McCalm分支是指发布6 MIPS架构的新的紧凑分支指令(B.C),而不是在所有当前PIC32中使用的版本2(MX)/版本5(MZ)架构。分支延迟时隙是使用-FNO延迟分支。这可以应用在函数的基础上使用优化属性。概率。虽然我还没有遇到一个问题,如OP是指(如果在if语句)尚未。可能有些其他原因,因为分支延迟时隙中的指令总是在分支被执行之前执行(对于非B.L指令B…L指令可以用-MNO分支可能的命令行选项禁用)。
|
|
|
|
只有小组成员才能发言,加入小组>>
5238 浏览 9 评论
2028 浏览 8 评论
1950 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3204 浏览 3 评论
请问电源和晶体值之间有什么关系吗?PIC在正常条件下运行4MHz需要多少电压?
2253 浏览 5 评论
772浏览 1评论
663浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
590浏览 1评论
PIC Kit3出现目标设备ID(00000000)与预期的设备ID(02c20000)不匹配。是什么原因
672浏览 0评论
572浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 16:13 , Processed in 1.281817 second(s), Total 80, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号