Cortex-M3, NVIC и многозадачность

Тема в разделе "WASM.ELECTRONICS", создана пользователем Black_mirror, 19 дек 2011.

  1. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    В общем имеется зверь на данном ядре (LM3S3826 если кому вдруг интересно) и для него требуется написать жалкое подобие ОС. От ос требуется только переключать потоки по таймеру, а так же и в случаях если поток решил повисеть на семафоре или поспать некоторое время. А непонятно на данный момент использование main_stack/process_stack и NVIC. Можно ли забить на использование process_stack? Разумно ли переключение потоков вынести в отдельный низкоприоритетный обработчик, чтобы его можно было активировать из других прерываний/основной программы?
     
  2. a9d

    a9d New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2006
    Сообщения:
    234
    Адрес:
    Zimbabwe
    А не проще уже портировать готовую РТОС?
    чем выдумывать свой велосипед.
     
  3. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    a9d
    Готовые решения требуют или денег, или тщательной доработки напильником, так что не проще.
     
  4. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Black_mirror, поглядите про обработку прерываний здесь: http://ru.osdev.wikia.com/wiki/Обработка_прерываний_в_архитектурах_ARMv6-M_и_ARMv7-M. В документации АРМовской описано действительно довольно плохо; похоже, тамошние авторы нормальным английским не владеют, поэтому предпочли заменить вменяемые описания на быдлопсевдокод...

    Я сохраняю контекст прерванного потока в обработчике PendSV, а он, в свою очередь, вызывается из обработчиков других прерываний в случае, если выявилась нужда в длительной обработке (для чего нужно разрешить прерывания, чтобы не возникало неприятностей) или в доступе к общесистемным данным. Если обработчик некоего прерывания способен выполниться быстро и не нуждается в общесистемных данных, то и сохранения контекста потока не требуется: при неходимости дополнительные регистры сохраняются в текущем стеке, а перед возвратом из прерывания -- восстанавливаются, и всё. У PendSV выставлен самый низкий приоритет, поэтому его обработчик вытесняется обработчиками любых других прерываний (т.е. не мешает обрабатывать срочные вещи). Если желаете глянуть код, выполняющий переключение потоков -- см. http://armada-os.org/projects/armada-kernel/repository/show/trunk/Kernel, модуль Interrupts.asm (он большой, поскольку рассчитан на любую архитектуру, ну а выбор конкретной осуществляется с помощью условной трансляции). Там же в Control_Blocks.inc можно глянуть нынешние форматы управляющих блоков, в т.ч. ThCB (блок управления потоком, в котором хранится большая часть контекста для M-версий архитектуры и весь контекст для "настоящих" АРМов). Отдельная документация пока в стадии написания, находится на http://wiki.armada-os.org.

    Однако должен сказать, что поддержки LMxxx у меня нет и не предвидится за отсутствием означенных МК (по работе или сам по себе имею дело с другими, их хватает пока выше крыши).
     
  5. a9d

    a9d New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2006
    Сообщения:
    234
    Адрес:
    Zimbabwe
    В scmRTOS нужно переписать только один файл.
    Т.е. только функцию переключения контекста. Все остальное написано С++.
     
  6. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    SII
    Спасибо, с прерываниями действительно стало яснее.

    a9d
    Если очень интересно, могу объяснить подробнее почему не нужна готовая ОС. Имеется некоторое устройство очень странной организации: загрузочный код в нем объединен с уже готовой ОС(платной), экспортирует для основной программы порядка сотни различных функций, причём десяток это функции ОС. Требуется сделать упрощенную версию этого безобразия для другого контроллера. Чтобы оставить там существующую ОС, нужно покупать дополнительную лицензию. Чтобы засунуть другую ОС, скорее всего придётся написать десяток функций переходников. Есть ли смысл допиливать "готовый" велосипед другую ОС из-за десятка функций?
     
  7. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    От сложности зависит. Иногда проще бывает купить и допилить, чем лепить своё.

    Другое дело, что качество даже фирменного ПО оччень сомнительное. Тут приятель пишет одну прогу, ну так решил сэкономить, использовав готовые библиотеки от STM (прога для STM32). Долго трахался с отладкой; потом путём трассировки выполняемого кода понял: индус-быдлокодер, делая эту библиотеку, где-то там перепутал логические операции, ну и делалось совсем не то, что нужно... Ну а послушался бы меня и писал бы все эти библиотечные функции сам -- ошибок было бы поменьше, а главное, их куда легче найти было бы.
     
  8. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    SII
    От ОС нужно только переключение потоков, семафоры и таймеры, разве это сложно?!
     
  9. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Это -- нет. Я бы вообще такое постыдился осью бы назвать :)