реклама на сайте
подробности

 
 
> Keil uVision ARM v 5.16a странное поведение, STM32F407
__inline__
сообщение Mar 12 2018, 01:19
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126



1)

Собираю проект в Keil ARM 5.16a для STM32F407 с максимальной оптимизацией по скорости Otime, O3.

По мере написания проекта столкнулся со странным поведением, при максимальной оптимизации O3 программа иногда идёт иногда нет, зависит от порядка расположения переменных, функций. Если поменять их порядок местами, то иногда удаётся получить работающий код при O3.

Опытным путём через #pragma optimize был выявлен проблемный кусок: им оказалась точка входа в main(). Если всё заоптимизировать с O3, но точку входа в main сделать O1 (выше может не пойти), то будет работать:

Код
#pragma push
#pragma Otime
#pragma O3

//Тут переменные, функции , константы, макросы............

//Точка входа в main с уровнем оптимизации не более O1, если поставить выше, то в некоторых случаях может не заработать. Глюк Keil ???
#pragma push
#pragma Otime
#pragma O1

int main(void)
{
#pragma push
#pragma Otime
#pragma O3

//тут программа.........

#pragma pop
}

#pragma pop

#pragma pop


С чем может быть связано такое поведение?

2)
Использую CMSIS-овскую функцию __REV16(), в ассемблерном листинге она вставляется в виде перехода на функцию, а не как одна ассемблерная инструкция.
Причем остальные типа: __REV() , __CLZ() встраиваются в виде инструкций.

Заменил __REV16() на :
Код
inline u32  rev16(u32 x)
{
__asm("REV16 x,x");
  return x;
}


и в листинге идёт вставка ассемблерной инструкции без перехода как на функцию.

Получается, что используя CMSIS , доверяй, но проверяй?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение Mar 12 2018, 19:19
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Странно. Использовал _REV16 и аналогичные и в KEIL и в IAR - не замечал никаких глюков. Оптимизация максимальная по скорости.
В кейле я сейчас не работаю. Проект был на старом месте работы. Как меняет IAR эти макросы - могу посмотреть, если хотите.
Go to the top of the page
 
+Quote Post
__inline__
сообщение Mar 21 2018, 00:36
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126



Цитата(SasaVitebsk @ Mar 12 2018, 20:19) *
Странно. Использовал _REV16 и аналогичные и в KEIL и в IAR - не замечал никаких глюков. Оптимизация максимальная по скорости.
В кейле я сейчас не работаю. Проект был на старом месте работы. Как меняет IAR эти макросы - могу посмотреть, если хотите.


С IAR-ом незнаком, смотреть лучше в любом случае, если критично по скорости.

Цитата(Kabdim @ Mar 13 2018, 09:02) *
1) UB, либо выход за пределы массива - 99%. Вообще 99% случаев когда говорят об ошибках в компиляторе на самом деле ошибка в исходниках. sm.gif


UB - undefined behavior (неопределенное поведение?). Вполне возможно, что вы правы, приходится много работать с чужими исходными кодами, в которых может быть всё что угодно.
Утечка памяти и выход за пределы массива с нечётко объявленными границами, например.

Вот недавно пришлось скрестить C + C++ + ASM sm.gif
Потому что часть исходников написаны на плюсах, с объявлением классов, а часть обработки звука на Асме sm.gif



Цитата(картошка @ Mar 15 2018, 20:19) *
Думаю, если вы используете микроконтроллер - значит используете периферию. Если периферию - значит возможно прерывания. Если прерывания - то не забывайте VOLATILE ставить где надо.

sm.gif Я очень ревностно слежу за волатайлами, чтоб они были объявлены должным образом!
Все регистры периферии, порты ввода-выводи и переменные в обработчиках прерываний, использующиеся внаружу - всё volatile sm.gif

Чтоб небыть голословным:

Дано: Keil uVision 5.16a. Более старшие не идут в WinXP. Версии компилеров: 5.06(build 20) и 5.05 upd.2 (build 169).
Оптмизация: -O3, -oTime (максимальная по скорости). Установка глобальная. В сорцах прочих прагм оптимизации нет.

Фрагмент кода:
Код
*pL++=(__REV16(G)&0xFF0000FF)|(R&0x00FF0000)|(B&0x0000FF00);


В листинге выглядит так:
Код
...
    RRS     r0,r0,r1
        STR      r0,[r4],#4
        MOV      r0,r11
        BL       __asm___6_main_c_NEXT____REV16
        BFC      r0,#8,#16
        AND      r1,r7,#0xff0000
        ORRS     r0,r0,r1
...

    AREA ||.rev16_text||, CODE
    THUMB
    EXPORT |__asm___6_main_c_NEXT____REV16|
#line 129 "C:\\Keil_v5\\ARM\\CMSIS\\Include\\core_cmInstr.h"
|__asm___6_main_c_NEXT____REV16| PROC
#line 130

rev16 r0, r0
bx lr
    ENDP
...


Смешно и грустно одовременно. Пришлось с-инлайнить самостоятельно.

Сообщение отредактировал __inline__ - Mar 21 2018, 00:31
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 20:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01371 секунд с 7
ELECTRONIX ©2004-2016