完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
我对EDS指针发现的问题感到惊讶。我发现了几种错误代码生成的情况,其中之一是我两年前提交的,现在仍然在V1.25中。我将要生成一些支持情况。它们都与类型转换时生成的错误代码有关(16位指针到eds指针的推广,整数类型t的转换)。o eds指针和与eds指针产生虚假类型转换的联合)IMNSHO微芯片对EDS指针进行错误编码,因为它们这样做使得对EDS指针的操作容易出错和代码效率低下,但我无法想象让他们改变它!关于类型转换应该做什么,有很多选择,所以我想征求意见。以下是我的想法,请批判:u EDS_char*edsp;char*p;long l;edsp=(u EDS_char*)p;Microchip已经选择(我相信)促进16位指针指向前2pRAM的时代——尽管它们总是产生不正确的代码!这导致了一般的P!=*(u EDS_char*)p,如果常量在闪存(又称PSV空间)中并且p的顶部位被设置。我认为这是错误的,如果DSRPAG=0x202,那么0x8000(char*)应该是0x2028000(eds指针)而不是0x18000(eds指针)。o eds指针,假设它们是指向线性地址空间的指针。例如,0x1000000(长)被转换为0x2008000(eds指针),该指针指向闪存的开始-对我来说有意义。l=(长)edsp;微芯片选择此为空操作。例如,0x2008000(eds指针)被转换为0x2008000(l o)。这是L!=(intptr_t)(long)(__EDS_char*)l.虽然我不认为它是标准的一部分,并且指针&l t;->整数可以依赖于机器,但我相信一般认为如果整数足够大l==(足够大的整数)(void*)l.一些实现甚至定义了类型intptr_t(u)。这是一个“足够大的整数”,我将航行到一月底(哦,天哪!!!!)但是,我希望产生一些讨论/意见,这样我就可以把它们呈现给Micro.,或许可以激励他们修复bug,甚至可能稍微改进一下代码生成。
|
|
相关推荐
19个回答
|
|
|
你的代码中有没有定义?
|
|
|
|
|
|
我在过去有一些问题,其他人也加入了这个线程:HTTP://www. McCHIP.COM/FUMMS/M81682.ASPX
|
|
|
|
|
|
_u HAS_EDS_是由编译器定义的,如果目标cpu具有EDS,即Ram>30Keds指针在所有目标处理器上都是可用的——它操纵PSVPAG寄存器。在非DSRPAG机器上,可以使用EDS指针读取EEPROM,但不使用闪存的上字节。
|
|
|
|
|
|
指针必须是线性的。没有其他选择让他们正确工作跨越页面边界。例如,指向DSRPAG=202/偏移=0x8000的指针必须是0x1018000。每次使用时,它们都必须被转换成(DSRPAG+Offset)。EDS内存设计不当会导致相当冗长的转换:DSRPAG=(Addr<0x8000)?1:ADDR & gt;15;偏移=(ADDR & lt;0x8000)?Addr:(Addr&0x7fff)|0x8000;在XC16中实现指针的任何人可能都想避免这种情况,并以某种方式对其进行优化,但是看起来他们确实不能够干净地完成它。
|
|
|
|
|
|
在另一个线程()中的讨论可能更加相关。捏造是正确的。但是,当使用“&”获取直接地址时,那些DSRPAG设置已经正确了,好像操作已经发生了。例如,这意味着您不能在_u eds_指针和uint32_t之间来回转换,因为它会继续执行一些移位,并对值执行操作。当您使用这些指针访问数据时,编译器不会对地址做任何特殊的操作,这意味着您可以在UTIN 32×T之间来回转换(甚至操作它,以使编译器在没有直接DSRPAG操作的情况下访问MSB)。由于编译器在何时以及如何修改原始32位地址以便处理页方案(即,将位15移到位16和设置位15)方面不完全一致,所以会发生许多混乱或意外的行为,从而造成分裂。将新的32位值转换为DSRPAG和EA可以按预期工作。直接设置函数
|
|
|
|
|
|
所以要点是,EDS变量实际上应该无缝地支持,而不需要在语法上施展符咒。它应该是神秘的编码器。因为它们不能创建一个“优化”的EDS支持实现,即使代码大小增加,也要做蛮力。目前,事情不正常工作…所以它本质上是无用的。最好至少让它工作…然后对其进行优化。假设编译器设计者足够胜任。
|
|
|
|
|
|
嗯,这个线程表明曾经有一个问题,它已经解决了,所以…
|
|
|
|
|
|
你知道什么版本解决了这个问题吗?我使用V1.21,因为V1.25不能在调试模式下编译和运行。由于明显的原因,太害怕不敢移动到V1.26。
|
|
|
|
|
|
|
|
|
|
|
|
除了空与零之间,指针和整数之间的转换是实现定义的(或未定义的)。数据和eds地址空间不兼容,试图在页寄存器中使用0来寻址数据空间会导致地址陷阱——在指向这两个空间的指针或原因之间没有明智的方法进行强制转换。我有点惊讶编译器不只是巴掌。我真的不知道你有什么可抱怨的。
|
|
|
|
|
|
我必须同意。将一个EDS指针强制转换为某种随机类型并发现它不工作,这与将一个常量指针强制转换为8位部分上的非常量并发现它不工作一样令人惊讶。
|
|
|
|
|
|
铸造或不铸造,指针操作必须正确工作。为了确保这一点,您必须限制数组,使它们不跨越页面边界,或者必须提出跨越页面边界的指针操作。想要使用EDS的人可能更喜欢后者。
|
|
|
|
|
|
WOW-在没有评论之后,我发现@jyaronthe bugs(我提交了13个bug)在V1.25中,我的ticket仍然打开,我怀疑是否有v1.26中修复了(我已经太沮丧了,不想再尝试了).@fluby., @jtemplesC标准声明抛出一个p点对int和返回必须指向相同的内存,如果int足够大,如果不够大,那么它就是未定义的。将prog和psv指针指向eds指针是完全合理的(也是理想的),因为它们是eds的子集。将普通指针强制转换为eds点是非常理想的。如果你有一个超过32K的堆栈,你必须使用eds指针(实际上不是……)。编译器生成正确的代码来处理“0”页,并且它们正确地处理了那个部分(尽管很痛苦),如果使用eds指针,则会得到所有ram的无缝地址空间。如果要使用_memcpy_eds,则如果将指针传递给ram(即页面0),则无法实现这一点。至于我的挫败感,我查看了编译器源代码,花了几个小时才找到我报告的3/4bug的修复(还有几个自V1.20之前他们就知道了!)
|
|
|
|
|
|
米基亚你支付每年200美元的敲诈勒索费用吗?
|
|
|
|
|
|
你能详细说明前面的语句中的“yMeMyPyEDS”标识符吗?我不认为这是一个在USPC文档中的LIB函数或忠告。
|
|
|
|
|
|
它只表示可以将指针转换为整数,并将任意整数转换为指针。它并不是说操作是对称的。
|
|
|
|
|
|
宏在“libpic30.h”中定义。在v1.25中,它被定义为,而它应该在头文件中注明,它将接受指向RAM的通用指针。如果指针指向PSV(如常量字符串),它将不起作用。编译器产生可怕的代码,但……不,我不支付他们200美元/年-我是一个退休的爱好者
|
|
|
|
|
|
它只表示可以将指针转换为整数,并将任意整数转换为指针。这并不是说操作是对称的。好吧,你是对的,ANS X3.159-1989(这是xc16的标准)不要求它是对称的,尽管我认为它一直是预期的行为。事实上,该标准包括一个脚注(37)C99,它明确地定义了到(u)intptr_t(以及由此而来的任何较大的整数)的转换和对称。ISO/IEC TR 18037:2006(E)(基于C99)是定义命名地址空间(即eds、prog、pmp...)的语法/语义的报告。L作为定点算术
|
|
|
|
|
|
只是为了凑合一下。我已经与EDS指针斗争了将近一周,并且已经到了可以自信使用它们的地步。(FYI,我正在使用PIC24EP512 MCU,xc16编译器;V1.25,MplabX IDE是V3.26——这个MCU使用DSRPAG,DSWPAG寄存器)关于向EDS:1进行强制转换的弱点的注释)EDS:除非地址来自固定到RAM或Flash中的先验已知位置的变量,例如{static const uint16_t_.((space(prog),address(0x027000))FlashData.=0xa5a5;//32Kpage"4"static const uint16_t_.((space(prog),add)(0x00035c)))FlashData.=0x5a5a;//32K页“0”静态的静态常量uint16_t_u属性_((空间(数据),地址(0x0000008002))静态的0"0"静态的0"0"静态的uint16_t_t_t_t_u属性_u.u.u.u.((数据),地址(0x00008002)))Ram.=0x1234;Ram高(Ram高)Ram高=0x1234; ///高"RAM&32K&RAM_&32K32K_u eds RAM>&32K_eds_u eds_u eds_u eds16_t*pFlashData.=(_eds_uint16_t*)&aMP;FlashDataLow;γ-Eds16UT**PRAMHOL=(α-EdsSuiUn1616t*)和RamHigh;}所有上述生成的EDS指针工作。当编译器生成程序集时,它“知道”地址是否在低RAM页内(低于32K边界);*all*flash被当作是在“高”RAM中,这是应该的。编译器完全拒绝确定内存是否在“高”RAM中,即使该数字表示一个高RAM地址;{long L=0x01008000;//试图访问Flash程序内存低字@0x8000_eds_uint16_t*eds_p16=(u eds_uint16_t*)L;//EDS指针的值应该是0x2018000,但它有0x201000!}以上是使用添加到0x01000000的闪存程序存储器中的基本位置来访问闪存程序存储器(例如查找表)的简单尝试(常数通过转换来移位,以在地址的高字中创建0x0200;这是闪存的低字)。它的失败之处在于没有在EDS指针中设置位-15,所以mov操作不使用“高”RAM位置,所以DSWPAG和DSRPAG寄存器被忽略。地址)RAM地址来自RAM内存映射,Flash地址来自程序内存映射。---//这个联合允许我调整一个EDS指针,以纠正它。typedef联合eds_gen_type{_u eds_uint16_t*pEDS;//实际的指针uint32_t dEDS;//数据作为32位无符号}eds_gen_t;//创建一个EDS指针Flash存储器(低Word)的EDS兼容指针:Flash存储器(低Word)的闪存(低Word))内联静态_u eds_uin_uint16_t_uuueds_uint16_t_uuuuuuuu uuuuuuuuuuu_Worduuuuuuu_16_t*)内联静态_u ededededededededededededs_u 16161616161616_t_t_uuuuuuuuu t_x01000161616161616161616161616161616161616强制转换会丢失信息这是一个很高的位置!EdsVal.DEDS=0x08000;/ /强制“高MEM”标志为真,Flash *不能设置为加载到低页中。返回edsVal.pEDS; }inline静态_eds_u_uint16_uint16_t.u_ededs_uin_u_uin_16_t.uu_uint16_t.}inline静态_u ededs_u eds16_pEDS;}in线性静态_u edededs_uu_uint16_t_u t.*edx010101018000 161616_t.*edsPoPo*edPoPoPoPoPoPoInterInterInterFlaFlaFlaFlaFlaFlaFlaFlaFlaFlaSMeMHigHWorhWorhWordd(uint32_t32_t32_t32_t32_t闪光Addr(uint32_t32它是*high-mem*location的信息离子!EdsVal.DEDS=0x08000;/ /强制“高MEM”标志为真,Flash *不能设置为加载到低页中。返回edsVal.pEDS;}//高或低RAM页面(将同时做32K页)内联_u eds_uuuu32K页_uint16_t_32K页)内联_uuuuuuuuuuuuuuuuuuuuuu16161616页*eds高或低RAM RAM页面(uinPoPoPoPoPoPoPoPointerRAMRAMMemWormWormWord(uint32_tramt3232tramAdd32_t ramAddr){//RAM高或低页面,DSR:0X0001RAM高或低页面,DSR:0x0001edX0001edX0001edX0001ed或低页面,DSR:0x0001eds0001eds!)整个RAM空间限制为64K!如果(RAMADDR和AMP;0x8000){//CAST转换松开了它是一个高MeM*位置的信息!edsVal.dEDS|=0x08000;//强制“high-mem”标志为true}返回edsVal.pEDS;}--如果您对编译器如何处理EDS地址感到好奇,那么它仅接受高位单词并将其填充到适当的DS*PAG寄存器中,这取决于它是读取点还是要进行wr。进入。低级单词通常被复制到W0中用于间接寻址。希望这能帮助一些人,我必须对编译器进行反向工程以确定它在做什么,其他任何地方都没有关于这个如何工作的信息。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475 浏览 0 评论
5794 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3530 浏览 3 评论
1124浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1098浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
873浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 13:26 , Processed in 1.044675 second(s), Total 112, Slave 94 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1621