[技术问答] MDK不支持位操作吗?或者怎么设置可以操作位?

[复制链接]
7420|19
 楼主| dontium 发表于 2024-8-24 11:14 | 显示全部楼层 |阅读模式
用小的HC32F460和HC32L130等,均遇到使用库无法达到目的的问题,使用例程也有例外。跟踪调试发现,在位操作时,相应的指令有误,和实际不符,现举例如下。

例如对某一位的操作:

             M0P_SYSCTRL->SYSCTRL0_f.HCLK_PRS = 7;
相应的汇编指令为:

0x00000740 781C      LDRB     r4,[r3,#0x00]
0x00000742 2507      MOVS     r5,#0x07
0x00000744 432C      ORRS     r4,r4,r5
0x00000746 701C      STRB     r4,[r3,#0x00]
0x00000748 4C31      LDR      r4,[pc,#196]  ; @0x00000810

R3作为间址地址,装载为:

          8616066c94eac1fcf5.png
而实际需要装载的是SYSCTRL0的地址0x40002000,
其执行结果错误。


在其它使用位操作的地方,均为间接寻址时的地址装载错误所导致。还未发现别的原因引起。


laocuo1142 发表于 2024-8-28 14:57 | 显示全部楼层
MDK支持位操作啊
laocuo1142 发表于 2024-8-28 14:57 | 显示全部楼层
DK本身并不需要进行特别的设置来支持位操作,因为位操作是C语言标准的一部分,MDK作为C语言的编译器和开发环境,自然支持这些操作。
 楼主| dontium 发表于 2024-8-28 18:11 | 显示全部楼层
laocuo1142 发表于 2024-8-28 14:57
DK本身并不需要进行特别的设置来支持位操作,因为位操作是C语言标准的一部分,MDK作为C语言的编译器和开发 ...

从汇编上看,对应的的间接寻址的地址不对。
实际的程序,也是不正常,但改为读-修改-写方式后就可以正常工作。
hehhehee 发表于 2025-1-30 11:42 | 显示全部楼层
位操作时,相应的指令有误,和实际不符
大鹏2365 发表于 2025-4-27 00:14 | 显示全部楼层
这通常发生在与硬件寄存器进行交互时,库的地址解析或间接寻址出现了偏差。
原来是wjc 发表于 2025-5-31 17:24 | 显示全部楼层
寄存器访问必须是volatile,避免编译器优化掉读写动作。
p0gon9y 发表于 2025-6-17 12:51 | 显示全部楼层
MDK本身支持位操作,位操作在C语言中是基础语法,MDK编译环境不会限制其使用。
lix1yr 发表于 2025-6-17 14:05 | 显示全部楼层
在HC32F460和HC32L130等芯片开发中,若遇到使用库无法达到位操作目的或例程出现例外的情况,可能是头文件或库定义错误
ex7s4 发表于 2025-6-17 15:10 | 显示全部楼层
芯片头文件中位域或寄存器定义可能存在错误,导致位操作指令生成异常。例如HC32F460的DMA寄存器通过位段访问的值与实际寄存器值不一致,可能是头文件中的结构体定义错误。
d1ng2x 发表于 2025-6-17 16:18 | 显示全部楼层
编译器优化可能导致位操作指令被错误优化或替换,尤其是在使用位域时,不同编译器对位域的处理方式可能不同。
kaif2n9j 发表于 2025-6-17 18:19 | 显示全部楼层
位操作语法使用不当,如未正确使用位操作运算符(&、|、^、~、<<、>>)或未正确指定操作数。
suw12q 发表于 2025-6-17 19:25 | 显示全部楼层
直接访问寄存器时,未正确使用指针或未正确设置寄存器地址,导致位操作指令访问错误的内存位置。
q1ngt12 发表于 2025-6-17 21:23 | 显示全部楼层
仔细检查芯片头文件和库中关于寄存器或位域的定义,确保其与芯片手册一致。若发现错误,可手动修改头文件或联系芯片厂商获取正确的头文件。
cen9ce 发表于 2025-6-18 09:02 | 显示全部楼层
尝试关闭或调整编译器的优化选项,观察位操作指令是否恢复正常。在MDK中,可通过“Options for Target” -> “C/C++” -> “Optimization”来设置优化级别。
liu96jp 发表于 2025-6-18 10:25 | 显示全部楼层
确保使用正确的位操作运算符和操作数。例如,要清除寄存器的某一位,可使用&运算符与取反后的掩码进行按位与操作;要设置寄存器的某一位,可使用|运算符与掩码进行按位或操作
t1ngus4 发表于 2025-6-18 12:30 | 显示全部楼层
使用指针或宏定义来正确访问寄存器。确保寄存器地址和访问方式与芯片手册一致。例如,可使用volatile关键字修饰寄存器指针,以防止编译器优化掉对寄存器的访问。
9dome猫 发表于 2025-6-30 16:39 | 显示全部楼层
这些指令用于字节操作,而寄存器操作通常需要字操作 (LDR/STR)
远芳侵古道 发表于 2025-6-30 23:30 | 显示全部楼层
R3 应该装载 SYSCTRL0 寄存器的地址 (0x40002000),但实际装载了错误地址
狗啃模拟 发表于 2025-8-31 23:50 | 显示全部楼层
宏定义错误误写,会导致所有位域操作的间接寻址地址偏移。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:官向官来民向民,穷人向的是穷人

151

主题

1176

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部