Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-авг-19 06:39

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
СообщениеДобавлено: 2014-ноя-08 10:28 
Не в сети
Аватара пользователя

Зарегистрирован: 2013-июн-21 15:27
Сообщения: 66
Откуда: Новосибирск
При трансляции функций на встроенном ассемблере в C-модулях CM-ARM, таких, как, например:

Код:
int HighBitPos(unsigned int Arg)
{ // Позиция старшей единицы
#pragma asm
        CLZ     R0, R0          // количество старших нулевых битов
        RSB     R0, R0, #31     // номер старшего единичного бита
#pragma endasm
} // end of HighBitPos()


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

Можно ли так оформить подобные функции, чтоб они транслировались такими же короткими, но при этом выглядели "правильно" с точки зрения C-транслятора CM-ARM?

_________________
Странник


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2014-ноя-08 16:42 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 613
Откуда: г. Санкт-Петербург
Сам использую keil, но в Вашем случае может вставить строку
return Arg; после endasm ?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2014-ноя-09 01:48 
Не в сети
Аватара пользователя

Зарегистрирован: 2013-июн-21 15:27
Сообщения: 66
Откуда: Новосибирск
Спасибо. Я попробовал. Получилось:
Код:
        SUB     R13, R13, #4
        STR     R0, [R13, #0]
Arg?HighBitPos  .EQU    0
        CLZ     R0, R0
        RSBS    R0, R0, #31
        LDR     R0, [R13, #Arg?HighBitPos]
        ADD     R13, R13, #4
        BX      R14

что вдвое длиннее, чем
Код:
        CLZ     R0, R0
        RSBS    R0, R0, #31
        BX      R14

и к тому же не работает. Кроме того, подобные функции могут иметь и несколько аргументов, например
Код:
void memUset(uptr Dst, unsigned int Src, unsigned int N)
{ // Заполнение N слов в Dst словом Src
#pragma asm
        CBZ     R2, ret         // if (!N) break
loop:   STR.W   R1, [R0], #4    // store Src to Dst[x++]
        SUBS    R2, R2,   #1    // n--
        CMP     R2, #0          // if (n)
        BNE     loop            //   continue
ret:    BX      LR              // return
#pragma endasm
} // end of memUset()

или
Код:
int MulAdd(int A, int B, int C)
{ // Вычисление (A * B + C)
#pragma asm
        MLA     R0, R0, R1, R2  // r = A * B + C
#pragma endasm
} // end of MulAdd()

и тогда предупреждение выдаётся для каждого аргумента :-(

_________________
Странник


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2014-ноя-09 11:48 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 613
Откуда: г. Санкт-Петербург
В кейле такая конструкция работает без предупреждений

__asm int HighBitPos(unsigned int Arg)
{
CLZ R0, R0 // количество старших нулевых битов
RSB R0, R0, #31 // номер старшего единичного бита
BX LR
}

Для Фитона можно попробовать все подобные функции написать на ассемблере в отдельном ассемблерном файле, в Си-шных файлах объявлять их как exetrnal.
Заранее извиняюсь, если пишу ерунду, так как с Фитоном не работаю и проверить свои предположения не могу.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2014-ноя-17 15:29 
Не в сети
Moderator

Зарегистрирован: 2010-мар-31 10:44
Сообщения: 54
Откуда: ООО "Фирма Фитон"
stranderer писал(а):
При трансляции функций на встроенном ассемблере в C-модулях CM-ARM, таких, как, например:

Код:
int HighBitPos(unsigned int Arg)
{ // Позиция старшей единицы
#pragma asm
        CLZ     R0, R0          // количество старших нулевых битов
        RSB     R0, R0, #31     // номер старшего единичного бита
#pragma endasm
} // end of HighBitPos()


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

Можно ли так оформить подобные функции, чтоб они транслировались такими же короткими, но при этом выглядели "правильно" с точки зрения C-транслятора CM-ARM?

Можно отключить оба предупреждения для указанной функции. Для этого, надо перед функцией (или группой таких функций) указать:
Код:
#pragma warn -44
#pragma warn -83

а после тела функции (или группы) вернуть статус предупреждений в первоначальное состояние:
Код:
#pragma warn .44
#pragma warn .83


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2014-ноя-18 13:07 
Не в сети
Аватара пользователя

Зарегистрирован: 2013-июн-21 15:27
Сообщения: 66
Откуда: Новосибирск
Спасибо! Помогло.

_________________
Странник


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB