Многопоточность с помощью C на PIC18

На самом деле найти все процессы довольно просто:

using System.Diagnostics;

Process[] processes = Process.GetProcesses();

foreach (Process process in processes)
{
    // Get whatever attribute for process.
}
7
задан Peter Mortensen 9 December 2009 в 14:03
поделиться

10 ответов

Возможно, вы захотите прочитать эту статью о программировании встроенных систем: Создайте сверхпростой Tasker

2
ответ дан 6 December 2019 в 05:06
поделиться

Компилятор CCS включает ОСРВ. Я не использовал его, но из руководства компилятора :

Операционная система реального времени CCS (RTOS) позволяет использовать микроконтроллер PIC запускать регулярно запланированные задачи без необходимости в прерываниях. Эта выполняется функцией (RTOS_RUN ()), который действует как диспетчер. Когда задача запланирована для запуска функция диспетчеризации дает управление процессором для этой задачи. Когда задача выполнена, выполнение или больше не нужен процессор, возвращено управление процессором в диспетчерскую функцию, которая затем передаст управление процессором следующая задача, которая запланирована на выполнить в подходящее время. Эта процесс называется кооперативным многозадачность.

Небольшое предупреждение - посетите их форумы, чтобы узнать о конкретных функциях, которые вам нужны. Очевидно, у CCS есть привычка выпускать новые функции до того, как они будут полностью протестированы. Это одна из причин, по которой я все еще использую старую версию (v3.249).

1
ответ дан 6 December 2019 в 05:06
поделиться

Имейте в виду, что на микроконтроллерах некоторые «потоки» также могут обрабатываться каким-то определенным обработчиком прерываний и, таким образом, в любом случае запускаться «параллельно» вашему главному циклу событий.

Например, если вы Если внешнее событие запускает преобразование АЦП, ваш обработчик преобразования АЦП может принять это значение, выполнить несколько вычислений и затем установить некоторые выходные биты для адаптации управляющего выхода в соответствии со значением АЦП.Все это может происходить в обработчике прерывания и, таким образом, параллельно всему остальному.

В зависимости от того, что вам нужно делать параллельно, вы можете выбрать комбинацию нескольких методов, чтобы заставить все работать параллельно, как задумано.

2
ответ дан 6 December 2019 в 05:06
поделиться

Если ОС нет вообще, вам (очевидно) придется воссоздать необходимые функции самостоятельно.

Самым простым способом, вероятно, будет установка прерывания по таймеру работает на некоторой подходящей частоте (вероятно, зависит от вашей реальной тактовой частоты, но, возможно, в диапазоне 100-1000 Гц). В обработчике прерывания вам необходимо проверить состояние текущего потока и решить, должно ли происходить переключение.

Уловка состоит в том, чтобы при необходимости переключиться и вернуться из обработчика прерывания в другой thread .

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

Вы также можете посмотреть на установку какого-нибудь ядра, возможно Contiki .

Здесь - пример «протопотоков» для PIC18, похоже на разумный объем кода. Однако не уверен в семантике.

Обновление : для этого, вероятно, потребуется, чтобы вы написали код самого низкого уровня на ассемблере (я не уверен, не работал на C на PIC, поэтому я не Не знаю точно, какой контроль вы получите). Вам потребуется контроль над регистрами программного счетчика, а это не концепции C.

5
ответ дан 6 December 2019 в 05:06
поделиться

Почему бы не добавить обычный первичный ключ, а затем указать, что part_number и part_revision как unique_topting ?

Это по сути, это джанговский (джангонический?) способ делать то, что сказал Митч Уит.

Не нужно держать много глубоких стопок. Вам нужно написать свой код в терминах цикла событий, но это, вероятно, разумно.

Если у вас действительно есть какие-то длительные задачи, используйте таймеры с разными уровнями приоритета прерываний, чтобы позволить циклам событий с более высоким приоритетом вытеснять циклы событий с более низким приоритетом , и поместите соответствующие типы работы в соответствующую очередь событий.

12
ответ дан 6 December 2019 в 05:06
поделиться

Вы можете поместить туда ОСРВ (есть неофициальный порт ucOS , или вы можете проверить порт PIC18 FreeRTOS ).

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

6
ответ дан 6 December 2019 в 05:06
поделиться

Вы можете попробовать Кооперативную многозадачность .

Для типов проблем, которые решают PIC, вам, вероятно, будет лучше, если вы попробуете другой дизайн, который использует прерывания или опрос вместо нескольких потоков.

9
ответ дан 6 December 2019 в 05:06
поделиться

Это как раз то, что делает цикл задач, а также устанавливает приоритеты задач и то, что мне нравится, простое кодирование для разделения длительно выполняемых функций на фрагменты.

http://www.mculabs.com/drivers/qtask.html

0
ответ дан 6 December 2019 в 05:06
поделиться

На 8051 я выполнял двойную задачу с помощью простого переключателя стека. Я ожидал, что то же самое можно сделать и с PIC, при условии, что каждая задача использует только 16 уровней стека. Код будет примерно таким (предполагается, что _altSP находится в общем банке)

_InitTask2:
    movff _STKPTR,_altSP
    movlw 16
    movwf _STKPTR,c
    goto _Task2Start

_TaskSwitch:
    movf  _altSP,w,c
    movff _STKPTR,_altSP
    movwf _STKPTR,c
    return

Основная задача должна вызвать _InitTask2, чтобы запустить вторую задачу. Вторая задача будет выполняться до тех пор, пока она не вызовет _TaskSwitch, после чего основная задача возобновит выполнение в соответствии с инструкцией, вызвавшей _InitTask2. С этого момента каждый раз, когда задача вызывает _TaskSwitch, другая задача возобновляет выполнение с того места, где она вызвала _TaskSwitch.

Если вы воспользуетесь этим подходом, ваш компилятор должен будет быть проинформирован о том, что все регистры могут быть уничтожены вызовами _InitTask2 или _TaskSwitch. Также необходимо указать, что _Task2Start и вызываемым им функциям должно быть выделено отдельное пространство переменных от основной задачи.

Я не уверен, что вам нужно сказать компилятору, чтобы сделать его счастливым, но я скажу, что совместная двухзадачность может заставить некоторые вещи работать действительно хорошо.

1
ответ дан 6 December 2019 в 05:06
поделиться

Я согласен с ndim - вы можете думать о каждом обработчике прерывания как о чем-то вроде «потока». Иногда все задачи, которые вам нужно выполнить, могут быть обработаны обработчиками прерываний, запускаемых внешними и внутренними событиями - «основной цикл» - это бездействующий цикл, который ничего не делает.

Я не знаю, откуда некоторые комментаторы пришли к выводу, что для PIC18 «нет ОС». Существует довольно много многопоточных библиотек для PIC и «ядер многозадачных операционных систем» для PIC18, многие из которых бесплатны и имеют открытый исходный код. См. PICList: «Специальные методы многозадачности для PIC-микроконтроллеров» .

0
ответ дан 6 December 2019 в 05:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: