2015-07-19 4 views
0

Я использую microC для программирования pic16f877a для управления двигателями и соленоидами. У меня есть некоторые функции, делающие двигатели движущимися в разные промежутки времени, например. мотор1 перемещается на 100 мс, останавливается, снова перемещается на 100 мс и т. д. на 4 петли, двигатель2 на 200 мс и т. д. Я хочу, чтобы эти функции запускались одновременно.Выполнять несколько функций одновременно с pic16f877a с помощью C

Подумайте о роботе, когда вы хотите переместить его правую руку вверх и вниз каждые 200 мс в течение 2 минут, а левая рука - вверх и вниз каждые 400 мс, в течение всего 2 минут. Этот процесс должен начаться в одно и то же время.

Поэтому в основном я хочу, чтобы начать что-то вроде:

start: 
solenoid1 runs functionQuarter(moves up-down every x time) total like 2 mins 
solenoid2 runs functionHalf(moves up-down every 2x time) total like 2 mins 
stop 

Можно ли сделать это с микро-с для этого ПОС и как я могу назвать 2 или более функций, чтобы начать в то же время?

ответ

1

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

Рассмотрим этот эскиз:

// this task structure says at what time to set 
// an output to a certain value 
struct task { 
    time_type when; 
    output_type output; 
    value_type value; 
}; 

struct task_queue { 
    struct task** tasks; 
    size_t count; 
}; 
void task_queue_push(struct task_queue* q, struct task* t); 
struct task* task_queue_front(struct task_queue* q); 
struct task* task_queue_pop(struct task_queue* q); 

Теперь в цикле, вы продолжаете смотреть на первый элемент в очереди и только sleep() до начала следующей задачи. Конечно, это означает, что вам нужно сохранить эти задачи отсортированными по времени их начала! Если одновременно запускается несколько задач, вам необходимо запустить их оба, единственное ограничение на «одновременно» время выполнения каждой задачи. При необходимости в рамках одной задачи вы можете создать одну или несколько других задач. В качестве варианта вы также можете использовать обратный вызов вместо данных output и value, предполагающих, что вы хотите установить только некоторые цифровые выходы.

+0

Пожалуйста, проверьте мой выбор размещения своих функций и, возможно, помочь мне какой код добавить к главному для достижения этого – GiorgosM

+0

Всего несколько комментариев по вашему правлению: во-первых, вы расстегнули некоторые другие изменения, которые сделали другие, и которые сделали ваш вопрос намного легче читать и понимать. Затем этот код, который вы опубликовали, едва читается, пожалуйста, отформатируйте и запишите это. Наконец, ваш вопрос теперь сводится к «пожалуйста, напишите мне какой-то код», на который есть только один ответ: № –

+0

Хорошо, я постараюсь, но я не отменил другие изменения других. – GiorgosM

1

Существует не решение для серии PIC16 (он слишком мал), но есть Freertos, сделанный специально для микроконтроллеров и есть порт для PIC18 (и некоторых других) проверить supported device list

Хотя freeRTOS является «бесплатным» для получения и использования в личных проектах, я бы порекомендовал вам приобрести одну из своих книг, чтобы помочь в реализации. Существует бесплатный API on their site и демо-код. Было бы проще понять это с помощью книги (обратите внимание, что я вообще не привязан к freeRTOS, я использовал ее в проектах с контроллерами atmel и нашел ее очень простой в использовании)

с помощью freeRTOS вы создаете задачу (вы определите функцию управления соленоидом), а затем установите приоритет, затем запустите ядро. На самом деле это очень просто.

Опять же, это не будет работать с вашей конкретной микросхемы PIC16, но если вы можете попробовать еще, Freertos очень хорошо известна и довольно простое решение

Смежные вопросы