Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Sep 13th, 2012  |  syntax: None  |  size: 2.96 KB  |  hits: 13  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. # Peripherie
  2. ## Klassifikation von Peripherie Komponenten
  3.  
  4. - Intern oder on-chip Peripherie
  5.     - Befinden sich neben Prozessor und Speicher im Mikrocontroller Chip
  6. - Externe Peripherie
  7.     - Befindet sich außerhalb des Mikrocontroller Chips
  8.  
  9. ## Steuer und Status Register
  10.  
  11. - Ein eingebetteter Prozessor interagiert mit Peripherie Komponenten mittels Steuer und Status Register.
  12. - Diese Register sind Teil der Peripherie Hardware. Ihre Adresse, Größe und individuelle Bedeutung sind Charakteristiken der Peripherie.
  13. - Zum Beispiel sind die Steuer (Control) Register einer Seriellen Schnittstelle sehr unterschiedlich von denen eines Timers.
  14.  
  15. ## Anbindung von Peripherie
  16. ### I/O Bereich
  17.  
  18. - erfordert besondere Befehle für den Zugriff
  19. - Peripherie benötigt keinen Speicherbereich (Vorteil bei begrenztem Adressraum z.B. 8-Bit)
  20. - Beispiel: 8085
  21.  
  22. ### Prozessor Speicher Bereich
  23.  
  24. - Memory-Mapped Peripherie
  25. - Es ist einfacher damit zu arbeiten, da die Steuer und Status Register wie gewöhnliche Variablen im C-Code gehandhabt werden können.
  26. - Beispiel
  27.  
  28. ``` C
  29. #define GPIO_BASE_ADDR 0xE0028000
  30. #define IOPIN0        (*(volatile unsigned long *)(GPIO_BASE_ADDR + 0x00))
  31. ```
  32.  
  33. Normalerweise werden Peripherie Register als **unsigned** Typen definiert, da die Interpretation des Inhaltes für gewöhnlich auf Bit-Ebene stattfindet.
  34.  
  35.  
  36. ## Bit Manipulations
  37.  
  38. ### set n-th bit
  39.     x |= (1 << (n))
  40.  
  41. ### clear n-th bit
  42.     x &= ~(1 << (n))
  43.  
  44. ### test bit
  45.     (x & (1 << (y)) ? 1 : 0)
  46.  
  47. ### toggle n-th bit
  48.     x ^= (1 << (n))
  49.  
  50. ## Bit Felder
  51. ``` C
  52. struct {
  53.     uint8_t bit0 :1;
  54.     uint8_t bit1 :1;
  55.     uint8_t bit2 :1;
  56.     uint8_t bit3 :1;
  57.     uint8_t nibble :4;
  58. } foo;
  59. ```
  60. **Theoretisch** können Bits innerhalb eines Bit-Feldes individuell gesetzt, getestet, gelöscht und umgeschaltet werden, ohne die anderen Bits zu beeinflussen.
  61. **Theoretisch weil** in vielen Fällen solche Operationen nicht Thread-Save sind. Und abhängig von der Compiler Implementierung teilweise sehr ineffizienten Code erzeugen. Des weiteren sind Bitfelder nicht portierbar, die Bits Verteilung ist stark Compiler abhängig und solche Daten können in unterschiedlichen Systemen nicht identisch interpretiert werden. (Bemerkung: ähnlich dem Endianess Problem)
  62.  
  63. ### Probleme
  64. - nicht Thread-Save
  65. - compileranhängig
  66. - nicht portierbar
  67.  
  68.  
  69. ## Struktur Überlagerung
  70. - In eingebetteten Systemen mit Memory-Mapped I/O Peripherie Komponenten kann es sinnvoll sein eine C Struktur über die Peripherie Steuer und Status Register zu legen.
  71. - Damit kann mit einem Pointer auf die Struktur sehr anschaulich auf die Register der Peripherie zugegriffen werden.
  72. - Der Code ist sehr gut lesbar.
  73. - Der Compiler berechnet die Adress-Offsets beim Bilden automatisch.
  74.  
  75. ``` C
  76. typedef struct {
  77.     uint16_t count;      /* Offset 0 */
  78.     uint16_t maxCount;   /* Offset 2 */
  79.     uint16_t _reserved1; /* Offset 4 */
  80.     uint16_t control;    /* Offset 6 */
  81. } volatile timer_t
  82. ...
  83. timer_t* pTimer = (timer_t *)(0xABCD0123);
  84. ...
  85. if(pTimer->control & 0x08) {
  86.     // do something
  87. }
  88. ```