AvrIO  1.4.5
Bibliothèque C modulaire pour ATMEL AVR
avrx.h
1 
22 #ifndef _AVRX_H_
23 # define _AVRX_H_
24 
25 # include <avrio/defs.h>
26 
27 __BEGIN_C_DECLS
28  /* ======================================================================== */
40 # if defined(__DOXYGEN__)
41  /* macros ================================================================= */
50 # define AVRX_DECLARE_TASK(task_name, stack_size, priority)
51 
60 # define AVRX_FUNC(task_name)
61 
72 # define AVRX_TASK(task_name, stack_size, priority)
73 
80 # define AVRX_EXTERN_TASK(task_name)
81 
91 # define AVRX_NAKED_FUNC(task_name)
92 
99 # define PID(task_name)
100 
107 # define TCB(task_name)
108 
119 # define xAvrXInitTask (task_name);
120 
130 # define vAvrXRunTask (task_name);
131 
132  /* structures ============================================================= */
139  typedef struct xProcess {} xProcess;
140 
150  typedef struct xTcb {} xTcb;
151 
162  typedef struct xMessage {} xMessage;
163 
170  typedef struct xMessageQueue {} xMessageQueue;
171 
182  typedef struct xTimer {} xTimer;
183 
191  typedef struct xTimerMessage {} xTimerMessage;
192 
193  /* types ================================================================ */
194 
202  typedef xProcess * xPid;
203 
221  typedef xPid xSem;
222 
223 
224 # else /* __DOXYGEN__ not defined */
225  //----------------------------------------------------------------------------
226  typedef struct xProcess {
227 
228  struct xProcess * next;
229  uint8_t flags;
230  uint8_t priority;
231  void * ContextPointer;
232 # ifdef AVRX_SINGLESTEP_ENABLE
233  uint8_t * bp1;
234  uint8_t * bp2;
235 # endif
236  } xProcess;
237 
238  //----------------------------------------------------------------------------
239  typedef xProcess * xPid;
240 
241  //----------------------------------------------------------------------------
242  typedef xPid xSem;
243 
244  //----------------------------------------------------------------------------
245  typedef struct {
246 
247  void * r_stack; // Start of stack (top address-1)
248  void (*start) (void); // Entry point of code
249  xPid pid; // Pointer to Process block
250  uint8_t priority; // Priority of task (0-255)
251  } FLASH const xTcb;
252 
253  //----------------------------------------------------------------------------
254  typedef struct xMessage {
255 
256  struct xMessage *next;
257  xSem semaphore;
258  } xMessage;
259 
260  //----------------------------------------------------------------------------
261  typedef struct xMessageQueue {
262  xMessage * message; // List of messages
263  xPid pid; // List of processes
264  } xMessageQueue;
265 
266 
267  //----------------------------------------------------------------------------
268  typedef struct xTimer {
269  struct xTimer *next;
270  xSem semaphore;
271  uint16_t count;
272  } xTimer;
273 
274  //----------------------------------------------------------------------------
275  typedef struct xTimerMessage {
276  union {
277  struct xMessage mcb;
278  struct xTimer tcb;
279  } u;
280  struct xMessageQueue *queue;
281  } xTimerMessage;
282 
283 # endif /* __DOXYGEN__ not defined */
284 
285  /* internal public functions ============================================== */
298  void vAvrXStart (void);
299 
307  void vAvrXResume (xPid xP);
308 
316  void vAvrXSuspend (xPid xP);
317 
326  void vAvrXYield(void);
327 
336  void vAvrXTaskExit (void);
337 
345  void vAvrXTerminate (xPid xP);
346 
353  void vAvrXWaitTask (xPid xP);
354 
361  xSem xAvrXTestPid (xPid xP);
362 
369  uint8_t xAvrXPriority (xPid xP);
370 
378  uint8_t xAvrXChangePriority (xPid xP, uint8_t xNewPriority);
379 
385  xPid pxAvrXSelf (void);
386 
393  void * pvAvrXSetKernelStack (void * pNewStack);
394 
403  void vAvrXIntReschedule(void);
404 
414  xPid xAvrXInitTcb (xTcb * pxTcb);
415 
424  void vAvrXRunTcb (xTcb * pxTcb);
425 
438  void vAvrXHalt (void);
439 
447  uint8_t xAvrXSingleStep (xPid xP);
448 
456  uint8_t xAvrXSingleStepNext (xPid xP);
457 
482  /* constants ============================================================ */
486 # define AVRX_PEND ((xSem)0)
487 
491 # define AVRX_DONE ((xSem)1)
492 
496 # define AVRX_WAIT ((xSem)2)
497 
498  /* internal public functions ============================================ */
509  void vAvrXSetSemaphore (xSem * pxSem);
510 
519  void vAvrXWaitSemaphore (xSem * pxSem);
520 
527  xSem xAvrXTestSemaphore (xSem * pxSem);
528 
534  void vAvrXResetSemaphore (xSem * pxSem);
535 
541  void vAvrXResetObjectSemaphore (xSem * pxSem);
542 
551  void vAvrXIntSetSemaphore (xSem * pxSem);
552 
562  xSem xAvrXIntTestSemaphore (xSem * pxSem);
563 
575  /* internal public functions ============================================ */
576 
584  void vAvrXSendMessage (xMessageQueue * pxQueue, xMessage * pxMessage);
585 
595  void vAvrXIntSendMessage (xMessageQueue * pxQueue, xMessage * pxMessage);
596 
604 
613 
622  void vAvrXAckMessage (xMessage * pxMessage);
623 
629  void vAvrXWaitMessageAck (xMessage * pxMessage);
630 
638  xSem xAvrXTestMessageAck (xMessage * pxMessage);
639 
655  /* internal public functions ============================================ */
665  void vAvrXStartTimer (xTimer * pxTimer, uint16_t xTicksWait);
666 
673  xTimer * pxAvrXCancelTimer (xTimer * pxTimer);
674 
681  void vAvrXWaitTimer (xTimer * pxTimer);
682 
694  void vAvrXDelay (xTimer * pxTimer, uint16_t xTicksWait);
695 
702  xSem xAvrXTestTimer (xTimer * pxTimer);
703 
716  void vAvrXStartTimerMessage ( xTimerMessage * pxTimer,
717  uint16_t xTicksWait, xMessageQueue * pxQueue);
718 
729  xMessageQueue * pxQueue);
741  /* internal public functions ============================================ */
742 
749  uint8_t ucAvrXReadEEProm (const uint8_t * pucAddress);
750 
757  uint16_t usAvrXReadEEPromWord (const uint16_t * pusAddress);
758 
765  void vAvrXWriteEEProm (uint8_t * pucAddress, uint8_t ucByte);
774 # if !defined(__DOXYGEN__)
775  /*
776  * __DOXYGEN__ not defined
777  * Partie ne devant pas être documentée.
778  * =========================================================================
779  */
780 # define MINCONTEXT 35 // 32 registers, return address and SREG
781 
782 # define AVRX_NAKED_FUNC(function) void function(void) NAKED;\
783  void function(void)
784 
785 # define AVRX_FUNC(function) void function(void) CTASK;\
786  void function(void)
787 
788 # define AVRX_DECLARE_TASK(task_name, stack_size, priority) \
789  char task_name ## Stk [stack_size + MINCONTEXT] ; \
790  AVRX_FUNC(task_name); \
791  xProcess task_name ## Pid; \
792  xTcb task_name ## Tcb = \
793  { \
794  &task_name##Stk[sizeof(task_name##Stk)-1] , \
795  task_name, \
796  &task_name##Pid, \
797  priority \
798  }
799 
800 # define AVRX_TASK(task_name, stack_size, priority) \
801  AVRX_DECLARE_TASK(task_name, stack_size, priority); \
802  AVRX_FUNC(task_name)
803 
804 # define AVRX_EXTERN_TASK(task_name) \
805  AVRX_FUNC(task_name); \
806  extern xTcb task_name##Tcb; \
807  extern xProcess task_name##Pid
808 
809 # define PID(task_name) (&task_name##Pid)
810 
811 # define TCB(task_name) (&task_name##Tcb)
812 
813 # define xAvrXInitTask(task_name) xAvrXInitTcb(TCB(task_name))
814 
815 # define vAvrXRunTask(task_name) vAvrXRunTcb(TCB(task_name))
816 
817 # endif /* __DOXYGEN__ not defined */
818 
819  /* ======================================================================== */
820 __END_C_DECLS
821 #endif /* _AVRX_H_ not defined */
Bloc de contrôle de tâche.
Definition: avrx.h:150
void vAvrXWaitTask(xPid xP)
Synchronisation bloquante avec une autre tâche.
void vAvrXYield(void)
Retire le processeur à la tâche en cours.
xMessage * pxAvrXWaitMessage(xMessageQueue *pxQueue)
Attente de réception d&#39;un message.
uint8_t xAvrXChangePriority(xPid xP, uint8_t xNewPriority)
Modifie la priorité d&#39;une tâche.
void vAvrXResetSemaphore(xSem *pxSem)
Force un sémaphore à passer à l&#39;état AVRX_PEND.
void vAvrXWaitTimer(xTimer *pxTimer)
Attente de l&#39;expiration d&#39;un timer.
xSem xAvrXTestMessageAck(xMessage *pxMessage)
Teste si un accusé réception a été reçue.
xSem xAvrXTestSemaphore(xSem *pxSem)
Renvoie l&#39;état d&#39;un sémaphore.
void vAvrXTaskExit(void)
Tue la tâche en cours.
xSem xAvrXTestPid(xPid xP)
Renvoie l&#39;état d&#39;une tâche.
struct xMessage xMessage
Message.
xMessage * pxAvrXRecvMessage(xMessageQueue *pxQueue)
Renvoie le premier message d&#39;une file.
void vAvrXDelay(xTimer *pxTimer, uint16_t xTicksWait)
Version bloquante de vAvrXStartTimer()
void vAvrXSetSemaphore(xSem *pxSem)
Libère un sémaphore si il n&#39;est pas déjà libre.
struct xProcess xProcess
Un processus.
uint16_t usAvrXReadEEPromWord(const uint16_t *pusAddress)
Lecture d&#39;un mot en EEPROM.
uint8_t xAvrXPriority(xPid xP)
Renvoie la priorité courante d&#39;une tâche.
xTimer * pxAvrXCancelTimer(xTimer *pxTimer)
Retire un timer de la file des timers.
uint8_t xAvrXSingleStepNext(xPid xP)
Avance d&#39;un pas une tâche passée en mode «pas à pas»
void vAvrXWaitMessageAck(xMessage *pxMessage)
Attente d&#39;un accusé réception d&#39;une file de message.
xSem xAvrXIntTestSemaphore(xSem *pxSem)
Renvoie l&#39;état d&#39;un sémaphore (Mode noyau)
void vAvrXResume(xPid xP)
Reprend l&#39;exécution d&#39;un processus.
void * pvAvrXSetKernelStack(void *pNewStack)
Modifie la pile AvrX.
xPid xSem
Compteurs permettant de gérer l&#39;accès à des ressources partagées.
Definition: avrx.h:221
void vAvrXAckMessage(xMessage *pxMessage)
Envoie un accusé réception à travers une file de message.
File de messages.
Definition: avrx.h:170
void vAvrXRunTcb(xTcb *pxTcb)
Démarre une tâche.
void vAvrXHalt(void)
Arrête le processeur (erreur seulement)
Un processus.
Definition: avrx.h:139
uint8_t ucAvrXReadEEProm(const uint8_t *pucAddress)
Lecture d&#39;un octet en EEPROM.
Timer Message.
Definition: avrx.h:191
void vAvrXStart(void)
void vAvrXStartTimerMessage(xTimerMessage *pxTimer, uint16_t xTicksWait, xMessageQueue *pxQueue)
Ajoute un timer un timer qui envoie un message à son expiration dans la file des timers et le démarre...
void vAvrXWaitSemaphore(xSem *pxSem)
Mets une tâche en attente de libération d&#39;un sémaphore.
void vAvrXIntSendMessage(xMessageQueue *pxQueue, xMessage *pxMessage)
Envoie un message dans une file (Mode noyau)
struct xTimer xTimer
Timer.
xMessage * pxAvrXCancelTimerMessage(xTimerMessage *pxTimer, xMessageQueue *pxQueue)
Retire un timer démarré avec vAvrXStartTimerMessage() de la file des timers.
struct xTcb xTcb
Bloc de contrôle de tâche.
struct xMessageQueue xMessageQueue
File de messages.
xSem xAvrXTestTimer(xTimer *pxTimer)
Teste l&#39;état d&#39;un timer.
uint8_t xAvrXSingleStep(xPid xP)
Passe une tâche en mode «pas à pas»
void vAvrXSuspend(xPid xP)
Suspend l&#39;exécution d&#39;une tâche.
void vAvrXSendMessage(xMessageQueue *pxQueue, xMessage *pxMessage)
Envoie un message dans une file.
void vAvrXTerminate(xPid xP)
Tue une tâche.
Message.
Definition: avrx.h:162
xPid pxAvrXSelf(void)
Renvoie le PID de la tâche en cours.
void vAvrXStartTimer(xTimer *pxTimer, uint16_t xTicksWait)
Ajoute un timer dans la file des timers et le démarre.
struct xTimerMessage xTimerMessage
Timer Message.
void vAvrXIntReschedule(void)
Permet une organisation collaborative au sein de l&#39;organisation préemptive par priorité.
Timer.
Definition: avrx.h:182
void vAvrXWriteEEProm(uint8_t *pucAddress, uint8_t ucByte)
Ecriture d&#39;un octet en EEPROM.
void vAvrXResetObjectSemaphore(xSem *pxSem)
Force un sémaphore d&#39;un objet à passer à l&#39;état AVRX_PEND.
void vAvrXIntSetSemaphore(xSem *pxSem)
Libère un sémaphore si il n&#39;est pas déjà libre (Mode noyau)
xPid xAvrXInitTcb(xTcb *pxTcb)
Initialise une tâche.
xProcess * xPid
Identifiant d&#39;une tâche.
Definition: avrx.h:202