STM32/ChibiOS. Перевод материалов

Тема в разделе "ChibiOS/RTOS", создана пользователем radioengineer, 22 фев 2015.

  1. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.592
    Симпатии:
    357
    Адрес:
    Алматы
    По #chibios и #stm32 достаточно много материала для изучения, но большая его часть на английском языке. Здесь буду выкладывать ссылки на англоязычный контент, если у кого есть желание помочь с переводом статей и туториалов для нашего блога и форума я буду благодарен. Начнем (буду дополнять список, переведенное будем вычеркивать)!

    Troubleshooting: I²C on STM32 // готово, перевел @koteika ссылка
    Using an Eclipse-based IDE // переводится
    Getting started with the STM32F4-Discovery board and ChibiOS/RT
    RTOS Concepts
    How to create a thread // готово, перевел @koteika ссылка
    ChibiOS/RT style guide
    Debugging ChibiOS/RT applications
    Регистры и битовые маски // готово, перевел @koteika ссылка
    Производительность ОС
    Использование HAL GPT
    Как портировать код с Chibios 2.x на Chibios 3.x // готово, перевел @koteika ссылка
    Последнее редактирование: 18 июл 2015
     
  2. koteika

    koteika В доску свой

    Сообщения:
    768
    Симпатии:
    118
    Род занятий:
    программирование
    Самая первая ссылка...
    Методика поиска и устранений неисправности шины I²C на STM32

    Однажды вы захотите использовать данный интерфейс для связи в каких либо своих проектах, и может так случиться что I²C не заработает...., вы либо не получите каких либо данных, либо получите кракозябры(мусор)..
    Данное руководство подскажет вам как избежать не которые ошибки, при работе с I²C :

    Для начала проверяем:

    - Убеждаемся что используем внешние подтягивающие резисторы. Внутренние подтяжки не подойдут для работы с I²C . Также следует обратить внимание на соответсвие номинала резистора для скорости шины I²C :

    100 кГц резистор не более 10 кОм
    400 кГц------------------------4,7 кОм
    1МГЦ--------------------------2 кОм

    - Убедитесь в правильности подключения линий SDA и SCL

    - Правильно настройти PAL драйвер для линий SDA и SCL, они должны быть настроены на режим альтернативной функции - PAL_MODE_ALTERNATE и режим пина с открытым стоком OPENDRAIN.. Примеры можно посмотреть ниже.


    - Убедиться что вы используете правильный идентификатор драйвера I²C... Нельзя использовать I2CD1, если используется I2CD2..

    - Можно использовать диагностические функции драйвера I²C, для того что бы получить коды ошибок, подробнее смотреть http://chibios.sourceforge.net/docs..._i2_c.html#ga653f9c593af20d15fdbf893e4c117d78

    Screenshot from 2015-02-23 13:51:55.png

    - Посмотреть примеры программ I²C в папке testhal, они гораздо проще для понимая чем примеры в папке демо.


    Примеры настройки PAL драйвера:


    Для STM32F1xx :
    palSetPadMode(GPIOB, 6, PAL_MODE_STM32_ALTERNATE_OPENDRAIN); /* SCL */
    palSetPadMode(GPIOB, 7, PAL_MODE_STM32_ALTERNATE_OPENDRAIN); /* SDA */

    Для STM32F4xx :
    palSetPadMode(GPIOB, 8, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN); /* SCL */
    palSetPadMode(GPIOB, 9, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN); /* SDA */


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

    Вы можете заменить чип, если это позволяют ваши возможности.

    Если не помогло, то не стисняйтесь задавать вопросы на форумах, пожалуйста дайте как можно больше деталей касательно вашей неисправности..
    Вроде все как надо))) Извиняюсь если где то что упустил..
    Последнее редактирование модератором: 23 фев 2015
    radioengineer нравится это.
  3. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.592
    Симпатии:
    357
    Адрес:
    Алматы
    Спасибо, оформлю в блог.
  4. koteika

    koteika В доску свой

    Сообщения:
    768
    Симпатии:
    118
    Род занятий:
    программирование
    Вторую статью тоже беру..

    Так как не получилось настроить Эклипс у меня для стм под линем, может тут что получится..
  5. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.592
    Симпатии:
    357
    Адрес:
    Алматы
    Кстати, я настроил Eclipse под #linux
  6. koteika

    koteika В доску свой

    Сообщения:
    768
    Симпатии:
    118
    Род занятий:
    программирование
    Круто) Я щас линя переустановил, попробую снова настроить. Может что и получится.
  7. koteika

    koteika В доску свой

    Сообщения:
    768
    Симпатии:
    118
    Род занятий:
    программирование
    How to create a thread

    Как создавать потоки

    Создание нового потока является наиболее распространенной задачей при использовании ОС реального времени. Давайте рассмотрим как это делается в ChibiOS / RT.

    После инициализации ChibiOS / RT, используя chSysInit () у нас появляются два потока по умолчанию:
    Idle thread. Этот поток имеет самый низкий приоритет в системе, так как он работает только тогда, когда другие потоки не используются либо спят. Эти потоки обычно переключает систему в режим пониженного энергопотребления и больше ничего не делают.
    Main thread. Это главный поток, он выполняет основную функцию main() при запуске. Основной поток создается на уровне NORMALPRIO, и он может изменить свой приоритет, если требуется.

    Есть два класса потоков в ChibiOS / RT:
    Static Threads (Статические потоки) это класс потоков которые находятся в статической памяти во время компиляции.
    Dynamic Threads (Динамические потоки) это потоки созданные путем выделения памяти во время компиляции.

    Создание статического потока

    Для того чтобы создать статический поток, рабочая зона должна быть объявлена с помощью макросов WORKING_AREA как показано ниже:

    Код:
    static WORKING_AREA(myThreadWorkingArea, 128);
    Этот макрос резервирует 128 байт стека для потока и пространства всех необходимых и связанных с ним структур.
    Статический поток может быть запущен вызовом chThdCreateStatic (), как показано в следующем примере:

    Код:
    Thread *tp = chThdCreateStatic(myThreadWorkingArea,
      sizeof(myThreadWorkingArea),
      NORMALPRIO,  /* приоритет  */
      myThread,  /* функция потока  */
      NULL);  /* параметры потока */
    Переменная tp получает указатель на объект потока, этот указатель часто принимается в качестве параметра другими API.

    Теперь полный пример:
    Код:
    /*
    * My simple application.
    */
    #include <ch.h>
    /*
    * Рабочее пространство
    */
    static WORKING_AREA(myThreadWorkingArea, 128);
    /*
    *Поток(мигаем диодом)
    */
    static msg_t myThread(void *arg) {
      while (TRUE) {
      LED_ON();
      chThdSleepMilliseconds(500);
      LED_OFF();
      chThdSleepMilliseconds(500);
      }
    }
    int main(int argc, char *argv[]) {
      /*стартуем поток*/
      (void)chThdCreateStatic(myThreadWorkingArea, sizeof(myThreadWorkingArea),
      NORMALPRIO, myThread, NULL);
      .
      .
      .
    }
    Следует отметить, что память, выделенная для MyThread () статически определена и не может быть использована повторно. Статические потоки более безопастны, потому что нет никакого риска выхода из строя распределения памяти, потому что происходит фрагментация стека.

    Создание динамическогог потока при помощи распределения стека

    Создание потока из кучи памяти:
    Код:
      Thread *tp = chThdCreateFromHeap(NULL,  /* NULL = Default heap. */
      THD_WA_SIZE(128),/*размер стека */
      NORMALPRIO,  /* приоритет  */
      myThread,  /* функция потока  */
      NULL);  /* параметры потока  */
    Память выделяется из указанного стека и поток выполняется. Обратите внимание, что память не освобождается, когда поток завершается. Например:
    Код:
    /*
    * My simple application.
    */
    #include <ch.h>
    /*
    *мигаем светодиодом
    */
    static msg_t myThread(void *arg) {
      unsigned i = 10;
      while (i > 0) {
        LED_ON();
        chThdSleepMilliseconds(500);
        LED_OFF();
        chThdSleepMilliseconds(500);
        i--;
      }
      return (msg_t)i;
    }
    int main(int argc, char *argv[]) {
      Thread *tp = chThdCreateFromHeap(NULL, THD_WA_SIZE(128), NORMALPRIO+1,
                                       myThread, NULL);
      if (tp == NULL)
        chSysHalt();    /* Memory exausted. */
      /* The main thread continues its normal execution.*/
      .
      .
      /*
       * Now waits for the spawned thread to terminate (if it has not terminated
       * already) then gets the thread exit message (msg) and returns the
       * terminated thread memory to the heap (default system heap in this
       * example).
       */
      msg_t msg = chThdWait(tp);
      .
      .
    }
    Создание динамического потока, используя распределение памяти(не стека..)

    Код:
    /*
    * My simple application.
    */
    #include <ch.h>
    /*
    * LED flashing thread.
    */
    static msg_t myThread(void *arg) {
      unsigned i = 10;
      while (i > 0) {
        LED_ON();
        chThdSleepMilliseconds(500);
        LED_OFF();
        chThdSleepMilliseconds(500);
        i--;
      }
      return (msg_t)i;
    }
    int main(int argc, char *argv[]) {
      Thread *tp = chThdCreateFromMemoryPool(myPool, NORMALPRIO+1, myThread, NULL);
      if (tp == NULL)
        chSysHalt();    /* Pool empty. */
      /* The main thread continues its normal execution.*/
      .
      .
      /*
       * Now waits for the spawned thread to terminate (if it has not terminated
       * already) then gets the thread exit message (msg) and returns the
       * terminated thread memory to the original memory pool.
       */
      msg_t msg = chThdWait(tp);
      .
      .
    }

    Еще перевод) Тут если я правильно понял pool это распределение в обычной памяти, то есть не фиксированный размер у этой области, в отличии от стека, где задаем кол-во байт.
    Последнее редактирование модератором: 24 фев 2015
  8. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.592
    Симпатии:
    357
    Адрес:
    Алматы
    Ну ты шустрый:) Завтра выложу в блог.
  9. koteika

    koteika В доску свой

    Сообщения:
    768
    Симпатии:
    118
    Род занятий:
    программирование
    либо pool это очень быстрое распределение в памяти, в си вродь есть функция выделения динамической памяти malloc, вот это из этих степей походу.. выделяем когда нужно, прога выполняеться, и далее нужно удалить этот кусок памяти..
  10. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.592
    Симпатии:
    357
    Адрес:
    Алматы
    Я так понимаю, что это просто "куча", как в Java
  11. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.592
    Симпатии:
    357
    Адрес:
    Алматы
    Да, что-то у нас тормознулось с освоением chibios, @koteika планируешь еще работать с ней?
  12. koteika

    koteika В доску свой

    Сообщения:
    768
    Симпатии:
    118
    Род занятий:
    программирование
    Да, буду.
  13. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.592
    Симпатии:
    357
    Адрес:
    Алматы
    Давай попробуем сделать адекватную IDE для разработки с красивым и функциональным редактором и нормальной отладкой.
  14. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.592
    Симпатии:
    357
    Адрес:
    Алматы
  15. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.592
    Симпатии:
    357
    Адрес:
    Алматы

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