util.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. /**
  2. * \file util.h
  3. * \brief Hilfsfunktionen
  4. */
  5. #ifndef MY_UTIL_H_
  6. #define MY_UTIL_H_
  7. #ifndef F_CPU
  8. # warning "F_CPU not defined"
  9. # define F_CPU 3686400
  10. #endif
  11. #include <util/delay.h>
  12. #include <stdint.h>
  13. #include <avr/interrupt.h>
  14. #include <avr/pgmspace.h>
  15. #include <avr/cpufunc.h>
  16. /** \brief Gibt den kleinsten Wert der Parameter a und b zurueck. */
  17. #define min(a, b) ({ \
  18. __typeof__(a) __a = (a); \
  19. __typeof__(b) __b = (b); \
  20. __a < __b ? __a : __b; \
  21. })
  22. /** \brief Gibt den groessten Wert der Parameter a und b zurueck. */
  23. #define max(a, b) ({ \
  24. __typeof__(a) __a = (a); \
  25. __typeof__(b) __b = (b); \
  26. __a > __b ? __a : __b; \
  27. })
  28. /** \brief Begrenzt value zwischen min_val und max_val. */
  29. #define clamp(value, min_val, max_val) \
  30. max(min(value, max_val), min_val)
  31. /** \brief Gibt den Absolutwert des val Parameters zurueck. */
  32. #define abs(val) ({ \
  33. __typeof__(val) __val = (val); \
  34. __val >= 0 ? __val : -__val; \
  35. })
  36. /** \brief Gibt die Groesse eines Arrays in Anzahl der Elemente zurueck. */
  37. #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
  38. /* Progmem pointer annotation. */
  39. #define PROGPTR /* progmem pointer */
  40. /** \brief Memory barrier.
  41. * Schraenkt die Compileroptimierung ueber den Aufrufspunkt
  42. * hinweg ein. */
  43. #define mb() __asm__ __volatile__("" : : : "memory")
  44. #define noinline __attribute__((__noinline__))
  45. typedef _Bool bool;
  46. /** \brief Interrupts global deaktivieren.
  47. *
  48. * Deaktiviert Interrupts und fuehrt eine Memory-Barrier durch.
  49. */
  50. static inline void irq_disable(void)
  51. {
  52. cli();
  53. mb();
  54. }
  55. /** \brief Interrupts global aktivieren.
  56. *
  57. * Fuehrt eine Memory-Barrier durch und aktiviert Interrupts global.
  58. */
  59. static inline void irq_enable(void)
  60. {
  61. mb();
  62. sei();
  63. }
  64. /** \brief Interrupts global deaktivieren und Status zurueckgeben.
  65. *
  66. * Deaktiviert Interrupts und fuehrt eine Memory-Barrier durch.
  67. * Gibt das vorherige SREG zurueck.
  68. */
  69. static inline uint8_t irq_disable_save(void)
  70. {
  71. uint8_t sreg = SREG;
  72. cli();
  73. mb();
  74. return sreg;
  75. }
  76. /** \brief Interrupts wiederherstellen.
  77. *
  78. * Fuehrt eine Memory-Barrier durch und stellt Interrupts wieder her.
  79. */
  80. static inline void irq_restore(uint8_t sreg_flags)
  81. {
  82. mb();
  83. SREG = sreg_flags;
  84. }
  85. #endif /* MY_UTIL_H_ */