2015-07-19 2 views
0

J'utilise microC pour programmer pic16f877a pour faire fonctionner des moteurs et des solénoïdes. J'ai certaines fonctions qui font que les moteurs se déplacent à différents moments de l'espace, par ex. motor1 se déplace pendant 100ms, s'arrête, se déplace à nouveau pendant 100ms etc. pour 4 boucles, motor2 pour 200ms et ainsi de suite. Je veux que ces fonctions démarrent en même temps. Pensez à un robot lorsque vous voulez déplacer sa main droite de haut en bas toutes les 200ms pendant 2 minutes au total et sa main gauche de haut en bas toutes les 400ms pour un total de 2 minutes. Ce processus devrait commencer en même temps.Exécuter plusieurs fonctions simultanément avec pic16f877a en utilisant C

Donc, fondamentalement, je veux commencer quelque chose comme:

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 

Est-il possible de le faire avec micro c pour cette image et comment puis-je appeler 2 ou plusieurs fonctions pour démarrer en même temps?

Répondre

1

Pourquoi pensez-vous avoir besoin de threads? Vous savez exactement quand une opération doit se produire, alors effectuez cette opération exactement à ce moment-là. Tout ce dont vous avez besoin est un système de planification approprié qui vous aide à suivre les opérations. Comparé aux threads, vous n'avez pas le problème de la planification inattendue, probablement une latence plus faible, pas besoin de synchronisation inter-thread.

Tenir compte cette esquisse:

// 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); 

Maintenant, dans une boucle, vous continuez à regarder le premier élément dans la file d'attente et juste sleep() jusqu'au début de la tâche suivante. Bien sûr, cela signifie que vous devez garder ces tâches triées par leur heure de début! Si plusieurs tâches démarrent en même temps, vous devez les exécuter toutes les deux, la seule limite à "en même temps" le temps d'exécution de chaque tâche. Si nécessaire, dans le cadre de la gestion d'une tâche, vous pouvez créer une ou plusieurs autres tâches. En variante, vous pouvez également utiliser un rappel au lieu des seules informations output et value qui supposent que vous souhaitez définir uniquement certaines sorties numériques.

+0

S'il vous plaît vérifier mon modifier l'affichage de mes fonctions et peut-être me aider quel code ajouter au principal pour y parvenir – GiorgosM

+0

Juste quelques commentaires sur votre édition: Tout d'abord, vous avez défait d'autres modifications que d'autres ont faites et qui ont rendu votre question beaucoup plus facile à lire et à comprendre. Ensuite, ce code que vous avez posté est à peine lisible, veuillez le formater et le documenter. Enfin, votre question se résume maintenant à "s'il vous plaît écrivez un code pour moi", à laquelle il n'y a qu'une seule réponse: Non –

+0

Ok, je vais essayer, mais je n'ai pas défait les autres modifications des autres. – GiorgosM

1

Il n'y a pas de solution pour la série PIC16 (il est beaucoup trop petit) mais il y a FreeRTOS, spécialement conçu pour les micro-contrôleurs et il y a un port pour PIC18 (et quelques autres) vérifier la supported device list

Bien que freeRTOS soit "libre" d'obtenir et d'utiliser dans des projets personnels, je vous recommande d'acheter un de leurs livres pour aider à la mise en œuvre. Il y a aussi le API on their site gratuit et le code démo. Il serait plus facile de le comprendre avec le livre (s'il vous plaît noter que je ne suis pas lié à freeRTOS de toute façon, je l'ai utilisé dans des projets avec des contrôleurs Atmel et l'ai trouvé très facile à utiliser). définissez la fonction de contrôle de votre solénoïde), puis vous définissez la priorité, le délai puis le noyau. C'est vraiment simple.

Encore une fois, cela ne fonctionnera pas avec votre PIC16 à puce spécifique, mais si vous pouvez essayer un autre, FreeRTOS est très bien connu et une solution assez facile