Précédent   Forum du club des développeurs et IT Pro > Autres langages > Assembleur > Programmation d'OS
Programmation d'OS Programmation de systèmes d'exploitation
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 07/10/2010, 10h43   #1
boboss123
Membre éclairé
 
Inscription : septembre 2009
Messages : 1 005
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 1 005
Points : 352
Points : 352
Par défaut Comment faire du multitâche coopératif ?

bonjour,

Je programme sur un µControlleur (archi MIPS) et j'ai un petit problème pour gérer plusieurs taches.


voici le code C simplifié de mon programme :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 
// programme principal
int main(void){
 
	init();
 
	while(1){
		TCP_Task();		// gestion d'envoi de packets TCP
		TELNET_Task();	// gestion du TELNET (dépend de TCP)
	}
 
}
 
// Task TELNET
void TELNET_Task(void){
 
	static int sm = 0; // pour la machine d'etat
 
	switch (sm){
 
		case 0:
 
			// TCPPutIsReady() : renvoi l'espace disponible dans le buffer TCP
			if (TCPPutIsReady() < strlen(str1)){
				break
			}
 
			TCPPut(str1);
			sm++;
 
		case 1:
			if (TCPPutIsReady() < strlen(str2)){
				break
			}
			TCPPut(str2);
			sm++;
 
		// ...
 
	}
}
Mon programme sert à gérer une communication TELNET. Avant chaque envoi de données, je dois vérifier que le buffer d'émission est disponible avec TCPPutIsReady() et si ce n'est pas le cas, je dois retourner dans le main pour que TCP_Task() s'occupe de vider le buffer (envoi des données TCP qui n'ont pas encore été traitées)


Mon problème est que je trouve super lourd de faire une machine d'état pour la gestion du TELNET. J'aimerais donc pouvoir créer un thread pour TELNET_Task() de façon à pouvoir faire :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
// Task TELNET
void TELNET_Task(void){
	TCPPutCustom(str1);
	TCPPutCustom(str2);
	TCPPutCustom(str3);
	// ...
}
 
// gestion de l'envoi des données
void TCPPutCustom(unsigned char str){
 
	while(TCPPutIsReady() < strlen(str)){
		// faudrait quitter la tache ici
		// => revenir dans le main pour que TCP_Task() soit éxécuté puis revenir ici
	}
	TCPPut(str);
}

Pouvez-vous me dire exactement comment je dois gérer tout ça. J'ai mis mon post dans la section assembleur et non pas langage C car il me semble que pour faire ça je suis obligé de passer par de l'assembleur (car il me semble qu'il faut manipuler la pile).
Je ne suis pas un grand adepte de l'assembleur, donc moins il y en aura dans mon code, mieux ça sera


Remarque : pour le moment mon programme ne gère qu'un socket TELNET mais je prévois d'en gérer plusieurs (peut-être que ça peut avoir une influence sur la méthode à utiliser)
boboss123 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 13h47.


 
 
 
 
Partenaires

Hébergement Web