完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
你好,你能告诉我如何在闪存中的特定地址上声明const联盟吗?我认为它可能看起来像这样,但是这个代码不起作用。你知道更好的方法吗?我需要知道打印到屏幕的文本块的每个地址,以及RTSP的读-修改-写闪存中的行地址。谢谢你的建议。对不起,我的英语。- -法诺
|
|
相关推荐
14个回答
|
|
|
因为块被定义为char数组,所以数组的名称(例如MyBlock0等)是一个指向数据的指针,这难道不允许您使用绝对(或偶数)地址属性进行所需的访问吗?
|
|
|
|
|
|
|
|
|
不幸的是,Kurzman的建议行不通。我必须那样做:我能得到的每个FlashPeges的地址:这不是最好的解决方案,但是行得通。如果有人有更好的方法,请告诉我。谢谢
|
|
|
|
|
|
下面的代码对我有用。我定义了联合的类型,然后声明了该类型的const变量,而不是逐个将const指定附加到联合成员。我还使用不同的语法定义联合元素的初始化值。在MAP文件中生成以下条目。程序内存(在MPLA-X PIC内存视图中)显示:
|
|
|
|
|
|
如果数据可以更改,则不应使用const。编译器可以自由地使用const变量的初始值而不必访问变量。它不是一个可以经常做的优化,但如果它能,它将不会显示,直到你改变数据。
|
|
|
|
|
|
我不确定我是否理解,除非是因为我用了“变量”这个词,而不是“常量”。我的主要观点是尝试提供一个解决原始帖子中的问题的代码示例。它可能不是最佳的解决方案,但它确实有效。在这种情况下,使用const关键字是必要的,或者链接器不会将数组放置在正确的内存区域中。这也是一个讽刺的情况,其中const数据将被改变,因为原始的帖子提到使用RTSP来写它,但是这并没有消除需要声明声明const。在我的经验中,XC16编译器在优化C代码方面是非常差的,并且有任何优势。通过访问常量时不读取闪存获得的S将被数百万不必要的寄存器交换、寄存器与堆栈帧之间的移动、实现逻辑位移位操作等的可怕方式远远抵消,这将在代码运行时执行。(请原谅这个咆哮,我刚刚花了几天的时间优化了一些基本的64位算术例程,这些程序有一些由编译器产生的最佳次优代码。)
|
|
|
|
|
|
给定nconstintx=1234;编译器可以自由使用1234作为即时指令操作数,并且根本不访问变量x。您可以重写Flash来更改X,编译器生成的代码仍将使用1234。空间(PSV)将变量放在程序内存中。使用const是一个bug,只是一个不会经常出现的bug。
|
|
|
|
|
|
也许我也会开始声明我所有的常量都是易失性的。如果我不使用常量,那么编译器(或者至少是我使用的版本)可以生成RAM(16位附近),而不是PSV(24位远)地址。不使用const还允许地址被传递给期望RAM指针的函数而不用警告。我不明白如何将其声明为const是bug,除非它是编译器中的一个bug,因为那是标准的C声明。如果我想在物理内存中放置一个常量值,我将使用常量声明在代码中声明它,如果编译器优化了它,那么就是编译器有bug,而不是我的代码。如果我希望它尽可能使用一个即时值,而不是为它保留空间,那么我会使用#.。很少有编译器将甚至能够使用即时值(特别是对于超过10个有效位的值)作为CPU核心u上的大多数指令。SEARE限制为4, 5或10位的即时值。当然,它不会使用任何字符串的即时值:我看不出这是怎么可能的?
|
|
|
|
|
|
如果您希望编译器管理PSV来访问PSV空间中的变量,则需要给出变量β-PSVVY修饰。用闪存编程const修改一个变量是一个错误。
|
|
|
|
|
|
嗯,有趣。感谢您指出正确的_u psv_修饰用法。应用正确的修饰确实会导致预期的(尽管很隐晦)错误:我想知道为什么编译器不执行这个(或_u prog_修饰)而不是允许程序员省略它?或者更好的是,为什么不在内部处理用空间(PSV)属性或const修饰符声明的符号呢?不是一个或全部的装饰,属性还是标准的C const修饰符冗余?XC16编译器用户指南8.10.1规定“默认情况下,用户定义的对象声明为const被放置在程序空间中,并且可以通过程序可见性空间[...]访问”。我理解在Flashbehind a const对象中更改值可能会导致意外的行为,但是该文档中没有任何内容表明以这种方式声明对象实际上是不正确的。刚刚尝试了几个不同的组合,似乎const和volatile修饰符对生成用于读取PSV对象的指令没有任何影响。请让我知道在哪里可以了解更多关于const不正确使用的本质和根本原因的信息。这样?
|
|
|
|
|
|
可能只是历史。早期编译器版本不支持PSV管理。你必须自己管理PSVPAG寄存器。告诉编译器当它能够改变时,某些东西不会改变是一个错误。如果初始化在同一编译单元中,const变量的地址在编译时已知,编译器可以自由使用初始化值而不用麻烦访问变量。在闪存保持配置类型信息中排除结构中的版本标签。如果该结构在同一模块中被初始化并初始化,则如果该标签没有用该版本初始化或如果它是真的,那么将简单地优化版本标签的检查为假的。
|
|
|
|
|
|
对于const的含义,我们似乎有不同的理解;我的解释是告诉编译器不能修改对象。例如,在dsPIC32上,状态寄存器是“只读”的,并且声明为常量是合理的。显然,CPU状态寄存器可以而且将频繁地改变,但是声明为常量阻止编译器生成可以修改它的指令。可以观察到这些变化,并且易失性修饰符迫使编译器在每次被访问时生成代码以读取SFR内存位置。连接保证不修改正在被寻址的内存。试图更改字符串所指向的值将导致编译时错误(除非您错误地抛弃了常量,在这种情况下,您要求良好的回调)。上面的示例实际上是在很多标准中实现的。d库函数,如StrcPy,其中源字符串被声明为const char *。在XC16中尝试实现这一点是一件混乱的事情,因为它在程序空间地址中考虑地址。
|
|
|
|
|
|
“const”并不意味着“常量”,意思是“只读”。const数据改变没有什么不寻常的。如果没有编译器知道,可以改变值的任何东西都需要声明为“易失性”,不管它是否也是只读的。
|
|
|
|
|
|
这是一个非常好的解决方案。这正是我需要的。非常感谢。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
473 浏览 0 评论
5793 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3530 浏览 3 评论
1122浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1095浏览 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-1 23:49 , Processed in 0.918158 second(s), Total 68, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
4207