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

 
 
> Mix C++ и Asm в IAR EW AVR 4.21A
Turion
сообщение Jun 22 2007, 08:59
Сообщение #1





Группа: Новичок
Сообщений: 9
Регистрация: 28-11-05
Пользователь №: 11 498



Надеюсь здесь кто-нибудь поможет. В 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 в теле С++ функции.

Сообщение отредактировал Turion - Jun 22 2007, 09:01
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Turion
сообщение Jun 22 2007, 12:03
Сообщение #2





Группа: Новичок
Сообщений: 9
Регистрация: 28-11-05
Пользователь №: 11 498



Тогда какого хрена в документации приводят такой пример. На PC ассемблер спокойно подхватывает имена С++ - переменных, вот я и понадеялся что IAR выделит в регистрах несколько байт, а что с ними делать я на асме напишу.
Go to the top of the page
 
+Quote Post
IceS
сообщение Jun 25 2007, 20:53
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 43
Регистрация: 17-10-06
Из: Санкт Петербург
Пользователь №: 21 387



Цитата(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 считать? дык компилятор не плохо оптимизирует эту процедуру, не ужели для вас критично пяток лишних операторов (хотя не факт что они будут)?
Go to the top of the page
 
+Quote Post



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

 


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


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