Microchip
直播中

王静

7年用户 159经验值
私信 关注
[问答]

函数调用期间参数混合

我使用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)

杜元晓

2020-4-2 08:06:16
你好!可以将测试指针声明为易失性变量吗?编译器可以容易地优化变量或指针不可预测的方式。易失性声明使调试更加可预测。
举报

王璨

2020-4-2 08:11:36
你使用的是哪种“香精”?使用编译的堆栈,我可以想象对调用参数的检查是徒劳无益的,您必须继续检查*data在哪里被访问。顺便说一下:为什么不传递“someDataArray”而不是“testptr”?
举报

段朝思

2020-4-2 08:26:16
大家好,谢谢你的回复。@ 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生成不同大小的指针?好了,现在就这样。也许你们中的一些人已经知道我做错了什么?再见,卢格
举报

黄远飞

2020-4-2 08:44:19
如前所述,我可以从列表文件中提供指针列表的相关部分:如您所见,xc8在确定param2可以指向的可能对象时是正确的。该列表显示param2可以指向某个DataArray,testptr也可以。TER被传递,而函数()则期望一个2-ByTe-指针。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分