Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Mix C++ и Asm в IAR EW AVR 4.21A
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Turion
Надеюсь здесь кто-нибудь поможет. В IAR C/C++ Compiler Reference Guide в разделе Assembler language interface приведен пример:

bool flag;
void foo()
{
while (!flag)
{
asm("IN R0,PIND \n
STS flag,R0");
}
}

Я пишу свою функцию:

unsigned short ModBus::CRC16Test(void *Ptr,unsigned char Lenght)
{
unsigned char *Data = (unsigned char *)Ptr;
unsigned char CRCH = 0xFF;
unsigned char CRCL = 0xFF;

unsigned char Byte;
unsigned char Temp;

for(unsigned char i = 0;i < Lenght;i++)
{
Byte = Data[i];

asm(" EOR CRCL,Byte ");
asm(" MOV Temp,CRCL ");
..........................
..........................

И стабильно получаю собщение, что CRCL,Byte,Temp не распознаны типа:

Error[Og005]: Unknown symbol in inline assembly: "CRCL"

Error[Og006]: Syntax error in inline assembly: "Error[43]: Illegal effective address"

Подскажите пожалуйста, как это побороть, мне нужен именно кусок Asm в теле С++ функции.
andrvisht
Цитата(Turion @ Jun 22 2007, 11:59) *
asm(" EOR CRCL,Byte ");
asm(" MOV Temp,CRCL ");


__no_init __regvar unsigned char CRCL @ 15;
__no_init __regvar unsigned char Byte @ 14;
__no_init __regvar unsigned char Temp @ 13;

и в Option/C/C++/Code зарезервировать 3 регистра
Код
  asm(" EOR    r15,r14
  asm("    MOV    r13,r15 ");


НО, никогда так не делайте

компилятор не учитывает ваши асмовские попытки, и при оптимизации вы получите сюрприз.
Дочитайте раздел до конца, и оформляйте асмовские функции отдельно, тут слегка на русском
http://electronix.ru/forum/index.php?act=A...ost&id=7393
Turion
Тогда какого хрена в документации приводят такой пример. На PC ассемблер спокойно подхватывает имена С++ - переменных, вот я и понадеялся что IAR выделит в регистрах несколько байт, а что с ними делать я на асме напишу.
andrvisht
Цитата(Turion @ Jun 22 2007, 15:03) *
Тогда какого хрена в документации приводят такой пример. На PC ассемблер спокойно подхватывает имена С++ - переменных, вот я и понадеялся что IAR выделит в регистрах несколько байт, а что с ними делать я на асме напишу.

Ну выделить то можно, а вот учитывать он их не будет пока вы не сделаете asm отдельным модулем. И кстати там же в документации пишут что этого делать нерекомендуется, всмысле использовать вставки типа
Код
asm("   ")

Да и потом то что вы написали, компилятор сам очень хорошо разложит, нужно только оптимизацию настроить на HIGH
IceS
Цитата(Turion @ Jun 22 2007, 16:03) *
Тогда какого хрена в документации приводят такой пример.

Вот это компилится нормально:
Код
unsigned char flag;

void foo()
{
  static unsigned char flag1;
  while (!flag)
  {
  asm("IN R0,_A_PIND");
  asm("STS flag,R0");
  if (flag)
  {
    flag1 = flag;
    flag |= flag1<<1;

  }
  asm("STS ??flag1,R0");
  
  }
}

если убрать статик, то компилятор переменную размещает в регистре, а не в памяти, ну и как следствие асм вставка найти ее не может.

А для чего вам нужна вставка на асме? CRC считать? дык компилятор не плохо оптимизирует эту процедуру, не ужели для вас критично пяток лишних операторов (хотя не факт что они будут)?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.