完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
你好,请帮忙。我突然重置了RCON=0x8000。从手册上得知,这意味着在高优先级陷阱期间出现了低优先级陷阱。我是这个特定的PIC和C30编译器的新手。问题会根据什么状态转移或消失ts以及它们在我的代码/函数中的顺序,这里涉及到某种随机性,它似乎表示可能出现堆栈溢出或某种奇怪的情况。我不知道如何/从哪里开始。最好的问候和任何帮助大大赞赏X。
|
|
相关推荐
19个回答
|
|
|
代码或死亡…
|
|
|
|
|
|
是的,我们确实需要看代码来帮忙。然而,典型的原因是指针变得疯狂,索引超出了数组的末尾,将参数“按值”传递给“按引用”或“反之亦然”的形式参数,将较大的值转换为较小的变量,并覆盖以下内容苏珊……
|
|
|
|
|
|
下面是我迄今为止发现的,也许有人有主意:我运行代码,它突然出现在Trap处理程序中,因为地址错误。我在那里添加了函数,这样我就能看到问题来自哪里。errLoc=getErrLoc();这没有定论,因为它指向地址0206,而地址0206与问题无关,并且我还认为errLoc的指针大小(void(*getErrLoc(void)(void);)只有16位并不能说明全部情况。调用子程序调用(在DISSSEMLY窗口中)。这是一个带有C中一些参数的函数调用,如:copyram2edsram((BYTE*)&tst_hd,machine.buf+._offset,len);当汇编程序代码用必要的参数设置堆栈并调用copyram2edsram指令时,就会出现陷阱。(在拆卸窗口中)当陷阱发生时正在执行,什么也没发生。单步时不会发生中断吗?我还能试一试吗?
|
|
|
|
|
|
问题是,在实时通信类型项目中,总的来说,这是相当复杂的代码。通过步进或查看代码,问题也不能可靠地重复。(见我的另一个回复)有趣的是,如果我在TI发生之前插入其他C语句,问题就会转移。
|
|
|
|
|
|
如果我在其中添加另一个语句,问题消失或出现在其他地方,像这样:
|
|
|
|
|
|
将陷阱处理程序添加到代码中。在那里设置一个断点并调试它。你可以一步一步地回到这个问题上。确保数据正确地关联数据类型。如果将字节数组转换为int,这是非常重要的。
|
|
|
|
|
|
传递指向EDS内存的指针在我的经验中总是有点诡计。正如XC16用户指南中的表13-2所示,普通指针需要一个工作寄存器,而EDS指针需要2。关键是确保所有内容都声明正确——变量、指针、函数和函数调用。SE的关键细节,所以很难说到底发生了什么。苏珊
|
|
|
|
|
|
代码很难阅读,只是片段。你有汇编代码吗?拼写检查警察:AsMbLeR,参数
|
|
|
|
|
|
大家好,这是一个漫长的周末,但现在我又回到了这个.@#$%问题。我在服务例程中设置了一个断点,用于查找地址错误,并将堆栈指针和内容跟踪回这段代码中的****HERE所示的语句:(它与我之前发送的C代码相关)MOV长度h1, W0 //0x0140x3BCF6: MOV DSRPAG, W0 //0x2080x3BCF8: MOV [W15-56], W3 //0xa0ea0x3BCFA: ADD W3, #0x8, W3 //A0F20x3BCFC: MOV W3, [W15-48]0x3BCFE: MOV [W15-54], W4 //0x00010x3BD00: MOV W4, [W15-46]0x3BD02: MOV W4, W130x3BD04: MOV W4, [W15-44]0x3BD06: MOV W4, DSRPAG0x3BD08: NOP0x3BD0A: MOV [W4++], W2 ******HERE0x3BD0C: MOV [W4--], W3 ******HERE0x3BD0E: MOV W0, DSRPAG //0x00010x3BD10: NOP0x3BD12: ADD W2, W14, W50x3BD14: MOV W5, [W15-52]0x3BD16: MOV W3, [W15-50]0x3BD18: MOV #0xFFCC, W60x3BD1A: ADD W6, W15, W60x3BD1C: MOV.D [W6], W20x3BD1E: MOV #0x5536, W00x3BD20: CALL copyram2edsram0x3BD22: NOPW4当时是0x0001。这可能是个问题吗>我试图通过编写奇数内存地址来模拟类似的情况,但是什么也没发生。然而,当我对任何代码进行最小的改变或添加额外的标记时,它以不同的方式编译这个代码,并使用a a不同的寄存器,问题就出现了。离开或移动到别处。这可能是编译器问题吗?我只是不知道,在实际项目上无法取得任何进展,直到这得到控制。
|
|
|
|
|
|
错误如下:0x3BCFE:MOV[W15-54],W4//0x0001导致:**奇数地址,地址必须是偶数,您有0x0001**0x3BD0A:MOV[W4+],W2****这里
|
|
|
|
|
|
MOV.B[W4++],W2;OKMOV[W4++],W2;不OK
|
|
|
|
|
|
嗨,你真应该搬到XC16去,不要停留在五年前被弃用的C30上……很多bug已经被修复了,XC16也增加了新的特性。从C30迁移到XC16是相当容易的,因为它主要是重命名编译器Regards。
|
|
|
|
|
|
谢谢。我认为这毕竟是一个编译器问题,我不确定这里的公司是否需要购买XC16,或者是免费升级吗?我必须在管理层之前运行它。ThatMOV[W4++],W2肯定是问题。W4包含与DSRPAG相同的值,所以它就是错误的。它应该是MOV[W3++],W2包含正确的地址值。
|
|
|
|
|
|
谢谢。我认为这毕竟是一个编译器问题,我不确定这里的公司是否需要购买XC16,或者是免费升级吗?我必须在管理层之前运行它。ThatMOV[W4++],W2肯定是问题。W4包含与DSRPAG相同的值,所以它就是错误的。它应该是MOV[W3++],W2包含正确的地址值。
|
|
|
|
|
|
您好,每个XC编译器都有一个免费的版本,您可以用于项目开发。它包含1级优化-o1(评估版本),并且必须限制C30免费版本dit在评估版本(-o0)中没有任何优化。C16评估也将免费。
|
|
|
|
|
|
这不是编译器问题,因为错误是由间接寻址引起的。编译器不可能检测程序在做什么。忽略这一点,我只检查函数参数。
|
|
|
|
|
|
刚刚安装了XC16。将使用O1优化。原来的C30有S优化,但它似乎编译和运行与O1。代码错误仍然是相同的。我现在在XC16上有堆和堆警告和编译错误。让我看看我是怎么走的。多么可怕的噩梦……
|
|
|
|
|
|
void copyram2edsram(const void*src,_eds_void*dest,unsigned int.)W0 W2:W3 W1eds,我认为是24位(32位reg对),以上就是参数传递的方式。将计算置于函数之外可以节省时间。
|
|
|
|
|
|
这对我来说是正确的:MOV[W1554 ],W4//0x001 HyWORD,LOWBYTEYou是从const /程序存储器读取的?这是高字,低字节位23∶16位15:0将在下一个地址寄存器001:xxxx中。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
501 浏览 0 评论
5808 浏览 9 评论
2350 浏览 8 评论
2237 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3543 浏览 3 评论
1155浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1119浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
887浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
501浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-12 03:45 , Processed in 3.537144 second(s), Total 109, Slave 92 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
364