Перейти к содержанию
    

STM32F215 непонятный HardFault в библиотечных функциях

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, то они прекрасно работают.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Переполнение стека?

38 минут назад, gab сказал:

Менял клок с HSE на HSI и обратно. Тактовую ядра ставил 60МГц и 120МГц. Ничего не меняется.

Интересно - зачем?  Из разряда "и колёса пинал и стёкла протёр, а всё равно не заводится".  :sarcastic:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

31 minutes ago, jcxz said:

Переполнение стека?

Интересно - зачем?  Из разряда "и колёса пинал и стёкла протёр, а всё равно не заводится".  :sarcastic:

размер 0x400. Всё-равно странно: это не первая вызываемая функция в main.

 

После того как перепутал посадочное место у кварца я уже не знвю куда копать. :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Самое прикольное, что компилятор даже на минимальной оптимизации вычисляет a=11 и r=0 как константы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, gab сказал:

Если взять код strlen и strcmp из newlib, то они прекрасно работают. 

А тот, что не работает - он откуда?

Возможно, линкуется не та библиотека (-mcpu=? -mthumb). Покажите полную командную строку компилятора и линкера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что это за монстр? Вот самые обычные 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 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то типа Cortex-M7, видимо.

Для ясности напишу: STM32F2xx - это Cortex-M3, у них нет инструкции UADD8. Потому и падает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

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
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, VladislavS said:

Какой же F215 и -mcpu=cortex-m4 ?

Алилуйа!!!! Спасибо!!!! Слона-то я и не заметил! Спасибо всем!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Систему команд используемого МК нужно знать. Чтобы понимать - где код, а где - мусор.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

44 minutes ago, jcxz said:

Систему команд используемого МК нужно знать. Чтобы понимать - где код, а где - мусор.

Согласен. Мой прокол. Запутался при переносе с одной серии на другую.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...