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

Скрипты в микроконтроллере

Файл amx.c сдержит реализацию виртуальной машины на переносимом С.

amxexec_thumb2.s содержит оптимизированную реализацию виртуальной машины на асме.

Их не получится скомпилировать вместе в одном проекте. Выбирайте что-то одно.

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

 

Поделиться сообщением


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

Наконец-то добрались руки до реализации.

Накидал такой скрипт

#pragma dynamic 100

native GreenLed(NewValue)
native SetPWM(NewPWM);
native BlueLed(NewValue);
native IsKeyPressed();

main()
{
   GreenLed(0);
   BlueLed(1);

   for(;;)
   {
           if(IsKeyPressed())
        {
            GreenLed(1);
             BlueLed(1);
        }
        else
        {
            GreenLed(0);
               BlueLed(0);
        }
   }
}

Функции GreenLed(NewValue) и BlueLed(NewValue) отлично работают.

Не могу понять как передать данные в скрипт из железки.

Как например считать нажатие кнопки IsKeyPressed?

 

В железке функция выглядит так

cell IsKeyPressed(AMX *amx, const cell *params)
{
    cell ret = 0;
    if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) != GPIO_PIN_RESET)
        ret = 1;
    return ret;
}

Скрипт вызывает эту функцию и ret корректно изменяется.

Поделиться сообщением


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

...

Функции GreenLed(NewValue) и BlueLed(NewValue) отлично работают.

Не могу понять как передать данные в скрипт из железки.

Как например считать нажатие кнопки IsKeyPressed?

 

В железке функция выглядит так

cell IsKeyPressed(AMX *amx, const cell *params)
{
    cell ret = 0;
    if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) != GPIO_PIN_RESET)
        ret = 1;
    return ret;
}

Скрипт вызывает эту функцию и ret корректно изменяется.

 

Да вроде все правильно сделали. Если native функция должна вернуть единственное значение, которое умещается в размер cell, то просто возвращаете его: return 'значение'.

Если надо вернуть много значений, то возвращаете их через ссылочные параметры функции. Например, вот функция, возвращающая массив значений:

native get_tempcoef(Float:coef[6]);

и ее C-реализация:

cell AMX_NATIVE_CALL n_gettempcoef(AMX * amx, const cell* params)
{
    static const float foo[6] = { bla-bla }; 
    // Получаем адрес массива coef:
    cell* dst = amx_Address(amx, params[1]); 
    // и заполняем его значениями.
    for (uint32_t i = 0; i < 6; ++i) 
    {
        float t = foo[i];
        dst[i] = amx_ftoc(t);
    }
    return 0;
}

 

Поделиться сообщением


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

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

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

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

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

×
×
  • Создать...