gab 0 26 апреля, 2020 Опубликовано 26 апреля, 2020 · Жалоба ChibiOS. arm-none-eabi-gcc-7.2.1. Пробовал на 9-м одинаково. Всё прекрасно работает, моргает светодиодом пока не натыкается на код использующий strlen или strcmp. При этом strcmp падает только при равенстве сравниваемых строк. Убрав все навороты, поставив -O0, получил такой простой код гарантированно вызывающий HardFault: void main(){ ... инициализация периферии { char *s0 = "01234567890"; char *s1 = "01234567890"; char buf[128]; strcpy(buf, s0); // работает int a = strlen(s0); // вылетаем в HardFault int r = strcmp(s0, s1); // тоже вылетаем chprintf(ch_stdout, "%d, %d\n", r, a); } вывод gdb: i loc ctx = {r0 = 0, r1 = 134316136, r2 = 858927408, r3 = 926299444, r12 = 4294967295, lr_thd = 134300015, pc = 134219632, xpsr = 1627389952} faultType = HardFault faultAddress = 3758157112 isFaultPrecise = false isFaultImprecise = false isFaultOnUnstacking = false isFaultOnStacking = false isFaultAddressValid = false Менял клок с HSE на HSI и обратно. Тактовую ядра ставил 60МГц и 120МГц. Ничего не меняется. Если взять код strlen и strcmp из newlib, то они прекрасно работают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 197 26 апреля, 2020 Опубликовано 26 апреля, 2020 · Жалоба Переполнение стека? 38 минут назад, gab сказал: Менял клок с HSE на HSI и обратно. Тактовую ядра ставил 60МГц и 120МГц. Ничего не меняется. Интересно - зачем? Из разряда "и колёса пинал и стёкла протёр, а всё равно не заводится". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gab 0 26 апреля, 2020 Опубликовано 26 апреля, 2020 · Жалоба 31 minutes ago, jcxz said: Переполнение стека? Интересно - зачем? Из разряда "и колёса пинал и стёкла протёр, а всё равно не заводится". размер 0x400. Всё-равно странно: это не первая вызываемая функция в main. После того как перепутал посадочное место у кварца я уже не знвю куда копать. :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 26 апреля, 2020 Опубликовано 26 апреля, 2020 · Жалоба Самое прикольное, что компилятор даже на минимальной оптимизации вычисляет a=11 и r=0 как константы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gab 0 26 апреля, 2020 Опубликовано 26 апреля, 2020 · Жалоба 1 minute ago, VladislavS said: Самое прикольное, что компилятор даже на минимальной оптимизации вычисляет a=11 и r=0 как константы. Всёравно вызывает и вываливается. 197 int a = strlen(s0); 08014108: ldr r0, [sp, #164] ; 0xa4 0801410a: bl 0x8000740 <strlen> 0801410e: mov r3, r0 08014110: str r3, [sp, #156] ; 0x9c ----------- strlen: 08000740: pld [r0] 08000744: strd r4, r5, [sp, #-8]! 08000748: bic.w r1, r0, #7 0800074c: mvn.w r12, #0 08000750: ands.w r4, r0, #7 08000754: pld [r1, #32] 08000758: bne.w 0x80007ee <strlen+174> 0800075c: mov.w r4, #0 08000760: mvn.w r0, #7 08000764: ldrd r2, r3, [r1] 08000768: pld [r1, #64] ; 0x40 0800076c: add.w r0, r0, #8 08000770: uadd8 r2, r2, r12 ------- вот тут вываливается!!!! 08000774: sel r2, r4, r12 08000778: uadd8 r3, r3, r12 0800077c: sel r3, r2, r12 08000780: cbnz r3, 0x80007d6 <strlen+150> 08000782: ldrd r2, r3, [r1, #8] 08000786: uadd8 r2, r2, r12 0800078a: add.w r0, r0, #8 0800078e: sel r2, r4, r12 08000792: uadd8 r3, r3, r12 08000796: sel r3, r2, r12 0800079a: cbnz r3, 0x80007d6 <strlen+150> 0800079c: ldrd r2, r3, [r1, #16] 080007a0: uadd8 r2, r2, r12 080007a4: add.w r0, r0, #8 080007a8: sel r2, r4, r12 080007ac: uadd8 r3, r3, r12 080007b0: sel r3, r2, r12 080007b4: cbnz r3, 0x80007d6 <strlen+150> 080007b6: ldrd r2, r3, [r1, #24] 080007ba: add.w r1, r1, #32 080007be: uadd8 r2, r2, r12 080007c2: add.w r0, r0, #8 080007c6: sel r2, r4, r12 080007ca: uadd8 r3, r3, r12 080007ce: sel r3, r2, r12 080007d2: cmp r3, #0 080007d4: beq.n 0x8000764 <strlen+36> 080007d6: cmp r2, #0 080007d8: itt eq 080007da: addeq r0, #4 080007dc: moveq r2, r3 080007de: rev r2, r2 080007e0: clz r2, r2 080007e4: ldrd r4, r5, [sp], #8 080007e8: add.w r0, r0, r2, lsr #3 080007ec: bx lr 080007ee: ldrd r2, r3, [r1] 080007f2: and.w r5, r4, #3 080007f6: rsb r0, r4, #0 080007fa: mov.w r5, r5, lsl #3 080007fe: tst.w r4, #4 08000802: pld [r1, #64] ; 0x40 08000806: lsl.w r5, r12, r5 0800080a: orn r2, r2, r5 0800080e: itt ne 08000810: ornne r3, r3, r5 08000814: movne r2, r12 08000816: mov.w r4, #0 0800081a: b.n 0x8000770 <strlen+48> 0800081c: movs r0, r0 0800081e: movs r0, r0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 26 апреля, 2020 Опубликовано 26 апреля, 2020 · Жалоба 1 час назад, gab сказал: Если взять код strlen и strcmp из newlib, то они прекрасно работают. А тот, что не работает - он откуда? Возможно, линкуется не та библиотека (-mcpu=? -mthumb). Покажите полную командную строку компилятора и линкера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 26 апреля, 2020 Опубликовано 26 апреля, 2020 · Жалоба Что это за монстр? Вот самые обычные strcmp и strlen из GCC 9.2 newlib. Тут действительно не чему не работать. strcmp: 0x20000000 10 F8 01 2B ldrb.w r2, [r0], #1 0x20000004 11 F8 01 3B ldrb.w r3, [r1], #1 0x20000008 01 2A cmp r2, #1 0x2000000a 28 BF it cs 0x2000000c 9A 42 cmpcs r2, r3 0x2000000e F7 D0 beq.n 0x20000000 <strcmp> 0x20000010 D0 1A subs r0, r2, r3 0x20000012 70 47 bx lr strlen: 0x20000014 03 46 mov r3, r0 0x20000016 13 F8 01 2B ldrb.w r2, [r3], #1 0x2000001a 00 2A cmp r2, #0 0x2000001c FB D1 bne.n 0x20000016 <strlen+2> 0x2000001e 18 1A subs r0, r3, r0 0x20000020 01 38 subs r0, #1 0x20000022 70 47 bx lr Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 26 апреля, 2020 Опубликовано 26 апреля, 2020 · Жалоба Что-то типа Cortex-M7, видимо. Для ясности напишу: STM32F2xx - это Cortex-M3, у них нет инструкции UADD8. Потому и падает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gab 0 26 апреля, 2020 Опубликовано 26 апреля, 2020 · Жалоба 11 minutes ago, AHTOXA said: А тот, что не работает - он откуда? Возможно, линкуется не та библиотека (-mcpu=? -mthumb). Покажите полную командную строку компилятора и линкера. gcc -mcpu=cortex-m4 -mthumb -O0 -ggdb -fomit-frame-pointer -falign-functions=16 -ffunction-sections -fdata-sections -fno-common -flto -Wall -Wextra -Wstrict-prototypes -Wa,-alms=./build/lst/ -DUAVCAN_TOSTRING=0 -DUAVCAN_DEBUG=0 -DUAVCAN_STM32_NUM_IFACES=1 -DUAVCAN_STM32_TIMER_NUMBER=3 -DUAVCAN_STM32_CHIBIOS=1 -DUAVCAN_CPP_VERSION=UAVCAN_CPP11 -DCORTEX_USE_FPU=FALSE -DDEBUG_BUILD -DCRT1_AREAS_NUMBER=0 -MD -MP -MF ./.dep/PRE_MAKE_ALL_RULE_HOOK.d g++ -mcpu=cortex-m4 -mthumb -O0 -ggdb -fomit-frame-pointer -falign-functions=16 -ffunction-sections -fdata-sections -fno-common -flto -fno-rtti -std=gnu++11 -fno-exceptions -Wall -Wextra -Wundef -Wa,-alms=./build/lst/ -DUAVCAN_TOSTRING=0 -DUAVCAN_DEBUG=0 -DUAVCAN_STM32_NUM_IFACES=1 -DUAVCAN_STM32_TIMER_NUMBER=3 -DUAVCAN_STM32_CHIBIOS=1 -DUAVCAN_CPP_VERSION=UAVCAN_CPP11 -DCORTEX_USE_FPU=FALSE -DDEBUG_BUILD -DCRT1_AREAS_NUMBER=0 -MD -MP -MF ./.dep/PRE_MAKE_ALL_RULE_HOOK.d ld -mcpu=cortex-m4 -mthumb -O0 -ggdb -fomit-frame-pointer -falign-functions=16 -ffunction-sections -fdata-sections -fno-common -flto -nostartfiles -Wl,-Map=./build/riyo-sw.map,--cref,--no-warn-mismatch,--library-path=../chibios203/os/common/startup/ARMCMx/compilers/GCC/ld,--script=linker/STM32F207xG.ld,--gc-sections,--defsym=__process_stack_size__=0x800,--defsym=__main_stack_size__=0x800 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 26 апреля, 2020 Опубликовано 26 апреля, 2020 · Жалоба 2 минуты назад, gab сказал: g++ -mcpu=cortex-m4 Вот и ошибка. Это cortex-m3. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 26 апреля, 2020 Опубликовано 26 апреля, 2020 · Жалоба Какой же F215 и -mcpu=cortex-m4 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gab 0 26 апреля, 2020 Опубликовано 26 апреля, 2020 · Жалоба 5 minutes ago, VladislavS said: Какой же F215 и -mcpu=cortex-m4 ? Алилуйа!!!! Спасибо!!!! Слона-то я и не заметил! Спасибо всем!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 197 26 апреля, 2020 Опубликовано 26 апреля, 2020 · Жалоба Систему команд используемого МК нужно знать. Чтобы понимать - где код, а где - мусор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gab 0 26 апреля, 2020 Опубликовано 26 апреля, 2020 · Жалоба 44 minutes ago, jcxz said: Систему команд используемого МК нужно знать. Чтобы понимать - где код, а где - мусор. Согласен. Мой прокол. Запутался при переносе с одной серии на другую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться