完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
我使用xc8 1.44和PIC16F18876。我有一个源文件A,它在其他一些源文件B中调用一个函数。这个函数的原型在B的标头中声明,该标头由A包含。这个函数的原型看起来像:指针类型。现在问题是:主叫方的参数是可以的。我可以通过在函数调用之前设置断点来检查ICD4调试器。但是,当我在被叫方中设置断点并检查参数时,它们不匹配。PARAM1和3都可以。但是指针的PARAM2被弄乱了。被叫中的指针指向一些随机内存,而不是期望的内存!我提供了两个截图来显示问题。Calel.pNG显示了TestPtR中的正确地址。Cale.PNG显示了到达被叫方的参数。PARAM2与TestPrTrar中的地址不匹配。SOMDEATA阵列是全局定义的:我有一种奇怪的感觉:参数被混淆了。被叫方的错误地址是0x010B。高字节(01)似乎可以。但是,在低字节D7中用0B替换,奇怪的是,0x0b恰好是PARAM3的值!检查呼叫器PARAM3.PNG。当我将param3的值改为其他值时,比如0x0A,被调用者中的错误指针值也会改变。不知为什么,param3被读取为param2的低字节!发生什么事?看起来二进制接口被搞乱了吗?为什么被叫方不知道如何从呼叫者那里得到论点?这是不是与一些奇怪的银行切换魔术我不知道?事实上,我根本不关心银行交换,因为就我的理解而言,当我使用指向数组的指针时,编译器使用间接寻址模式为我处理这个问题。
|
|
相关推荐
9个回答
|
|
|
你好!可以将测试指针声明为易失性变量吗?编译器可以容易地优化变量或指针不可预测的方式。易失性声明使调试更加可预测。
|
|
|
|
|
|
你使用的是哪种“香精”?使用编译的堆栈,我可以想象对调用参数的检查是徒劳无益的,您必须继续检查*data在哪里被访问。顺便说一下:为什么不传递“someDataArray”而不是“testptr”?
|
|
|
|
|
|
大家好,谢谢你的回复。@ NIKOLYAYPO:我会使指针波动,但这必须等到明天,因为我目前无法访问源代码。@ DUO090001001:对不起,我无法检查我的堆栈是如何配置到明天。然而,问题是使用MPLABX的默认设置。TestPtR的介绍仅用于调试目的。在第一个版本中,我直接通过了数组。下午,我做了进一步的研究。我检查了调用方中的TestPtR的大小和被调用方的PARAM2的大小,使用SIZEOFE()。调用方中的siZeof(TestEOF(and;SOMDEATAARSART(0)))是C中的1个sisiof(PARAM2)。艾莉2岁,这是个问题!这也解释了为什么PARAM3的值在PARAM2的低字节中结束。调用方总共传递了3个字节,但是被调用方期望4个字节,因为它们有不同的意见,指针应该是多大的。我仔细检查了XC8手册,第5.4.5页关于PoTr.OK,有不同大小的指针。但是,XC8应该根据上下文确定每个指针的正确大小。我还检查了汇编列表文件中的指针列表(我明天可以提供)。列表确认TestPtR的大小是1字节,PARAM2是2字节。奇怪的是,列表确认PARAM2C。一个指向一个数组,那么为什么XC8生成不同大小的指针?好了,现在就这样。也许你们中的一些人已经知道我做错了什么?再见,卢格
|
|
|
|
|
|
如前所述,我可以从列表文件中提供指针列表的相关部分:如您所见,xc8在确定param2可以指向的可能对象时是正确的。该列表显示param2可以指向某个DataArray,testptr也可以。TER被传递,而函数()则期望一个2-ByTe-指针。
|
|
|
|
|
|
使TestPtR成为某种“远指针”,目前它只能在非常有限的区域内指向。而函数调用显然不知道这个“细微差别”。
|
|
|
|
|
|
你好,我已经尝试过法拉第解决方案了。我尝试了限定符_u far和_u ram,根据xc8手册,它们可以得到两个字节的指针。但是,它仍然不起作用。而且,根据手册,这不应该是必要的。xc8总是确定要使用哪种类型的指针。但是,我感觉函数调用很混乱。func()期望一个两字节的指针,调用者传递一个1字节的指针。这是函数调用的程序集列表。但是,我不太熟悉PIC16汇编程序。看起来一切都很好。你是否可以在指针参数中检查1字节还是2字节?
|
|
|
|
|
|
(所有的代码块阻止愚蠢的论坛将变量转换成电子邮件地址)
|
|
|
|
|
|
这是个问题吗?还记得吗,两天前我曾写过param3的值以param2的低字节(指针)结束。也许param2传递正确,但是,由于这些“滑稽”的代码行,低字节会被覆盖?
|
|
|
|
|
|
这是编译器中的一个bug。这个(无用的)代码:用第三个参数的值覆盖第二个参数的低位。两者都“?“测试循环”和“FUNC@ DATABUFEPRTR”在同一个地方:报告给Microchip。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
508 浏览 0 评论
5813 浏览 9 评论
2351 浏览 8 评论
2238 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3545 浏览 3 评论
1164浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1122浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
890浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
508浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-15 14:01 , Processed in 1.808947 second(s), Total 89, Slave 72 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
5508