本帖最后由 Hitomi22 于 2025-7-28 22:48 编辑
在使用STM32CubeIDE v1.6.1,遇到了一些奇怪的问题。 当我调用strcat()函数时,如果目标字符串末尾(即null终止符所在位置)的地址是奇数地址,就会出现硬件错误(hardfault)? 以下是.list文件中的代码: char s1[20]; strcpy(s1, "--"); 8
00ab50: f107 030c
add.w r3, r7, #12
800ab54: 4a65
ldr r2, [pc, #404] ;
(800acec <sd_cmdproc_process_packet+0x374>)
800ab56: 6812
ldr r2, [r2, #0]
800ab58: 4611
mov r1, r2
800ab5a: 8019
strh r1, [r3, #0]
800ab5c: 3302
adds r3, #2 800ab5e: 0c12 lsrs r2, r2, #16 800ab60: 701a strb r2, [r3, #0] strcat(s1, "1"); 800ab62: f107 030c add.w r3, r7, #12 800ab66: 4618 mov r0, r3 800ab68: f7f5 fbc4 bl 80002f4 <strlen> 800ab6c: 4603 mov r3, r0 800ab6e: 461a mov r2, r3 800ab70: f107 030c add.w r3, r7, #12 800ab74: 4413 add r3, r2 800ab76: 495e ldr r1, [pc, #376] ; (800acf0 <sd_cmdproc_process_packet+0x378>) 800ab78: 461a mov r2, r3 800ab7a: 460b mov r3, r1 800ab7c: 881b ldrh r3, [r3, #0] 800ab7e: 8013 strh r3, [r2, #0] strcat(s1, "2"); 800ab80: f107 030c add.w r3, r7, #12 800ab84: 4618 mov r0, r3 800ab86: f7f5 fbb5 bl 80002f4 <strlen> 800ab8a: 4603 mov r3, r0 800ab8c: 461a mov r2, r3 800ab8e: f107 030c add.w r3, r7, #12 800ab92: 4413 add r3, r2 800ab94: 4957 ldr r1, [pc, #348] ; (800acf4 <sd_cmdproc_process_packet+0x37c>) 800ab96: 461a mov r2, r3 800ab98: 460b mov r3, r1 800ab9a: 881b ldrh r3, [r3, #0] 800ab9c: 8013 strh r3, [r2, #0] 800ab9e: e1c4 b.n 800af2a <sd_cmdproc_process_packet+0x5b2> }
"strcat "1"" 可以工作,但"strcat "2""会导致硬件故障。我怀疑是与"strh"的对齐错误有关。 另一个奇怪的现象是:对strcat()(以及strcpy())的调用并没有调用实际的函数。
|