А знаете ли вы што: Ассемблер Arduino IDE
- Войдите на сайт для отправки комментариев
С удивлением недавно узнал, что оказывается, если создать файл с расширением .S (именно с большой S) и покласть его в директорию с .ino, то в этом файле можно невозбранно писать текст не на встроенном в Си ассемблере, а на "чистом", без всяких кавычек и прочей х-ни.
Создайте какой нить простенький проект в Arduino IDE. Потом в любом текстовом редакторе наберите
#include <avr\io.h> .global MyAsmFunc MyAsmFunc: ldi r24,lo8(str_01) ; пхаем в возвращаемые регистры ldi r25,hi8(str_01) ; адрес строки лежащей по метке str_01 ret ; Эта строка валяеца в PROGMEM str_01: .asciz "My unique string in PROGMEM"
и сохраните его как AsmTest.S в той же директории, что и файл проекта .ino
В самом проекте напишите
/*
Name: AsmTest.ino
Created: 23.01.2020 14:36:10
Author: DtS
*/
#include <Arduino.h>
// Функции из ассемблера не подвергаюца "маскарадингу" лжывого С++
// поэтому они мало того, что "extern", дак еще и "extern "C""
//
extern "C" {
extern __FlashStringHelper *MyAsmFunc(void); // функция должна возвратить указатель на строку в PROGMEM
}
void setup()
{
Serial.begin(115200);
delay(250);
Serial.println(F("AsmTest started...\n"));
// спецификатор %s печатает строку из RAM, а %S - из PROGMEM
//
Serial.println(MyAsmFunc()); // печать строки из PROGMEM
}
void loop()
{
}
ничего никуда подключать не надо, компилятор как-то сам понимает, что AsmTest тоже надо транслировать.
Запустите и посмотрите что получица.
Мне счас приходится ковыряться с AVR ассемблером, поэтому буду разбираться, если интересно, буду писать заметки.
Еще как интересно!
Наконец-то все любители ассемблера начнут писать на нём и перестанут мучать вопросами "А что на Си так долго/непонятно/тупо?"
С удивлением недавно узнал, что оказывается... бла-бла-бла
Дед! Ты ведь знаешь, что я любя? ;))))
"На четвертый день Зоркий Глаз обнаружил, что у камеры нет одной стены!"
"На четвертый день Зоркий Глаз обнаружил, что у камеры нет одной стены!"
Дак а я знаю. :) Пока не припёрло, чота и не озадачивался. Но и писать в таком ключе
(__extension__({ \ __asm__ __volatile__ \ ( \ "movw r0, %3\n\t" \ "sts %0, %1\n\t" \ "spm\n\t" \ "clr r1\n\t" \ : \ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ "r" ((uint8_t)(__BOOT_PAGE_FILL)), \ "z" ((uint16_t)(address)), \ "r" ((uint16_t)(data)) \ : "r0" \ ); \ }))где хрен чо поймешь мне несколько неконфортна. Да еще оптимизатор всё норовит выкинуть нахрен.
Ф нашем комиляторе (avr-gcc) макрос __extension__ определен как пустой. Ты по инерции пишешь супер переносимый код? ;)))) Или скопировал кусок из avr-libc ????
Брось этих глупостев!
Или скопировал кусок из avr-libc ????
естес-сно скопировал первое что нашел, для примера. Такой "встроенный" ассемблер у мня ничего, кроме идиосинкразии не вызывает, чота. :)
Наконец-то все любители ассемблера начнут писать на нём и перестанут мучать вопросами "А что на Си так долго/непонятно/тупо?"
это же надо щи читать, в какие регистры что можно пихать, а чего нельзя, так, что наврядли )))