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

 
 
 
Reply to this topicStart new topic
> 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
andrvisht
сообщение Jun 22 2007, 09:44
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(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
Go to the top of the page
 
+Quote Post
Turion
сообщение Jun 22 2007, 12:03
Сообщение #3





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



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


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(Turion @ Jun 22 2007, 15:03) *
Тогда какого хрена в документации приводят такой пример. На PC ассемблер спокойно подхватывает имена С++ - переменных, вот я и понадеялся что IAR выделит в регистрах несколько байт, а что с ними делать я на асме напишу.

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

Да и потом то что вы написали, компилятор сам очень хорошо разложит, нужно только оптимизацию настроить на HIGH
Go to the top of the page
 
+Quote Post
IceS
сообщение Jun 25 2007, 20:53
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 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 July 2025 - 04:00
Рейтинг@Mail.ru


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