trol73 / the-rat-avr

The Rat language compiler for AVR
GNU General Public License v2.0
5 stars 0 forks source link

[ОШИБКА] В многострочных макросах параметр перестаёт передаваться нормально #21

Open jdose100 opened 2 months ago

jdose100 commented 2 months ago

При написании макроса pinMode у меня возникла проблема, из-за того что он многострочный компилятор отказывается нормально передавать аргументы в него. Код:

define OUTPUT 0x1

define pinMode(pin_t, mode) \

#if mode == OUTPUT \
    #if pin_t < 8 \
        in r16, DDRD \
        ori r16, 1 << pin_t \
        out DDRD, r16 \
    #endif \
#endif

proc main() { pinMode(13, OUTPUT) } Пишет данное сообщение: "path_to_file/file.asm:16:17: Unexpected expression" Причина не использования "inline proc" в том, что я не смог его заставить передавать аргументы не через регистр. Сдесь я мог накосячить с "inline proc"

trol73 commented 2 months ago

Да, многострочные макросы сейчас не поддерживаются как и не-регистровые аргументы у inline proc.

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

#define OUTPUT     1
#define INPUT      0

pin myPin1 = D1

proc main() {
   myPin1->ddr = OUTPUT        ; это строка скомпилируется в одну команду SBI
}
jdose100 commented 2 months ago

Я просто хотел написасть что-то вроде библиотеки Arduino.h, чтобы можно было использовать новичкам удобно. Да и приятно не залазить в data sheet чтобы вспомнить какой пин у мк, если у ардуинки пин 9. Кажется у меня есть идея, а насчёт синтаксиса с пинами я знал, у меня есть желание его адаптировать для ардуинки так-как я её сейчас использую, но он всё таки гораздо удобней чем на чистом asm'е

jdose100 commented 2 months ago

А я хотел бы уточнить о директиве #error, она вообще есть? При просмотре примеров я её увидел в файле f-counter.art. Но при вызове она не работает

jdose100 commented 2 months ago

Кстати следующую конструкцию он может обработать:

define pinModeInputPullap(pin_t) pin_t->ddr = INPUT \

pin_t->port = 1

trol73 commented 2 months ago

Я просто хотел написасть что-то вроде библиотеки Arduino.h, чтобы можно было использовать новичкам удобно. Да и приятно не залазить в data sheet чтобы вспомнить какой пин у мк, если у ардуинки пин 9. Кажется у меня есть идея, а насчёт синтаксиса с пинами я знал, у меня есть желание его адаптировать для ардуинки так-как я её сейчас использую, но он всё таки гораздо удобней чем на чистом asm'е

Имхо, ассемблер и подход ардуино - две совершенно несовместимые вещи. Первое про работу с железом и глубокое понимание чтобы выжимать максимум из этого железа. Второе - про простоту и нежелание копать глубже. Если нужно удобно работать с пинами ардуины по номеру, то можно и определить их как pin1, pin2, ...

Директива #error, похоже, не работает. Точнее, работает в том плане, что прекращает компиляцию, но не выводит ошибку. Я её изначально заложил, но никогда не пользовался и забыл реализовать

jdose100 commented 2 months ago

Я имел ввиду что удобство записи команд, таже настройка порта не по ddr, а pinMode(pin, mode). Но на ассемблер я перешёл так как хочу узнать о avr поглубже, да и меня немного раздражает стандартный c++ для ардуино. Когда видишь что у тебя всего 32кб памяти и то на mega, а просто мерцающая лампочка ест уже килобайт у меня отходит желание кодить на c++ для ардуинки, да так и интереснее. Узнаёшь про работу устройста не только со стороны электроники, но и со стороны кода. Так что совместимы, но только с правильным подходом. Я кста недавно узнал про ШИМ, а так даже не подозревал о нём