完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
我发现了我认为XC16中的一个缺陷,或者更可能在XC16的优化器部分中处理了*PSVy*标记的常量。我现在没有几天的时间来尝试构建一个简化的程序来重新创建问题,但是我想我会在这里发布我所经历的,以防其他人遇到问题,或者如果有空闲时间的人想要尝试并重新创建它。我的项目构建在MPLAX3中。15与XC16 1.25为PIC24EP512GP204。在硬件上进行测试,而不是在模拟器上进行测试,但是如果我的猜测是正确的,那么在模拟器中它也会失败。我的项目有很多常量查找表,并且我接近它们的auto-psv空间的极限,因此决定移动一些较少使用的表来编译托管psv空间。我不介意为了访问这些表而管理额外PSV页面的编译器中涉及的额外代码的速度损失的表。我有一个表,其中包含一个图形,该图形在启动时在我的LCD上显示一次。当声明为:const无符号char djd_logo3[1100]={然后将其更改为:u psv_const无符号char_.((space(psv))djd_logo3[1100]={此时当调用使用该表的函数时,代码导致地址异常。我的第一个想法是,也许我的索引超出了界限,但是仔细的检查显示它总是在范围之内,并且地址陷阱是在它进入的第一个循环中发生的,而索引是零。我检查了映射文件,发现编译器把表放在代码空间的最顶端,而其他东西都在代码空间的底部。表的起始位置是一个4字节的边界,这意味着一个双字边界。所以应该很好。我的下一步是向声明中添加一个“对齐”属性。我添加了对齐(8192)。现在不再有地址陷阱,但是图形的图像是不正确的。前30或40个像素是错误的。我看了看地图,发现编译器现在将表向下移动到与下层代码空间中的其他常量和代码相同的区域,而不是在代码空间的顶部。然后我意识到可能发生的事情。使用这个表的代码是一个大的循环,它从该表中读取字节,然后将这些字节作为索引用于另一组颜色查找表,以获得要放到屏幕上的实际红色、绿色和蓝色值。这意味着,在循环中,代码不断地访问一个表,然后另一个表。第一个表是移动到空间(psv)的表,而另一个表(颜色查找表)仍然是空间中的常规常量部分(auto-psv)的一部分。因此,当编译器从一个表读取数据然后从另一个表读取数据时,它必须不断地在循环中切换PSV页。我猜想,编译器在PSV页之间的切换上搞砸了,在试图访问其中一个表时设置为错误的PSV页。因此,我的下一步是在函数开始时创建一个小循环,并将图形从psv空间表加载到RAM数组中,然后在大循环中使用RAM数组而不是图形表。这样,大循环从RAM查找中提取图像,然后通过颜色查找表将其转换。但不再需要在这个大循环中切换PSV页面,这就解决了问题。现在,图形加载罚款和查找颜色罚款,并显示在液晶显示器上罚款。然后,我返回并删除声明中的align属性,然后编译器又将表移回代码空间的顶部,一切仍然正常。我相信它工作得很好,因为它不再试图在大循环中的两个PSV页面之间来回快速切换。我怀疑优化器最终将更改PSV页面的代码移动到错误的位置,并且当它试图访问两个表中的一个表时,PSV页面实际上仍然为另一个PSV页面设置为另一个表。当一个表位于代码空间的顶部时,如果它试图根据它在不同PSV页面中的位置访问一个表,但是PSV页面实际设置在那里,那么我可以看到它最终超出界限并导致地址陷阱。同样地,一旦表在代码空间的较低位置被重新定位(在我添加align属性之后),所有地址都将是有效的,但是如果PSV页码设置错误,那么就不会指向正确的数据。因此,结果中没有地址陷阱,只有坏数据,这就是我屏幕上出现错误数据的原因。我怀疑这与优化器(我把它设置为级别1)没有将切换PSV页面的代码与从特定常数数组读取的代码一起保留有关。
|
|
相关推荐
13个回答
|
|
|
你必须盯着某个集会,但这可以是2号勘误吗?注意问题摘要:“表读或写”,但详细的描述只写。无论如何,我建议提交一张支持票。
|
|
|
|
|
|
我不认为这是因为两个原因。一,我没有使用DO循环,这就是它所提到的。二,当两个表都在自动PSV空间时效果良好。当两张桌子在不同的空间时,它就失灵了。除了编译器为管理PSV窗口而更改的内容之外,函数的代码中没有任何更改。我猜编译器正确地设置了访问第一个表的空间(psv),它应该使用_u psv_来管理这个表,但是没有将PSV窗口设置回auto-p。SV的时间空间为第二个表来访问正确的位置。第二个表在auto-psv空间的常量区域中很高,因此如果它偏移到auto-psv空间,则被使用到另一个psv空间,当另一个PSV页面被设置到代码空间的顶部时,它最终会得到一个高于代码空间的地址,因此导致地址陷阱t我拿到帽子了。
|
|
|
|
|
|
哦,好吧。只是一个想法。
|
|
|
|
|
|
出于好奇,你试过用优化器关闭了吗?
|
|
|
|
|
|
好的电话。我没有尝试过,并且已经着手完成这个项目。但是由于我所做的更改相当简单:在函数的开头只有3行代码用于将表复制到ram数组,而在函数的中间只有一行代码是相同的,除了引用是针对ram数组而不是表本身,所以很容易注释掉它们e四行,复制一行,返回对表的直接引用。然后,我为项目设置了优化为零,重新编译它,它运行得很好。因此,当在紧循环中在空间(psv)和空间(auto-psv)之间进行交替时,XC16优化并且不正确地管理PSV窗口肯定是一个问题。它可能与我的循环(两个嵌套循环,x和y,以及在x和y范围内的特定窗口范围内发生的查找)的特定细节有关,它以某种方式优化,并且不同的循环可能得到不同的优化。如果没有人有时间对此进行实验,并尝试复制它,我将尝试在一个月左右完成这个项目,并尝试创建一个具有相同问题的简化项目。我不能上传这个项目给人们玩。
|
|
|
|
|
|
首先,您需要确定陷阱发生的准确位置。然后,您需要查看反汇编,看看它在那个位置做什么。
|
|
|
|
|
|
好吧,我猜错了。查看反汇编,它看起来是在正确的时间设置和恢复PSV页面(实际上是此组件中的DSRPAG)。出现的情况是,它不正确地将指针设置到表。映射显示的表为0x54 BB4。由于某种原因,代码似乎将寄存器设置为0x1054 BB4。更奇怪的是,它在访问表时没有执行的循环的一部分中执行该操作。以下是循环的伪代码:如果(y<9|y>118|x<35||x>44)显示后台其他图形,则y=0到127表示x=0到79。指向表格的寄存器(并且用错误的数字进行操作)在显示为“显示背景”的部分内部发生,但是表读取在显示为“显示图形”的部分中。使用这些寄存器来设置DSRPAG并从偏移量读入该页的部分位于“显示图形”部分,因为它们应该是这样的。但是正在使用的寄存器在另一节中被设置,这在循环的相同迭代中不执行。
|
|
|
|
|
|
0x1054BB4中的1进入DSRPAG寄存器的第9位,选择程序存储器而不是扩展数据存储器。如果您的代码是从程序复制到数据存储器,它将使用DSWPAG进行写入。请检查处理器的差错。我还记得一个bug,它带有增减后内存访问指令,导致内存的最后/第一个单词出现地址错误。如果编译器不知道有什么指向字节,它可能会使用Word Access,它会在奇数地址上出错。
|
|
|
|
|
|
这部分唯一与内存相关的错误是在DO循环的最后一个指令中不能进行PSV访问,并且如果在发生中断时访问低于0x200的程序内存,则可能发生地址陷阱。概括地说:1-当表在空间时,在x-y循环之前将表复制到RAM没有问题(psv),优化是12-当表在空间时(auto-psv),在x-y循环中访问表没有问题,优化是13-当表在空间(psv)时,在x-y循环中访问表没有问题,优化是04——当表在空间(psv)时,在x-y循环中访问表有问题,优化是1,2,3和4在函数中具有相同的代码。唯一的区别在于表是如何声明的(在第一篇文章中对auto-psv vs psv进行了描述),以及项目的优化设置为0还是1。
|
|
|
|
|
|
您可以比较3和4的情况下的拆卸,并将它们张贴在这里。
|
|
|
|
|
|
这个函数相当庞大和复杂。我不打算把它贴在这里。在这两种情况下,拆卸显示DSRPAG的部分切换是相同的。区别在于它是如何计算地址的。未优化的版本正好在使用它之前。优化后的版本在函数的几个点中展开,包括部分代码片段,这些代码没有在使用表的相同循环中执行。理论上可以在这些周期中正确地初始化它。我没有时间深入到代码中去看看现在是否是这样的。我发布了这个帖子,没有寻找原因,而是指出它正在发生,并为遇到问题的其他人提供一个可能的修复。我需要完成我的项目,现在没有时间深入研究这个问题。也许在几周内,我可以花时间尝试建立一个简单的项目来重建这个问题。如果那样的话,我可以提交一张有证明的票。同时,如果有人有空闲时间,并想尝试重新创建问题,我认为触发它的线索都在这里。
|
|
|
|
|
|
好的,谢谢。它可能是一个没有其他人发现的编译器错误,但它更可能是代码中的一个bug。你没有做太多说服其他人。
|
|
|
|
|
|
嗯,我觉得证据很清楚。但我必须假设你是正确的,直到我有时间回来,并尝试在一个简化的项目中重新创建。然后我们再看看。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
454 浏览 0 评论
5793 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3529 浏览 3 评论
1121浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1095浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
872浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
466浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 17:54 , Processed in 1.238661 second(s), Total 96, Slave 79 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1969