Перейти к содержанию

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


RIMUS1989i

Рекомендуемые сообщения

Здравствуйте. Вопрос к гуру, на сколько будет меньше разрыв данных при посылке через 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" написать на ассемблере?

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

 

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

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

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

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

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

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

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

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

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

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

Изменено пользователем El-Shang
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

Изменено пользователем AvrAsm
Ссылка на комментарий
Поделиться на другие сайты

21 hours ago, RIMUS1989i said:

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

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

Изменено пользователем El-Shang
Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

Да ладно Вам.

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

 

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

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

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

 

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

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

 

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

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

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

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

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

А можно размер задержки? В тактах, 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:       }

 

Изменено пользователем godrik
Ссылка на комментарий
Поделиться на другие сайты

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 и прочего. Хотя риск остаётся. :-)

Изменено пользователем El-Shang
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...