Jump to content

Ассемблерная вставка atmel studio 6.2


RIMUS1989i
 Share

Recommended Posts

Здравствуйте. Вопрос к гуру, на сколько будет меньше разрыв данных при посылке через SPI 16бит, если ожидание готовности написать на ассемблере? И сразу второй вопрос, как правильно её вставить?

void sendWord(uint16_t data)
{
	SPDR = data;
	while(!(SPSR & (1<<SPIF))); // это заменить на ассемблерную вставку
	//вот тут видно задержку
	SPDR = data>>8;
	while(!(SPSR & (1<<SPIF))); // и это заменить на ассемблерную вставку
}

Этот код не работает (ассемблерная вырезка из даташита). Я не соображаю...:(

asm volatile(
     "Wait_Transmit: in r16, SPSR sbrs r16, SPIF rjmp Wait_Transmit ret"
	);

Пока писал сообщение, понял свой косяк, регистр r16 в строке выше у меня не соответствует data.Тогда еще вопрос, как полностью этот кусок "sendWord" написать на ассемблере?

Заранее Спасибо!

Link to comment
Share on other sites

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

помести свои 16 бит в два регистра - в r16 и r17.

сначала передай r16, потом передай r17.

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Link to comment
Share on other sites

Реле, разъемы, вентиляторы, корпуса, микросхемы, конденсаторы и много другое!

Скидки до 20% на сайте электронного дискаунтера ТМ Электроникс.

Бесплатная доставка в любую точку России + кэшбэк 15%.

Подробнее

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

@Starichok Хорошо. А как это правильно сделать? Я в поиске нашел примеры ассемблерных вставок но по примерам даже бесконечный цикл не компилируется.

asm(
	"loop_top_%=:\n"
	"rjmp loop_top_%=\n"
	);

 

Link to comment
Share on other sites

Материалы вебинара «Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока»

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

я для МК пишу ТОЛЬКО на ассемблере. поэтому не знаю, как писать на Си с ассемблерными вставками.

14 часов назад, RIMUS1989i сказал:

на сколько будет меньше разрыв данных при посылке через SPI 16бит, если ожидание готовности написать на ассемблере?

практически ни насколько. максимум на несколько микросекунд. и то, если тактовая частота низкая.

поэтому смысла делать вставки нет никакого.

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

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Link to comment
Share on other sites

Комплексные решения с литиевыми батареями EVE для интеллектуальных систем безопасности

Литиевые химические источники тока EVE по своим характеристикам являются идеальным выбором для современных интеллектуальных систем безопасности. EVE разрабатывает литиевые батареи, опираясь на многолетние исследования таких областей применения, как беспроводная связь стандартов Bluetooth, LoRa, Wi-Fi, NB-IoT и ZigBee. Рассмотрим решения для систем безопасности с использованием батарей EVE. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Я бы Вам посоветовал прежде чем что-то городить на ассемблере посмотреть какой именно набор инструкций выдал компиллятор в этом месте. И потом уже решать, стоит ли оно того. Он не настолько глуп, чтобы сгенерировать в таком простом месте дикую дичь. А выигрыш в несколько инструкций едва-ли даст что-то существенное.

И вообще, что значить "разрыв данных в 16 бит"? Как это понимать?

Edited by El-Shang
Link to comment
Share on other sites

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

17 часов назад, RIMUS1989i сказал:

если ожидание готовности написать на ассемблере?

соображение не от гуру .

Где искать косяк в передаче данных  может помочь осциллограф с декодированием цифры . Мне помог .

Link to comment
Share on other sites

2 часа назад, Starichok сказал:

я для МК пишу ТОЛЬКО на ассемблере. поэтому не знаю, как писать на Си с ассемблерными вставками.

практически ни насколько. максимум на несколько микросекунд. и то, если тактовая частота низкая.

поэтому смысла делать вставки нет никакого.

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

Я уже об этом и подумал, чтобы передачу написать на аасемблере. Но нужно обернуть в си, т.к. Весь код будет на си. 

 

1 час назад, El-Shang сказал:

И вообще, что значить "разрыв данных в 16 бит"? Как это понимать?

Так как мега328 не умеет посылать 16 бит одним словом, то приходится посылать два по 8, и вот после первой отправки на осциллограф видно на 8м бите задержку. 

1 минуту назад, colorad сказал:

соображение не от гуру .

Где искать косяк в передаче данных  может помочь осциллограф с декодированием цифры . Мне помог .

Искать тут нечего, в коде только функции инициализации spi и отправки 16бит которая в 1м посте, без сигнала ss. А в вечном цикле уже вызывается функция отправки с одним и тем же числом. Так самое интересное что задержка именно там большая,где я его прокомментировал. Между концом и началом отправки разрыв меньше в два раза. 

Прошу прошения за ошибки, пишу с телефона. 

Link to comment
Share on other sites

когда пишут на Си, это офигенная потеря процессорного времени, потому что код на Си в несколько раз длиннее аналогичной программы на ассемблере. именно поэтому я пишу только на ассемблере.

и на фоне больших затрат процессорного времени (на Си) твоя задержка во время отправки - сущая мелочь, о которой нечего беспокоиться.

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Link to comment
Share on other sites

10 часов назад, RIMUS1989i сказал:

после первой отправки на осциллограф видно на 8м бите задержку

И что ? Ну видно её, ну есть она. В чём проблема то ?

Link to comment
Share on other sites

12 часов назад, RIMUS1989i сказал:

самое интересное что задержка именно там большая,где я его прокомментировал.

Могу ошибаться, давно это было. И по вставкам в СИ не подскажу.

Как-то тоже было нужно пакет отправить по SPI за минимально возможное время.

На ассемблере,  после записи первого байта в регистр данных делал паузу в тактах МК на один такт больше чем необходимо для отправки 8-бит и потом следующий байт без всяких опросов готовности.

Частота SPI была максимально возможной CLKCPU/2, паузу делал 17 тактов.

Link to comment
Share on other sites

Ну да. При условии что частота SPI вдвое меньше частоты МК.

И почему обязательно NOPов? я эти такты использовал с пользой.

Главное на записать следующий байт раньше чем...

Edited by AvrAsm
Link to comment
Share on other sites

21 hours ago, RIMUS1989i said:

Так как мега328 не умеет посылать 16 бит одним словом, то приходится посылать два по 8, и вот после первой отправки на осциллограф видно на 8м бите задержку. 

И что с  того? :-) Ну задержка. Ну есть. Она в любом случае будет иметь место, как отметили выше. Ибо необходимо будет записать следующий байт для отправки в регистр. В чем соль проблемы-то? Эстетическое несовершенство осциллограммы? ;-)

Edited by El-Shang
Link to comment
Share on other sites

Похоже, ТС даже не понимает, для чего ему это нужно. Увидел задержку и началась паника :lol:
А почитать спецификацию на SPI - религия не позволяет B)

Link to comment
Share on other sites

Да ладно Вам.

Я когда первый раз в жизни снюхивался с 12-ти битным АЦП по тому же спаю, тоже боялся, что не получится нормально считать данные, ибо на атмелах он 8-ми битный. :-)

Link to comment
Share on other sites

Автор даже не может ответить на главный вопрос темы, созданный им. О чём тут можно вообще дискутировать ? Что-то обсуждать ... Предлагать какие-то идеи ...

Прежде, чем что-то использовать, нужно понимать, как это "что-то" работает. А не бездумно тыкаться осциллографами и наводить панику на форумах.
Какой смысл использовать осцил там, где ты ни черта не понимаешь ?

Link to comment
Share on other sites

Речь не о глупости вопросов, а о непонимании их сущности.
Зачем задавать вопрос, если тебе пофиг на результат ответа ? Просто, ради поболтать ?

Link to comment
Share on other sites

19 часов назад, Alex сказал:

И что ? Ну видно её, ну есть она. В чём проблема то ?

Проблема в том, что при посылке большого объема данных, вот эта мелкая задержка суммируется и вытекает в большую. Отсюда и логическое соображение, почему бы её здесь не ликвидировать.

Код, как я писал выше, состоит только из "в коде только функции инициализации spi и отправки 16бит которая в 1м посте, без сигнала ss. А в вечном цикле уже вызывается функция отправки с одним и тем же числом", если тут уже задержка то что будет дальше?

Понятное дело, если отсылать не большие пакеты, то пусть имеет место быть.

 

10 часов назад, El-Shang сказал:

В чем соль проблемы-то? Эстетическое несовершенство осциллограммы? ;-)

Ответил в первом предложении.

 

6 часов назад, Alex сказал:

Похоже, ТС даже не понимает, для чего ему это нужно. Увидел задержку и началась паника :lol:
А почитать спецификацию на SPI - религия не позволяет B)

 

5 часов назад, Alex сказал:

Автор даже не может ответить на главный вопрос темы, созданный им. О чём тут можно вообще дискутировать ? Что-то обсуждать ... Предлагать какие-то идеи ...

Прежде, чем что-то использовать, нужно понимать, как это "что-то" работает. А не бездумно тыкаться осциллографами и наводить панику на форумах.
Какой смысл использовать осцил там, где ты ни черта не понимаешь ?

А вы, уважаемый @Alex просто походу этими постами накручиваете себе счетчик публикаций.

17 часов назад, AvrAsm сказал:

И почему обязательно NOPов? я эти такты использовал с пользой.

Главное на записать следующий байт раньше чем...

Ход ваших мыслей понял, но как правильно реализовать? 

Link to comment
Share on other sites

А можно размер задержки? В тактах, us, осциллограмме?  Вот дизассемблер вашего куска кода. Проверка готовности SPI - две инструкции, три такта. Куда быстрее?

Я если что, только нюхаю Си, тоже иногда пугает  раздувание кода, но тут все прилично.

6:        {
+0000001C:   B81F        OUT       0x0F,R1        Out to I/O location
8:        	while(!(SPSR & (1<<SPIF)));  
+0000001D:   9B77        SBIS      0x0E,7         Skip if bit in I/O register set
+0000001E:   CFFE        RJMP      PC-0x0001      Relative jump
10:       	SPDR = 8;
+0000001F:   E088        LDI       R24,0x08       Load immediate
+00000020:   B98F        OUT       0x0F,R24       Out to I/O location
11:       	while(!(SPSR & (1<<SPIF))); 
+00000021:   9B77        SBIS      0x0E,7         Skip if bit in I/O register set
+00000022:   CFFE        RJMP      PC-0x0001      Relative jump
13:       }

 

Edited by godrik
Link to comment
Share on other sites

2 часа назад, RIMUS1989i сказал:

Ход ваших мыслей понял, но как правильно реализовать? 

Что реализовать, 17-ть NOP-ов записать?

Link to comment
Share on other sites

4 hours ago, godrik said:

Я если что, только нюхаю Си, тоже иногда пугает  раздувание кода, но тут все прилично.

Не забивайте этим голову. На чистом ассемблере пишут или ретрограды или очень начинающие любители, зачастую попавшие под влияние первых. Никаких разумных причин писать код целиком на ассембреле нет. За исключением, пожалуй, личных предпочтений и узкой ниши "особых случаев". Да и у самих сей вполне достаточно инструментов, чтобы сгенерировать код не уступающий творениям среднестатистического "ассемблерщика".

 

5 hours ago, RIMUS1989i said:

Проблема в том, что при посылке большого объема данных, вот эта мелкая задержка суммируется и вытекает в большую. Отсюда и логическое соображение, почему бы её здесь не ликвидировать.

"Большой" объем данных это сколько? Один килобайт? Два? Мегабайт? И потом, правильно говорить не о суммировании, а о доле (в процентах, если угодно) этой задержки в общем времени передачи данных. А это величина неизменная.

Что же касается непосредственно "ассембреной" вставки в сях, то если Вам так уж хочется её вставить, то проще сделать это по следующему алгоритму:

  1. Создать отдельный .c файл, в который Вы пропишите пустую функцию. Пустую, означает вот так: void sendWord(uint16_t data) {}
  2. Компилируете его с опцией -s -O0. Можете это сделать ручками в командной строке, можете изменить в настройках файла в дереве проекта, это как больше нравится;
  3. На выходе получится ассемблерный файл с тем же именем, что .c но расширением .s (как ни странно). 
  4. Заменяете исходный .c в дереве проекта полученным и заполняете его содержимым, он полностью в вашей власти.

Правда, это получается не совсем "вставка" но зато таким образом Вы сможете создавать и вызывать любые свои функции, написанные на ассемблере из сишных  и при этом ничего не сломаете из-за несоблюдения calling convention и прочего. Хотя риск остаётся. :-)

Edited by El-Shang
Link to comment
Share on other sites

6 часов назад, RIMUS1989i сказал:

А вы, уважаемый @Alex просто походу этими постами накручиваете себе счетчик публикаций.

Не болтайте ерундой. Этот счётчик на форуме не даёт абсолютно ничего....

А Вам, если не хватает скорости SPI, нужно заниматься не всякими вставками, а просто взять камушек пошустрей, и с DMA. И все Ваши проблемы улетят как страшный сон.
Впихнуть "с ноги" почти невпихуемое, понатыкав говно-костылей в код и сэкономив микросекунду между байтами,  а потом ходить и гордиться этим - глупый поступок.
Сейчас Вы воткнули костыль, и, возможно, он заработал, а через неделю обернётся Вам боком. И будете плясать вокруг платы вприпрыжку, хотя бы даже потому, что тупо не знаете, как этот костыль работает и что из-за него может случится.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...