Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

Вопрос На каких языках можно написать прошивку

Тема в разделе "Прошивки esp8266 - общие вопросы", создана пользователем tolyan23, 28 июн 2015.

  1. tolyan23

    tolyan23 Новичок

    Сообщения:
    14
    Симпатии:
    2
    На каких языках можно написать прошивку? Какие преимущества недостатки каждого
    Что то я запутался SDK, LUA, eclipse luna. Куча новых непонятных слов. Где то встречал упоминание что lua глючный (нестабильный) зато прошивку быстро писать. Мне нужен максимально надежный (от производителя?) язык программирования/компилятор. Т.е. чтобы простая прошивка работала стабильно и надежно без глюков (я имею ввиду глюки вносимые компилятором).
    Хочу сделать датчик wifi поэтому
    программа минимум читать/устанавливать GIPO отправлять/принимать http запросы
    (типа таких http://127.0.0.1:81/objects/?object=ws&op=m&m=refreshData&P=755&Tout=28)
    программа максимум простая страничка настройки параметров
     
  2. jmms

    jmms Moderator Команда форума

    Сообщения:
    67
    Симпатии:
    23
    Возможно вам подойдет https://github.com/marcoschwartz/aREST это скетч для ардуино ide, при помощи простых get запросов изменять состояние gpio.
    Если в кратце (поверхностно) по вашему вопросу: nodemcu это прошивка, вы модете вгружать в устройство на базе этой прошивки скрипты на языке lua, но работает это относительно стабильно (нужно обладать серьезными навыками чтобы эти скрипты работали стабильно), но начать легко. Другой возможный вариант - писать скетчи на c++, используя arduino ide. Лично я выбрал этот вариант, писать на c++ чуть сложней, но работает стабильней.
     
  3. gerkimuyda

    gerkimuyda Авторитетный участник сообщества

    Сообщения:
    309
    Симпатии:
    62
    Решил темы не плодить. Так как в Си не разбираюсь, попробую задать вопрос на форуме:
    Как в SDK вернуть из функции строку, чтобы можно было ее использовать как параметр, например в printf("%s", myfunc("text"));
    1.Если вернуть указатель на локальную переменную - то локальная переменная уничтожается при выходе из функции.
    2.Если локальную переменную сделать static - то второй вызов функции портит первый возврат. Например: printf("1=%s 2=%s", myfunc("text1"), myfunc("text2") ); - вернет "1=text2 2=text2"
    3.Большинство вариантов возврата, которые мне попадались - используют переменную, которую передают в функцию, и потом ее возвращают или из нее забирают значение myfunc(*buf, "text"), но мне надо именно через return, без дополнительно передаваемых параметров *buf.
    4. malloc - расходует память при каждом вызове и автоматически не освобождает ее.

    При пункте 4 возникает интересный вопрос, зачем разработчики Mangoose написали такой код:
    Код (C):
    1. char *strdup(const char *src) {
    2.   size_t len = strlen(src) + 1;
    3.   char *ret = malloc(len);
    4.   if (ret != NULL) {
    5.     strcpy(ret, src);
    6.   }
    7.   return ret;
    8. }
    9.  
    Ведь, как я понял, без free() память будет утекать? Или я не правильно что-то понял?

    пс: может через asm push или внутреннюю функцию SDK можно окольными путями получить желаемое?
     
    Последнее редактирование: 12 ноя 2017
  4. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.135
    Симпатии:
    226
    @gerkimuyda передайте в функцию указатель на строку и внутри заполняйте строку по этому указателю. Потом вернёте его же, если надо.
     
  5. gerkimuyda

    gerkimuyda Авторитетный участник сообщества

    Сообщения:
    309
    Симпатии:
    62
    Получается №3 вариант, для которого надо заранее создать переменную, а я хочу избавиться от этих лишних телодвижений, реализовав все необходимое внутри функции (внутри библиотеки). И опять-же, при двойном вызове функции в рамках одного printf - мы получим вариант №2.
    Чтобы было понятнее - любые вспомогательные действия должны остаться внутри создаваемой библиотеки (можно за пределами данной функции, которая является частью библиотеки), и за ее пределами нет надобности знать о [или помогать в] ее самодостаточной работоспособности.

    И все-же интересен вопрос про MangooseOS - это их ошибка, которая положит систему, или я не правильно понял код и действия аллокатора памяти?
     
    Последнее редактирование: 12 ноя 2017
  6. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.135
    Симпатии:
    226
    @gerkimuyda тогда вам нужно пользоваться malloc и принудительно освобождать память когда переменная не нужна. Это Си, там всё ручками. Пример вы сами привели.
     
  7. gerkimuyda

    gerkimuyda Авторитетный участник сообщества

    Сообщения:
    309
    Симпатии:
    62
    Посмотрел, как делает возврат строки lwip_open_src_template_proj/lwip/core/sntp.c
    (я имена функций изменил и код из них выкинул, оставив только используемый принцип)
    Код (C):
    1. char reult[100];
    2.  
    3. char * s3(char *str, char *result) {
    4.   os_sprintf(result, "%s", str);
    5.   return result;
    6. }
    7.  
    8. char * s2(char *str) {
    9.   return s3(str, reult);
    10. }
    11.  
    12. char * s1(char *str) {
    13.   return s2(str);
    14. }
    15.  
    16. ets_uart_printf("%s", s1("text");
    17.  
    Данный способ такой же, как и №2, хотя менее удобный.
    Т.е. в таком случае проще написать:

    Код (C):
    1. char * myfunc(char * str) {
    2.   static char st[100];
    3.   os_sprintf(st, "%s", str);
    4.   return st;
    5. }
    Память тут выделяется один раз во время первого использования функции, но двойной вызов функции надо разделять, т.к. вторая перезапишет возврат первой (ведь они обе ссылают свой результат на один и тотже кусок памяти)
    ets_uart_printf("1=%s 2=%s", myfunc("text1"), myfunc("test2") ); //выдаст '1=test2 2=text2'

    А про MangooseOS кто-то объяснит, зачем они каждый раз откусывают кусок памяти и не возвращают его? Отложенный "синий экран смерти" ?
     
    Последнее редактирование: 12 ноя 2017

Поделиться этой страницей